AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Access Violation bei setlength bei Int Array

Access Violation bei setlength bei Int Array

Ein Thema von PhilmacFLy · begonnen am 14. Dez 2011 · letzter Beitrag vom 14. Dez 2011
Antwort Antwort
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#1

Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 13:20
Delphi-Version: 2005
Ok ich hab folgendes Problem ich bekomme bei einem Integer Array eine AV bei folgendem Code:
Delphi-Quellcode:
procedure Tfrm_gui_doku_laden.btt_ladenClick(Sender: TObject);
var
idtrain, tmpid: Integer;
idcount, tmpcount:Integer;
i: integer;
versioncount: Integer;
version: Integer;
begin
//i := 0;
versioncount := 0;
version := 42;
idcount := 0;
gesamt := 0;
versionen := 0;
//ShellExecute(Application.Handle,'open',PChar(ExtractFilePath(ParamStr(0)) +'Zeigtrai.exe'), Nil, Nil, SW_SHOW);
zConnection1.Connected := true;
    with ZReadonlyquery1 do
      begin
        SQL.TExt := 'Select ID_Training, Text from Training Where ID_Geraetenr = :ge and ID_KDNR = :kdnr' +
        ' and ID_such = :such and ID_Trainingsmodus = :mod Order By Version ASC';
        Params.ParamByName('ge').AsInteger := Geraetenummer;
        Params.ParamByName('kdnr').AsInteger := frm_gui_main.kunde.id;
        Params.ParamByName('such').AsInteger := idsuch;
        Params.ParamByName('mod').AsInteger := idmodus;
        Open;
        idtrain := FieldbyName('ID_Training').AsInteger; //Holt die ID der ersten Version eines Trainings
        Close;
        tmpid := idtrain;
        while version <> 0 do //Liest solang die Version aus bis keine neue Version kommt
          begin //dient dem zweck das ich die größe des Arrays festlegen kann
                               //nach der Anzahl der Versionen und anzahl der Trainingswerte pro Version
            Sql.Text := 'Select Versionsaenderung From Training Where Id_Training = :id';
            Params.ParamByName('id').AsInteger := tmpid;
            Open;
            version := FieldbyName('Versionsaenderung').AsInteger;
            Close;
            inc(versioncount);
            SQL.TExt := 'Select Count(ID_Training) From Trainingswerte Where ID_Training = :id';
            Params.ParamByName('id').AsInteger := tmpid;
            Open;
            tmpcount := FieldbyName('Count').AsInteger;
            Close;
            if tmpcount > idcount then
              idcount := tmpcount;
            tmpid := version;
          end;
        setlength(wertarr, versioncount+1, idcount);
        if checkbox1.Checked then
          setlength(anzahlarr, versioncount+1); //<---- Hier (Checkbox is nur zum testen obs wirklich das ist)
        for i := 0 to versioncount+1 do
          anzahlarr[i] := 0;
        i := 0;
        versionen:=versioncount;
        tmpid := idtrain;
        versioncount := 0;
        version := 42;
        while version <> 0 do
          begin //Liest dann die Werte aus in das array
            Sql.Text := 'Select Versionsaenderung From Training Where Id_Training = :id';
            Params.ParamByName('id').AsInteger := tmpid;
            Open;
            version := FieldbyName('Versionsaenderung').AsInteger;
            Close;
            inc(versioncount);
            Sql.Text := 'Select * From Trainingswerte Where ID_Training = :id Order By Datum, Startzeit';
            Params.ParamByName('id').AsInteger := tmpid;
            Open;
            while not eof do
              begin
                wertarr[versioncount, i].Datum := FieldbyName('Datum').AsDateTime;
                wertarr[versioncount, i].Start := FieldbyName('Startzeit').AsDateTime;
                wertarr[versioncount, i].Stop := FieldbyName('Stopzeit').AsDateTime;
                wertarr[versioncount, i].Fehlerl := FieldbyName('Fehlerlinks').AsInteger;
                wertarr[versioncount, i].Fehlerr := FieldbyName('Fehlerrechts').AsInteger;
                wertarr[versioncount, i].startpos := FieldbyName('Startpos').AsInteger;
                wertarr[versioncount, i].stoppos := FieldbyName('Stoppos').AsInteger;
                next;
                inc(i);
              end;
            Close;
            anzahlarr[versioncount]:=i;
            gesamt:=gesamt+i;
            tmpid := version;
          end;
      end;
    Frm_ZeigTr:=TFrm_ZeigTr.Create(self);
    Frm_ZeigTr.ShowModal;
    zConnection1.Connected := false;
end;
Wenn die Checkbox nicht gecheked ist passiert nichts wenn sie gecheckt ist AV, aber auch nicht immer das ist das seltsame.

Hier noch ein paar Definitionen:
Delphi-Quellcode:
  public
    wertarr: Array of Array of TTrainwerte;
    anzahlarr: Array of Integer;
    versionen,gesamt: Integer;
  end;
und von TTrainwerte
Delphi-Quellcode:
  TTrainwerte=class
  public
  id: Integer;
  Datum: Tdate;
  startzeit: TTime;
  stopzeit: TTime;
  FehlerL: Integer;
  FehlerR: Integer;
  Startpos: Integer;
  Stoppos: Integer;
  Notiz: String;
  procedure getvalues(Query: TZquery); overload;
  procedure getvalues(Query: TZReadOnlyQuery); overload;
  procedure insertvalues(Query: TZquery); overload;
  procedure insertvalues(Query: TZReadOnlyquery); overload;
  destructor Destroy();
  end;
Wäre ehct glücklich wenn mir jemand helfen könnte.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.593 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 14:05
Wenn du dort eine Zugriffsverletzung bekommst, dann hast du dir wo anders den Speicher zerschossen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 14:19
ich habe gerade keine Zeit, aber das sieht schon mal böse aus:

Delphi-Quellcode:
        if checkbox1.Checked then
          setlength(anzahlarr, versioncount+1);
        for i := 0 to versioncount+1 do
          anzahlarr[i] := 0;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.593 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 14:56
Also doch den Speicher zerschossen/überschrieben.

Projektoptionen > die Indexprüfung aktivieren
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 15:05
Also doch den Speicher zerschossen/überschrieben.

Projektoptionen > die Indexprüfung aktivieren
Kann das sein das es in D2k5 Bereichsüberprüfung heisst?

Edit: Was mir grad einfällt wenn ich ein setlenght auf versioncount+1 mach, dann is das array von 0 - versionscount definiert und nicht bis versionscount+1 ich test das mal

Edit2:
Ok jetzt krieg ich bei
Delphi-Quellcode:
for i := 0 to versioncount do
          anzahlarr[i] := 0;
Nen fehler bei Bereichsüberprüfung
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"

Geändert von PhilmacFLy (14. Dez 2011 um 15:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 15:40
Ich würde das so machen:
for i := 0 to High(anzahlarr) do Weil, wenn dort die Bereichsprüfung zuschlägt, dann greifst du da ja auf Elemente außerhalb des Arrays zu. Und da er die Arraylänge ja nicht immer ändert, sondern nur, wenn die eine Checkbox markiert ist, kann es ja sein, dass das Array kleiner ist, als „gedacht“.

Achso diese Änderung bewirkt natürlich „nur“, dass er nicht außerhalb des Arrays zugreift. Es könnte natürlich auch sein, dass das aber nie passieren soll. Dann würde meine Lösung nur das Symptom und nicht das Problem beheben.

Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler

Geändert von xZise (14. Dez 2011 um 15:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.593 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 15:46
Bereichsprüfung müßte die Prüfung der Variablen (Integer/Float) sein.

*nachseh*

OK, die Bereichsprüfung ist das.
Überlaufprüfung ist das Andere.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 15:54
Alles klar mit High(anzahlarr) hats funktinoiert, manchmal kanns so einfach sein
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.593 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 16:16
Alles klar mit High(anzahlarr) hats funktinoiert,
High ist aber nicht "immer" die "wirkliche" Lösung ... nämlich wenn eigentlich mehr im Array sein sollte, dieses aber irgendwo diefalsche Größe bekahm.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: Access Violation bei setlength bei Int Array

  Alt 14. Dez 2011, 18:12
@himitsu
ich denke doch, der Fehler liegt dann nämlich an einer anderen Stelle
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 03:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf