Autor Beitrag
rizor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 209

WIN XP
Delphi 2005 PE, Visual C++
BeitragVerfasst: So 07.01.07 17:23 
Hallo,

meine If-Schleife wird einfach übergangen?
Wieso?

ausblenden volle Höhe 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

ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 209

WIN XP
Delphi 2005 PE, Visual C++
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 209

WIN XP
Delphi 2005 PE, Visual C++
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 209

WIN XP
Delphi 2005 PE, Visual C++
BeitragVerfasst: Mo 08.01.07 18:48 
Hat niemand eine Idee?
C.Schoch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

WinXp
Turbo Dephi Win 32
BeitragVerfasst: Mo 08.01.07 19:54 
Hi,
Ich vermute mal schwer, das es hier ind diesen drei Zeilen eine Exception gibt:
ausblenden 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.
ausblenden Delphi-Quelltext
1:
UParser.TParser					

_________________
Das System hofft auf Besserung
[Siemens]
rizor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 209

WIN XP
Delphi 2005 PE, Visual C++
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

WinXp
Turbo Dephi Win 32
BeitragVerfasst: Mo 08.01.07 22:10 
jaenicke hat völlig recht daran kanns auch liegen!! :oops:

_________________
Das System hofft auf Besserung
[Siemens]