Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schleife / Ungültige Zeigeroperation!? (https://www.delphipraxis.net/72301-schleife-ungueltige-zeigeroperation.html)

morri 28. Jun 2006 11:26


Schleife / Ungültige Zeigeroperation!?
 
Hallo zusammen.


Folgender Code:


Delphi-Quellcode:
FOR i:=1 TO 12 DO
   begin
    he2:=1;
    if i<9 then
     begin
      repeat
      zqapg.SQL.Text:='select * from liste INNER JOIN listeorte on reklamnr=liste where (`orte`='''+inttostr(he2)+''') AND (`reklamdatum`>='''+jahr+'-0'+inttostr(i)+'-01'') AND (`reklamdatum`<'''+jahr+'-0'+inttostr(i+1)+'-01'')';
      zqapg.Open;
      monat[i-1,he2]:=zqapg.RecordCount;
      he2:=he2+1;
      until he2=he;
     end;
    if i=9 then
     begin
      repeat
       zqapg.SQL.Text:='select * from liste INNER JOIN listeorte on reklamnr=liste where `orte`='''+inttostr(he2)+''' AND (`reklamdatum`>='''+jahr+'-0'+inttostr(i)+'-01'') AND (`reklamdatum`<'''+jahr+'-'+inttostr(i+1)+'-01'')';
       zqapg.Open;
       monat[i-1,he2]:=zqapg.RecordCount;
       he2:=he2+1;
      until he2=he;
     end;
    if (i=10) or (i=11) then
     begin
      repeat
       zqapg.SQL.Text:='select * from liste INNER JOIN listeorte on reklamnr=liste where `orte`='''+inttostr(he2)+''' AND (`reklamdatum`>='''+jahr+'-'+inttostr(i)+'-01'') AND (`reklamdatum`<'''+jahr+'-'+inttostr(i+1)+'-01'')';
       zqapg.Open;
       monat[i-1,he2]:=zqapg.RecordCount;
       he2:=he2+1;
      until he2=he;
     end;
    if i=12 then
     begin
      repeat
       zqapg.SQL.Text:='select * from liste INNER JOIN listeorte on reklamnr=liste where `orte`='''+inttostr(he2)+''' AND (`reklamdatum`>='''+jahr+'-'+inttostr(i)+'-01'') AND (`reklamdatum`<'''+jahrund1+'-01-01'')';
       zqapg.Open;
       monat[i-1,he2]:=zqapg.RecordCount;
       he2:=he2+1;
      until he2=he;
     end;
   end;
Er geht alles durch, aber wenn er die For-Schleife durch hat, und oben dann i=13 ist, kommt sofort die Meldung:
Ungültige Zeigeroperation.

Irgendwie blicke ich gerade da nicht durch, wo der Fehler ist.

Es ist sicherlich etwas umständlich programmiert, aber sollte iegentlich funktionieren.
hmm

Kann mir da jemand helfen?

Gruß,
Morri

Matze 28. Jun 2006 11:30

Re: Schleife / Ungültige Zeigeroperation!?
 
Hi

Zitat:

Zitat von morri
[...] aber wenn er die For-Schleife durch hat, und oben dann i=13 ist, kommt sofort die Meldung:
Ungültige Zeigeroperation.

Wie kann i den Wert 13 annehmen, wenn die Zählvariable von 1 bis 12 läuft?

mquadrat 28. Jun 2006 11:33

Re: Schleife / Ungültige Zeigeroperation!?
 
i hat nach dem letzten Schleifendruchlauf den Wert 13 und bewirkt dann den Schleifenabbruch.

Ich tippe eher in der nächsten Zeile nach der Schleife auf den Fehler.

morri 28. Jun 2006 11:33

Re: Schleife / Ungültige Zeigeroperation!?
 
Sollte nicht, aber wenn du die Schritte einzeln durchgehst und nach dem 12. Durchgang wieder in die For Zeile kommst, hat i den Wert 13.

Das habe ich auch gerade bei einer simplen for schleife in bds2006 ausprobiert.
Auf jeden Fall kommt dann genau der Fehler.

:gruebel:

edit:

Zitat:

Ich tippe eher in der nächsten Zeile nach der Schleife auf den Fehler.
aber das ist das Problem.
Danach ist nur noch das end; der Prozedur.

mquadrat 28. Jun 2006 11:36

Re: Schleife / Ungültige Zeigeroperation!?
 
mhh dann wäre noch möglich, dass das Objekt in dem die Methode steckt unter Umständen schon freigegeben wurde. Hört sich doof an, ich weiß, aber wenn der Speicher nicht anderweitig verwendet wurde, stehen noch die gleichen Daten drin, so dass trotz free eine Methode noch halbwegs durchlaufen kann. Aber das ist jetzt wirklich geraten

Jasocul 28. Jun 2006 11:40

Re: Schleife / Ungültige Zeigeroperation!?
 
Oder i ist global deklariert und kommt nach dem Prozedur-Aufruf aun eine Zeile, die mit dem Wert 13 nichts anfangen kann.

morri 28. Jun 2006 11:42

Re: Schleife / Ungültige Zeigeroperation!?
 
Um den Code noch zu erweitern:

Delphi-Quellcode:
procedure Tgrafiken.Button1Click(Sender: TObject);
begin
 jahr:='2006';
 jahrund1:='2007';
 apg;
end;


procedure tgrafiken.apg;
var he,he2:integer;
    monat: array of array of integer;
    i,z:integer;

BEGIN

  he:=1;
  zqapg.SQL.Text:='select * from fehlerorte';
  zqapg.Open;
  setlength(monat,12,zqapg.RecordCount);
  z:=zqapg.RecordCount;
  repeat
   chart3.AddSeries(tbarseries.Create(self));
   chart3.Series[he].Title:=zqapg.FieldValues['bez'];
   chart3.Series[he].SeriesColor:=farben[he];
   zqapg.Next;
   he:=he+1;
  until zqapg.Eof;
  he2:=1;
 { repeat
   zqapg.SQL.Text:='select * from listeorte where `orte`='''+inttostr(he2)+'''';
   zqapg.Open;
   chart3.Series[he2].AddXY(1,zqapg.RecordCount,'Januar',farben[he2]);
   he2:=he2+1;
  until he2=he;          }

  FOR i:=1 TO 12 DO
   begin
    he2:=1;
    if i<9 then
     begin
      repeat
      zqapg.SQL.Text:='select * from liste INNER JOIN listeorte on reklamnr=liste where (`orte`='''+inttostr(he2)+''') AND (`reklamdatum`>='''+jahr+'-0'+inttostr(i)+'-01'') AND (`reklamdatum`<'''+jahr+'-0'+inttostr(i+1)+'-01'')';
      zqapg.Open;
      monat[i-1,he2]:=zqapg.RecordCount;
      he2:=he2+1;
      until he2=he;
     end;
    if i=9 then
     begin
      repeat
       zqapg.SQL.Text:='select * from liste INNER JOIN listeorte on reklamnr=liste where `orte`='''+inttostr(he2)+''' AND (`reklamdatum`>='''+jahr+'-0'+inttostr(i)+'-01'') AND (`reklamdatum`<'''+jahr+'-'+inttostr(i+1)+'-01'')';
       zqapg.Open;
       monat[i-1,he2]:=zqapg.RecordCount;
       he2:=he2+1;
      until he2=he;
     end;
    if (i=10) or (i=11) then
     begin
      repeat
       zqapg.SQL.Text:='select * from liste INNER JOIN listeorte on reklamnr=liste where `orte`='''+inttostr(he2)+''' AND (`reklamdatum`>='''+jahr+'-'+inttostr(i)+'-01'') AND (`reklamdatum`<'''+jahr+'-'+inttostr(i+1)+'-01'')';
       zqapg.Open;
       monat[i-1,he2]:=zqapg.RecordCount;
       he2:=he2+1;
      until he2=he;
     end;
    if i=12 then
     begin
      repeat
       zqapg.SQL.Text:='select * from liste INNER JOIN listeorte on reklamnr=liste where `orte`='''+inttostr(he2)+''' AND (`reklamdatum`>='''+jahr+'-'+inttostr(i)+'-01'') AND (`reklamdatum`<'''+jahrund1+'-01-01'')';
       zqapg.Open;
       monat[i-1,he2]:=zqapg.RecordCount;
       he2:=he2+1;
      until he2=he;
     end;
   end;

end;
Nach dem Fehler Springt er ans ende des Buttonclick-ereignisses.

Jasocul 28. Jun 2006 11:48

Re: Schleife / Ungültige Zeigeroperation!?
 
Mach mal nur zum Test folgendes:
Delphi-Quellcode:
// statt
  setlength(monat,12,zqapg.RecordCount);
// ändern zu:
  setlength(monat,13,zqapg.RecordCount);
Theoretisch dürfte das keine Auswirkungen haben. Aber Theorie und Praxis....

morri 28. Jun 2006 11:49

Re: Schleife / Ungültige Zeigeroperation!?
 
Boah neee.

Habe den Fehler gefunden !

Ich depp habe zwar an die Varialble i-1 gedacht, wenn ich Werte in das Array einlese, aber blöderweise den Wert von he2 vergessen. Da der ja dynamisch vom Recordcount kommt, (Beispiel 8 vorhandene Records) heißt es ja
Delphi-Quellcode:
setlength (12,8)
.
Was bedeutet: [0-11 und 0-7]

Also muss auch bei he2 die -1 hinten dran.

Blöder Fehler.

Seltsam nur, dass der Fehler erst ganz am ende auftritt und er vorher bei der Zuweisung direkt nichts sagt.


Vielen Dank für eure schnelle Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 Uhr.

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