[Wahrscheinlich] Falsche Debugger-Meldung

morph3uz

Grünschnabel
Hey Leute,
Ich hab hier ein kurioses Problem.
Ich bin dabei ein kleines Programm zu schreiben, in Embarcadero Delphi 2010.
Dazu muss ich String-Passagen in Integer umwandeln, dazu hab ich mir eine Prozedur geschrieben die wie folgt aussieht:

Code:
function get_digit(term :string; var i :string) :integer;
var temp :string;
begin
  temp := '';
  while isdigit(term[i]) and (i < length(term)-1) do begin
    temp := temp + term[i];
    end;
  get_digit := strtoint(temp);
end;

Wenn ich nun compiliere meldet der Debugger immer
Code:
[DCC Error] Übung1.pas(65): E2010 Incompatible types: 'Integer' and 'string'

und zwar zu den Stellen:
Code:
isdigit(term[i])
length(term)-1
term[i]

Hoffe mir kann einer das Problem erklären. Ich seh den Fehler leider nicht...
 

Twinsetter

Mitglied
Hallo!

Du hast im Funktionsaufruf die Variable i als String definiert. In der der while - Bedingung benutzt Du diese Variable aber als integer und genau dies meckert der Compile auch an.
Dein Code müßte wie folgt aussehen:

Code:
function get_digit(term :string; var i :integer) :integer;
var temp :string;
begin
  temp := '';
  while isdigit(term[i]) and (i < length(term)-1) do begin
    temp := temp + term[i];
    end;
  Result := strtoint(temp);
end;

Bei der Zuweisung des Funktionsergebnisses brauchst Du den Funtionsnamen nicht zu wiederholen. Es reicht, wenn Du Result:= (s. Listing) sagst.
Noch ein paar Tips zu Deinem Code.
Du solltest prüfen ob Dein String auch wirklich eine gültige Integerzahl ergibt. Deshalb würde ich bei die Zeile temp:=temp+term[i] lieber so scheiben:
Code:
if temp[i] in ['0'..'9'] 
then temp:=temp+term[i]
else exit;

Nur wenn der Stringteil eine gültige Zahl ist, dann weitermachen ansonsten aussteigen. Den else Zweig könnte man natürlich auch anders formulieren - man muß nicht unbegingt komplett aussteige
Dann würde ich am Anfang noch eine generelle Initialisierung der Funktion machen, d.h. dafür sorgen, daß es immer einen definierten Rückgabewert gibt - z.B. Result:=0 (nach begin) einfügen. Wenn Du sicher bist, daß Du nur positive Zahlen bei Deiner Umwandlung erhältst, dann ist es sinnvoll die Funktion mit Result=-1 zu initialisieren. Du könntest dann diesen Wert abfragen und weißt sofort, daß da was schief gelaufen ist.

Noch ne Frage: Warum wird i als var Parameter deklariert ? Du veränderst i in der Funktion nicht, demzufolge mußt Du auch keinen veränderten Wert zurückgeben.

Twinsetter
 

morph3uz

Grünschnabel
haha, oh mann. wenn man zu lang vor diesem kasten sitzt sieht mann iwann den wald vor lauter bäumen nicht mehr... danke
Thema kann geschlossen werden.

i wird eigentlich noch innerhalb der schleife hochgezählt. und dass es eine integer zahl ist steht auch schon fest : )
mich hat nur das i gewurmt :p
 
Zuletzt bearbeitet:

Neue Beiträge