Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DIV und MOD (https://www.delphipraxis.net/36772-div-und-mod.html)

icke 25. Dez 2004 14:04


DIV und MOD
 
Hallo
Ich kann die DIV und MOD Befehle nicht verwenden! Ich hab Delphi 3
Code:
restmin:=FloatToStr(Gesamt)div 60;
restsec:=FloatToStr(Gesamt)mod 60;
Fehler: Inkompatible Typen: 'String' und 'Integer'.

Danke im Vorraus

mirage228 25. Dez 2004 14:09

Re: DIV und MOD
 
Hi,

natürlich kannst Du das nicht!

Der Ausdruck:
Delphi-Quellcode:
FloatToStr(Gesamt)
gibt einen String zurück. Auf diesen kannst Du den Divisions bzw. den Modulo Operator nicht anwenden.

Du müsstest das z.B. so schreiben
Delphi-Quellcode:
FloatToStr(Gesamt div 60) // oder mod 60
mfG
mirage228

Dax 25. Dez 2004 14:10

Re: DIV und MOD
 
Erstens: Delphi-Referenz durchsuchendiv und Delphi-Referenz durchsuchenmod sind Integer-Befehle, können also nur mit Integer-TYpen etwas anfange.

Zweitens: Delphi-Referenz durchsuchenFloatToStr gibt einen String zurück, mit Strings kannst du nicht rechen.

Drittens: In der OH sind nette Beispiele, und kuck mal nach Delphi-Referenz durchsuchenDivMod ;)

Sharky 25. Dez 2004 15:04

Re: DIV und MOD
 
Zitat:

Zitat von Dax
..., und kuck mal nach Delphi-Referenz durchsuchenDivMod ;)

Wobei bei Delphi-Referenz durchsuchenDivMod auf die Grenzen zu achten sind (16Bit Integer);

Dax 25. Dez 2004 15:14

Re: DIV und MOD
 
Alternativ das hier benutzen ;)

Delphi-Quellcode:
procedure DivModEx(Dividend, Divisor: Integer; var Result, Remainder: Integer); overload;
begin
  Result := Dividend div Divisor;
  Remainder := Dividend mod Divisor;
end;

procedure DivModEx(Dividend, Divisor: Extended; var Result, Remainder: Extended); overload;
var Temp: Extended;
begin
  Temp := Dividend / Divisor;
  Result := Int(Temp);
  Remainder := Frac(Temp) * Divisor;
end;

icke 25. Dez 2004 18:22

Re: DIV und MOD
 
1. Wo finde ich die Hilfe DivMod??
2. ich habe die Variabeln 'restmin' und 'restsec' auf integer gesetzt.

--> Fehler: Inkompatible Typen: 'String' und 'Integer'

Kann mir jemand auf normalem Deutsch (-> kein Fachchinesisch) erklären, warum es nicht funktioniert und den Weg zur Lösung bitte erklären??

Danke

MathiasSimmack 25. Dez 2004 18:29

Re: DIV und MOD
 
Zitat:

Zitat von icke
1. Wo finde ich die Hilfe DivMod??

Den Befehl findest du evtl. in der Delphi-Hilfe. Aber ob schon bei Delphi 3?

Zitat:

2. ich habe die Variabeln 'restmin' und 'restsec' auf integer gesetzt.

--> Fehler: Inkompatible Typen: 'String' und 'Integer'

Kann mir jemand auf normalem Deutsch (-> kein Fachchinesisch) erklären, warum es nicht funktioniert und den Weg zur Lösung bitte erklären??
Hat mirage doch weiter oben schon getan.

Sharky 25. Dez 2004 18:36

Re: DIV und MOD
 
Mirage hat es doch eigentlich gut erklärt. Aber ich versuche es nocheinmal auf einem anderen Weg ;-)

Delphi-Quellcode:
var
  str_restmin : String;
  str_restsec : String;
  int_restmin : Integer;
  int_restsec : Integer;
begin
  str_restmin := FloatToStr(Gesamt);
  int_restmin := str_restmin DIV 60; // Diese beiden Zeilen entsprechen: restmin := FloatToStr(gesamt) DIV 60

  str_restsec := FloatToStr(Gesamt);
  int_restsec := str_restmin MOD 60;

end;
Dies ist genau das was Du in deinem ersten Posting geschrieben hast. Nur das ich noch Hilfsvariabeln einfüge.
Wie Du siehst liefert FloatToStr() als Ergebniss einen String. Und diesen Versuchst Du zu dividieren was natürlich nicht gehen kann!

icke 25. Dez 2004 18:37

Re: DIV und MOD
 
Danke für deine Antwort

Ich habe jetzt diesen Ausdruck eingegeben!

Code:
restmin:=FloatToStr(Gesamt div 60);
restsec:=FloatToStr(Gesamt mod 60);
Der Fehler: Operator ist auf diesen Operatortyp nicht anwendbar

Die Hilfe von Delphi 3 sagt:
Zitat:

st der Typ eines Operanden ein Teilbereich eines ordinalen Typs, wird der Operand behandelt, als ob er von einem ordinalen Typ wäre.
Sind beide Operanden der Operatoren +, -, *, div oder mod von einem Integer-Typ, ist der Typ des Ergebnisses der gemeinsame Typ der beiden Operanden. Eine Definition gemeinsamer Typen finden unter Gemeinsamer Typen.
Ist der Operand des positiven oder negativen Vorzeichens von einem Integer-Typ, ist das Ergebnis vom selben Integer-Typ. Ist der Operator von einem Real-Typ, ist der Ergebnistyp Extended.

Der Wert von X/Y ist unabhängig vom Typ der Operanden immer vom Typ Extended. Falls Y den Wert 0 hat, tritt ein Laufzeitfehler auf.
Der Wert von I div J ist der abgerundete mathematische Quotient von I/J. Falls J den Wert 0 hat, tritt ein Laufzeitfehler auf.
Der Operator mod gibt den Rest zurück, der sich aus der Division der beiden Operanden ergibt:

I mod J = I - (I div J) * J

Das Ergebnis von mod hat dasselbe Vorzeichen wie I. Hat J den Wert 0, tritt ein Laufzeitfehler auf.

Sharky 25. Dez 2004 18:41

Re: DIV und MOD
 
Zitat:

Zitat von icke
...Der Fehler: Operator ist auf diesen Operatortyp nicht anwendbar...

Wie hast Du denn die Variable gesamt deklariert?

icke 25. Dez 2004 18:42

Re: DIV und MOD
 
die Variable Gesamt ist real

Chegga 25. Dez 2004 18:43

Re: DIV und MOD
 
Hi,

dann musst du statt div, / schreiben.

MfG Marc

Sharky 25. Dez 2004 18:44

Re: DIV und MOD
 
Zitat:

Zitat von icke
die Variable Gesamt ist real

Die Variable muss ein Integer Typ sein. Mit Gleitkommavariablen kann DIV und MOD nicht arbeiten.

icke 25. Dez 2004 18:45

Re: DIV und MOD
 
und wenn ich den Ausdruck div behalten will? wie muss die Variable Gesamt dann definiert werden?

Chegga 25. Dez 2004 18:47

Re: DIV und MOD
 
Wenn du div behalten willst,
musst du Integer vereinbaren!
Merke:

Code:
real: /           
integer: div
// +, -, und * sind bei beiden einheitlich!
MfG Marc

P.S.: Soll ich ein kleines Tutorial darüber schreiben?

icke 25. Dez 2004 18:51

Re: DIV und MOD
 
jetzt gibt er weiter oben den Fehler aus...
Ich geb euch mal den gesamten Quelltext...damit ihr euch ein Bild davon machen könnt...

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Edit4: TEdit;
    Edit5: TEdit;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Beenden1: TMenuItem;
    Berechnen1: TMenuItem;
    Zwischenzeit1: TMenuItem;
    Hilfe1: TMenuItem;
    Info1: TMenuItem;
    procedure Beenden1Click(Sender: TObject);
    procedure Zwischenzeit1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  gesamt: real;
  teiler,endzeitM, endzeitS, Strecke, Zeit, restmin, restsec: integer;

implementation

{$R *.DFM}

procedure TForm1.Beenden1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Zwischenzeit1Click(Sender: TObject);
begin
endzeitm:=StrToInt(Edit1.Text);
endzeits:=StrToInt(Edit2.Text);
Strecke:=StrToInt(Edit3.Text);
Zeit:=(endzeitm*60)+endzeits;
Gesamt:=(Zeit/10000)*Strecke;

restmin:=FloatToStr(Gesamt div 60);
restsec:=FloatToStr(Gesamt mod 60);
end;

end.
So, es geht um ein Programm, welches die Zeit berechnet. Die Ausgabe befehle hab ich noch nicht...die kommen erst noch

Chegga 25. Dez 2004 19:02

Re: DIV und MOD
 
Hi,

Code:
...procedure TForm1.Zwischenzeit1Click(Sender: TObject);
begin
endzeitm:=StrToInt(Edit1.Text);
endzeits:=StrToInt(Edit2.Text);
Strecke:=StrToInt(Edit3.Text);
Zeit:=(endzeitm*60)+endzeits;
Gesamt:=(Zeit/10000)*Strecke;

restmin:=IntToStr(Gesamt / 60);
restsec:=IntToStr(Gesamt mod 60);
end;

end.
Ersetze div durch / :!:
Warum? Betrachte den vorherigen Beitrag von mir. :wink:

MfG Marc

P.S.: Versuchs mal mit IntToStr...

icke 25. Dez 2004 19:10

Re: DIV und MOD
 
nein, geht nicht immer noch inkompatible typen...

Sharky 26. Dez 2004 06:46

Re: DIV und MOD
 
Zitat:

Zitat von icke
nein, geht nicht immer noch inkompatible typen...

Hai icke,
irgendwie habe ich das Gefühl das Du die ganzen Antworten überhaupt nicht gelesen hast.
Es ist doch wirklich alles erklärt worden. Aber Du setzt es in keiner Weise in deinem Code oben um.
Warum nicht :?:

The-X 26. Dez 2004 08:26

Re: DIV und MOD
 
Oder aber man nutzt folgende Funktionen :mrgreen:
um DIV & MOD auch mit Real-Typen anwenden zu können:

Delphi-Quellcode:
function Real_Div(AZahl1,AZahl2:Extended):Integer;
begin
  Result := Trunc(AZahl1 / AZahl2);
end;
^^ Ersatz für DIV

Delphi-Quellcode:
function Real_Mod(AZahl1,AZahl2:Extended):Extended;
begin
  Result := AZahl1 - Trunc(AZahl1 / AZahl2) * AZahl2;
end;
^^ Ersatz für MOD

MarkusB 26. Dez 2004 08:33

Re: DIV und MOD
 
Moin icke!

Gratuliere! :-D. Du hast verschiedene Datentypen durcheinander gebracht.

Zitat:

Zitat von icke
Code:
...
var
  gesamt: real;
  restmin, restsec: integer;

...

restmin:=FloatToStr(Gesamt div 60);
restsec:=FloatToStr(Gesamt mod 60);
end;

...

Hier versuchst du das Resultat der mod und div (die eine Integer-Zahl zurückliefern) mit Hilfe der Funktion FloatToStr (die eigentlich eine Gleitkommazahl erwartet) in Strings zu umwandeln und danach in Integer-Variable zu packen. Das kann nicht funktionieren!

Versuch etwa so:

Delphi-Quellcode:
var
  restmin, restsec, gesamt: integer;

  ...

  restmin:= Gesamt div 60; // das ist korrekt
  restsec:= Gesamt mod 60; // und das auch

  ...
Wenn du noch die restmin und restsec in Form eines Strings ausgeben möchtest, musst du noch String-Variablen definieren. Dann geht auch die Funktion „IntToStr“ (bzw. FloatToStr - das wäre unsauber):

Delphi-Quellcode:
var
  restmin , restsec, gesamt: integer;
  restmin_char , restsec_char: string;

  ...

  restmin:= Gesamt div 60;
  restsec:= Gesamt mod 60;

  restmin_char := IntToStr(restmin);
  restsec_char := IntToStr(restsec);

  ...
oder gleich so:

Delphi-Quellcode:
var
  gesamt: integer;
  restmin_char , restsec_char: string;

  ...

  restmin_char := IntToStr(Gesamt div 60;);
  restsec_char := IntToStr(Gesamt mod 60);

  ...
Viele Grüße
Markus
:gruebel:

MathiasSimmack 26. Dez 2004 09:20

Re: DIV und MOD
 
Hoffentlich machst du dir die Mühe nicht umsonst, Markus. Die richtigen Antworten wurden mehr oder weniger alle schon gegeben. Nur icke liest das einfach nicht und präsentiert stattdessen immer wieder seine Fehlermeldungen. :roll:

MarkusB 26. Dez 2004 11:55

Re: DIV und MOD
 
Moin MathiasSimmack !

Ich hoffe, dass mein Posting ein bisschen Klarheit im Kopf des armen icke schafft. Nachdem ich alle Postings gelesen habe, bin ich zum Schluss gekommen, dass das einzige was geklärt wurde ist, dass man mit Strings nicht rechnen kann und mod und div Integers erwarten. Alles andere ist, meiner Meinung nach, entweder unnötig kompliziert, irreführend oder einfach falsch.

Ein Beispiel:

Geklärt würde:
Zitat:

Erstens: Delphi-Referenz durchsuchendiv und Delphi-Referenz durchsuchenmod sind Integer-Befehle, können also nur mit Integer-TYpen etwas anfange.

Zweitens: Delphi-Referenz durchsuchenFloatToStr gibt einen String zurück, mit Strings kannst du nicht rechen.
... und danach kommt so was:

Zitat:

Delphi-Quellcode:
var
  str_restmin : String;
  str_restsec : String;
  int_restmin : Integer;
  int_restsec : Integer;
begin
  str_restmin := FloatToStr(Gesamt);
  int_restmin := str_restmin DIV 60; // Diese beiden Zeilen entsprechen: restmin := FloatToStr(gesamt) DIV 60 

  str_restsec := FloatToStr(Gesamt);
  int_restsec := str_restmin MOD 60;

end;

... einfach zum Heulen.

Noch ein Beispiel:
Zitat:

Delphi-Quellcode:
function Real_Div(AZahl1,AZahl2:Extended):Integer;
begin
  Result := Trunc(AZahl1 / AZahl2);
end
Delphi-Quellcode:
function Real_Mod(AZahl1,AZahl2:Extended):Extended;
begin
  Result := AZahl1 - Trunc(AZahl1 / AZahl2) * AZahl2;
end

... dazu kann ich nur sagen: „Warum einfach, wenn es auch kompliziert geht?“

Viele Grüße
Markus
:gruebel:

icke 26. Dez 2004 16:02

Re: DIV und MOD
 
Hallo
1. Ich habe mir die Antworten alle Durchgelesen.
2. Jeder schreibt irgend etwas anderes und gibt neue Tipps und eine "bessere Lösung"
3. Die Vorschläge habe ich im Quellcode geändert. Da die gleiche Fehlermeldung wie zuvor gekommen ist, bin ich zu dem Schluss gekommen, dass meine Version nicht schlechter sein kann.
4. Niemand bis auf MarkusB der mir endlich gesagt hat, dass der Ausdruck >restmin:= Gesamt div 60;< auch funktioniert!

Gruß icke

PS: ICh werde nun die anderen Vorschläge ausprobieren


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz