| Autor |
Beitrag |
rizor
      
Beiträge: 209
WIN XP
Delphi 2005 PE, Visual C++
|
Verfasst: So 07.01.07 17:23
Hallo,
meine If-Schleife wird einfach übergangen?
Wieso?
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 > 1) then 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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 209
WIN XP
Delphi 2005 PE, Visual C++
|
Verfasst: 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; FunktionBear2.Free; end; |
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: So 07.01.07 18:22
rizor 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 
      
Beiträge: 209
WIN XP
Delphi 2005 PE, Visual C++
|
Verfasst: 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 
      
Beiträge: 209
WIN XP
Delphi 2005 PE, Visual C++
|
Verfasst: Mo 08.01.07 18:48
|
|
C.Schoch
      
Beiträge: 28
WinXp
Turbo Dephi Win 32
|
Verfasst: 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
_________________ Das System hofft auf Besserung
[Siemens]
|
|
rizor 
      
Beiträge: 209
WIN XP
Delphi 2005 PE, Visual C++
|
Verfasst: 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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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  , du hast Parser ja gar nicht vorher erzeugt, TParser ist doch aber ein Objekt!!!
rizor 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 > 1) then 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
      
Beiträge: 28
WinXp
Turbo Dephi Win 32
|
Verfasst: Mo 08.01.07 22:10
jaenicke hat völlig recht daran kanns auch liegen!! 
_________________ Das System hofft auf Besserung
[Siemens]
|
|