Entwickler-Ecke

Sonstiges (Delphi) - If-Schleife wird komplett übersprungen


rizor - So 07.01.07 17:23
Titel: If-Schleife wird komplett übersprungen
Hallo,

meine If-Schleife wird einfach übergangen?
Wieso?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
procedure TAbleitung.Ableiten;
  var
    i : integer;
    ArrayTeil : TStringList;
    Parser : TParser;
begin
  if (Parser.byArray[byZaehler][byArrayLaenge] = 'x'and (byArrayLaenge > 1then
    Parser.byArray[byZaehler] := Parser.byArray[byZaehler] + '^1';
  ArrayTeil := TStringList.Create;
  ArrayTeil.Delimiter := '^';
  ArrayTeil.DelimitedText := Parser.byArray[byZaehler];
  if ArrayTeil.Count = 2 then
  begin
    if StrToInt(ArrayTeil.Strings[1]) > 1 then
    begin
      for i := 1 to length(ArrayTeil[0]) do
      begin
        if ArrayTeil.Strings[0][i] <> 'x' then
        begin
          byBasis := byBasis + ArrayTeil.Strings[0][i];
        end;
      end;
      byBasisMulti := StrToInt(ArrayTeil[1]);
      byBasis := FloatToStr(StrToFloat(byBasis) * byBasisMulti);
      byPotenz := IntToStr(byBasisMulti - 1);
      Parser.byArray[byZaehler] := byBasis + '^' + byPotenz;
    end
    else
    begin
      for i := 1 to length(ArrayTeil[0]) do
      begin
        if ArrayTeil.Strings[0][i] <> 'x' then
          byBasis := byBasis + ArrayTeil.Strings[0][i];
      end;
      Parser.byArray[byZaehler] := byBasis;
    end;
  end
  else
  begin
    Parser.byArray[byZaehler] := '';
    Dec(Parser.byArrayMenge);
    setlength(Parser.byArray , Parser.byArrayMenge);
    Dec(Parser.byArrayPos);
  end;
  ArrayTeil.Free;
end;


Er Springt von der if-Abfrage direkt zu ArrayTeil.Free


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TParser.AufteilungMain;
begin
  if (byWert <> '+'and (byWert <> '-'then
  begin
    if byArray[byArrayPos] = #0 then
      byArray[byArrayPos] := byWert
    else
      byArray[byArrayPos] := byArray[byArrayPos] + byWert;
  end
  else
  begin
    if byArray[byArrayPos] <> #0 then
    begin
      Inc(byArrayPos);
      Inc(byArrayMenge);
      setlength(byArray , byArrayMenge);
      byArray[byArrayPos] := byWert;
    end
    else
    begin
      if byWert = '-' then
        byArray[byArrayPos] := byWert;
    end;
  end;
end;


In dieser Prozedur wird das Array beschrieben.

Mir ist aufgefallen, dass die Abfrage ob das Feld leer ist immer mit falsch zurück gegeben.


Delphi-Quelltext
1:
2:
3:
4:
    if byArray[byArrayPos] = #0 then
      byArray[byArrayPos] := byWert
    else
      byArray[byArrayPos] := byArray[byArrayPos] + byWert;


Wieso?
Es wurde vorhher nichts in das Array geschrieben.

Danke.


jaenicke - So 07.01.07 17:29

Sag statt if-Schleife lieber immer if-Abfrage, wie du es ja auch danach in deinem Post getan hast... Das ist nunmal keine Schleife.

Aber zu deinem Problem: Gib mal direkt vor der if-Abfrage mit ShowMessage('"' + ArrayTeil.Text + '"'); den Inhalt davon aus. Denn vermutlich sind das eben nicht genau 2 Einträge dadrin... Was schiefläuft siehst du dann jedenfalls.
ich vermute mal, dass es mehr als 2 Werte oder so sind. Und wenn da nur eine Leerzeile zusätzlich drin ist (die du mit Trim ja webgbekämst). Aber sieh mal nach, was da ausgegeben wird.


rizor - So 07.01.07 17:59

ich bekomme vorher eine Zugriffserletzung und Arrayteil kennt er am Anfang der Prozedur ja noch nicht.

Außerdem ist es ja kein Problem, wenn nur ein Teil entsteht, da er dann ja zu else wechseln müsste, aber das überspringt er ja auch.
er gibt den Speicherplatz ArrayTeil sofort frei.
Er spaltet den Teil nicht einmal.
Mir ist eben aufgefallen, dass er ab hier alles überspringt:

ArrayTeil := TStringList.Create;

Ich weiß leider net wieso.

Meine MainUnit sieht so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.BBuseClick(Sender: TObject);
  var
      FunktionBear2 : TAbleitung;
begin
  FunktionBear2 := TAbleitung.Create;
  byFunktion := Efunktion.text;
  FunktionBear2.Ableitung;
  //label1.Caption := FunktionBear2.byArray[0];
  FunktionBear2.Free;
end;


IngoD7 - So 07.01.07 18:22

user profile iconrizor hat folgendes geschrieben:

Mir ist eben aufgefallen, dass er ab hier alles überspringt:

ArrayTeil := TStringList.Create;

Hast du das defintiv mit Breakpoints und/oder Einzelschritt (F7) bestätigt?


rizor - So 07.01.07 18:28

Mit F7 bin ich das gesamte Programm durchgegangen.
Die letzte Zeile die er bearbeitet ist die erste if-Abfrage, ob ein ^1 angefügt werden muss.

Aber ich hatte auch schon bei den uses Probleme mit der Unit.

Ich muss SysUtils und classes im interface-Teil angeben und UParser im Implementation-Teil.

Wenn ich alles im implementation- oder interface-Teil angebe, eerkennt das Programm nichts mehr, was zu Uparser gehört.
Den Grund habe ich auch nie gefunden.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
interface

uses
  SysUtils , Classes;

type TAbleitung = class(TObject)
  private
    byBasis,
    byPotenz : string;
    byBasisMulti,
    byZaehler,
    byArrayLaenge : Integer;
    constructor create;
    procedure Ableiten;
  public
    procedure Ableitung;
end;

implementation

uses
  UParser;


rizor - Mo 08.01.07 18:48

Hat niemand eine Idee?


C.Schoch - Mo 08.01.07 19:54

Hi,
Ich vermute mal schwer, das es hier ind diesen drei Zeilen eine Exception gibt:

Delphi-Quelltext
1:
2:
3:
  ArrayTeil := TStringList.Create;
  ArrayTeil.Delimiter := '^';
  ArrayTeil.DelimitedText := Parser.byArray[byZaehler];


Oder falls TParser mehrmfach deklariert ist, dann must du ihn möglicherweise voll Qualifizieren.

Delphi-Quelltext
1:
UParser.TParser                    


rizor - Mo 08.01.07 21:35

Wie muss das dann aussehen?
Das Problem ist, wenn es in diesen drei Zeilen einen Fehler gibt, dann meldet sich der Debugger zu Wort, aber es werden einfach alle zeilen ab ArrayTeil übersprungen.


jaenicke - Mo 08.01.07 22:01

Naja, wenn es da einen Fehler gibt, dann wird der Rest natürlich überprungen.
Und jetzt sehe ich auch, warum da ein Fehler kommt :autsch:, du hast Parser ja gar nicht vorher erzeugt, TParser ist doch aber ein Objekt!!!
user profile iconrizor hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TAbleitung.Ableiten;
  var
    i : integer;
    ArrayTeil : TStringList;
    Parser : TParser;
begin
  if (Parser.byArray[byZaehler][byArrayLaenge] = 'x'and (byArrayLaenge > 1then
    Parser.byArray[byZaehler] := Parser.byArray[byZaehler] + '^1';
  ArrayTeil := TStringList.Create;
  ArrayTeil.Delimiter := '^';
  ArrayTeil.DelimitedText := Parser.byArray[byZaehler];

Da fehlt vorher ein Parser := TParser.Create;, aber dann ist ja wohl nix in dem Parser drin, du schreibst hier ja lokal nix rein... Deshalb vermute ich mal, dass deine Parser-Variable eigentlich global deklariert ist, und du hier fälschlicherweise die lokale definiert hast, die dann natürlich statt der globalen genommen wird.


C.Schoch - Mo 08.01.07 22:10

jaenicke hat völlig recht daran kanns auch liegen!! :oops: