Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi problem mit dynamischem array (https://www.delphipraxis.net/140250-problem-mit-dynamischem-array.html)

gangs-taas 14. Sep 2009 15:47


problem mit dynamischem array
 
hey,
ich habe ein dynamisches array aber ich bekomme wenn ich darauf zugreifen will immer eine fehlermeldung "---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt P_Ce.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 0045B672 in Modul 'P_Ce.exe'. Schreiben von Adresse 00000000' aufgetreten." ich verstehe einfach nicht wieso..
wenn ich nen dynamisches array habe muss ich doch nicht sagen wie groß es sein soll oder ?!

wenn ich das hier so mache :

Delphi-Quellcode:
procedure Tastatur_optimieren;
  var
    Haeufigkeit : Array of integer ;
    i : integer ;
    Index : IntegeR ;
    Haeufigkeitsarray : Array of integer ;
  begin
    index := 0;
    For i := 0 to High(Haeufigkeit)-1 do    
    begin
      If (Haeufigkeit[i] > Haeufigkeit[i-1]) Then
        begin
          inc(index);
          Haeufigkeitsarray[index] := Haeufigkeitsarray[index] + Haeufigkeit[i] ; // HIER FEHLER
        end
        else If (Haeufigkeit[i] <= Haeufigkeit[i-1]) Then
        begin
          Haeufigkeitsarray[index] := Haeufigkeitsarray[index] + Haeufigkeit[i] ; // HIER FEHLEr
        end;
wieso bekomme ich dann an den gekennzeichneten stellen ne fehlermedlung ?

(also was es machen soll ist wenn meine 2te zahl (haeufigkeit) größer ist als ihrere vorherige zahl dann soll er eine neue "Zeile" im Array nehmen und sie dort hinein sortieren )

ich hab doch einfach ein dynamisches array und will darauf zugreifen oder ?!

danke schonmal :D

mkinzler 14. Sep 2009 15:50

Re: problem mit dynamischem array
 
Wie groß ist Haeufigkeitsarray?

Deep-Sea 14. Sep 2009 15:50

Re: problem mit dynamischem array
 
Da hast du wohl was falsch verstanden: Gerade bei dynamischen Arrays musst du die Größe mittels SetLength zuweisen :wink:

gangs-taas 14. Sep 2009 15:51

Re: problem mit dynamischem array
 
und was mach ich wenn ich nicht weiß wie groß die größe ist ?

Teekeks 14. Sep 2009 15:52

Re: problem mit dynamischem array
 
Du musst ein Dynamisches Array mit SetLength(aarray,größe); initialisieren.
Wenn du ein neues Element hinzufügen möchtest: Setlength(aarray,Length(aaray)+1);

Mist, Roter Kasten, aber egal...

Deep-Sea 14. Sep 2009 15:53

Re: problem mit dynamischem array
 
Zitat:

Zitat von gangs-taas
und was mach ich wenn ich nicht weiß wie groß die größe ist ?

Wenn du es nicht weißt, wer dann? Irgendwie musst du das Array doch mit Daten füllen?! :-D

gangs-taas 14. Sep 2009 15:54

Re: problem mit dynamischem array
 
okay
danke :)

ich hatte das wohl echt falsch verstanden :)

himitsu 14. Sep 2009 15:55

Re: problem mit dynamischem array
 
prüfe einfach mal die Indize in dem gesamten Code

Haeufigkeit[i-1] ... rate mal, auf welchen Index man zugreift, wenn i = 0 ist

Haeufigkeitsarray[index] .... wurde schon gesagt ... ist das Array groß genug?

gangs-taas 14. Sep 2009 16:05

Re: problem mit dynamischem array
 
Zitat:

Zitat von himitsu
prüfe einfach mal die Indize in dem gesamten Code

Haeufigkeit[i-1] ... rate mal, auf welchen Index man zugreift, wenn i = 0 ist

Haeufigkeitsarray[index] .... wurde schon gesagt ... ist das Array groß genug?

ersteres geht :D
zählt er auch als '0'

letzteres war ja das problem ich dachte man müsste dynamische arrays nicht mit setlength definieren ...

himitsu 14. Sep 2009 16:14

Re: problem mit dynamischem array
 
wieso denkt man sowas nicht? SetLength ist doch genau dafür da.

Und nur weil es zufällig geht
- schlalte mal in den Projektoptionen die Bereichsprüfung an, dann würden dir übrigens alle die hier genannten Index-Fehler angezeigt :angel2:

Und 0-1 ist -1 und -1 gibt es in einem dynamischen Array nicht ... vielleicht meinst du aber i+1, wegen dem High-1 :zwinker:



Also für das nächste Mal:
> Bereichsprüfung beim Debuggen aktivieren
> wärend des Debuggens die Indize und Arraygrößen vergleichen

gangs-taas 14. Sep 2009 16:34

Re: problem mit dynamischem array
 
hey,
wenn ich die letzte zeile (spalte ?! ) des arrays löschen möchte wieso geht das nicht so :

SetLength(Haeufigkeitsarray,(High(Haeufigkeitsarra y))-1);

ich hab mir gedacht ich definier das array einfach als eine zeile weniger und dann ist die letzte weg ...
aber das klappt (auch) nicht ...


edit :

Bereichsprüfung beim Debuggen aktivieren

dazu
verrätst du mir wie ich das mach ? :)

DeddyH 14. Sep 2009 16:38

Re: problem mit dynamischem array
 
"Klappt nicht" ist keine Fehlermeldung. Und mir scheint, Du verwechselst Length() und High().

Teekeks 14. Sep 2009 16:39

Re: problem mit dynamischem array
 
Mach so:

SetLength(Haeufigkeitsarray,(Length(Haeufigkeitsar ray))-1);

Mist schon wieder Roter Kasten...

gangs-taas 14. Sep 2009 17:06

Re: problem mit dynamischem array
 
Zitat:

Zitat von Teekeks
Mach so:

SetLength(Haeufigkeitsarray,(Length(Haeufigkeitsar ray))-1);

Mist schon wieder Roter Kasten...

danke sher
klappt ...

DeddyH 14. Sep 2009 17:11

Re: problem mit dynamischem array
 
Anderer Vorschlag (nur um den Unterschied mal zu zeigen):
Delphi-Quellcode:
SetLength(Haeufigkeitsarray, High(Haeufigkeitsarray));

gangs-taas 14. Sep 2009 17:21

Re: problem mit dynamischem array
 
Zitat:

Zitat von DeddyH
Anderer Vorschlag (nur um den Unterschied mal zu zeigen):
Delphi-Quellcode:
SetLength(Haeufigkeitsarray, High(Haeufigkeitsarray));

versteh ich nicht ... :D

du veränderst doch higth garnicht ?!

ich möchte doch eigl. die anzahl der spalten -1 haben
also die letzte "abschneiden" also müsste es doch high -1 sein oder ?!

DeddyH 14. Sep 2009 17:22

Re: problem mit dynamischem array
 
Length -> F1
High -> F1

Mach Dich doch erstmal mit den Begriffen vertraut.

[edit] Wetten, dass ich High() dadurch auch ändert (zumindest, wenn das Array nicht leer war)? :mrgreen: [/edit]

gangs-taas 14. Sep 2009 17:44

Re: problem mit dynamischem array
 
length gibt die anzahl der elemente
und high die obergrenzen der elemente

aber wenn ich die obergrenze verändere müsste ich doch auch die anzahl verändern doer ?!


ps. ich mag deine signatur :D

DeddyH 14. Sep 2009 17:46

Re: problem mit dynamischem array
 
Du änderst die Anzahl doch mit SetLength().

gangs-taas 14. Sep 2009 18:02

Re: problem mit dynamischem array
 
ich glaube wir reden an einander vorbei :D

aber du hast mir trotzdem geholfen :D

vielen dank :D

DeddyH 14. Sep 2009 18:09

Re: problem mit dynamischem array
 
Mal ganz langsam zum Mitschreiben:
Delphi-Quellcode:
SetLength(Array, 10);
//-> Length = 10, High = 9 (da von 0 bis 9)
SetLength(Array, High(Array)); //entspricht SetLength(Array, 9), siehe oben
//-> Length = 9, High = 8 (da von 0 bis 8)
Jetzt klarer?

gangs-taas 14. Sep 2009 18:40

Re: problem mit dynamischem array
 
ja
danke :D

Deep-Sea 15. Sep 2009 08:02

Re: problem mit dynamischem array
 
Zitat:

Zitat von DeddyH
Anderer Vorschlag (nur um den Unterschied mal zu zeigen):
Delphi-Quellcode:
SetLength(Haeufigkeitsarray, High(Haeufigkeitsarray));

Das klappt aber auch nur bei dyn. Arrays ... bei ShortStrings endet das eher negativ :wink:

DeddyH 15. Sep 2009 08:03

Re: problem mit dynamischem array
 
Ja nun, um dynamische Arrays geht es ja die ganze Zeit ;)

himitsu 15. Sep 2009 09:10

Re: problem mit dynamischem array
 
Jupp, ShortString ist auch ein statisches Array, mit dynamischer Inhaltsverwaltung. :angel2:

Deep-Sea 15. Sep 2009 10:22

Re: problem mit dynamischem array
 
Zitat:

Zitat von DeddyH
Ja nun, um dynamische Arrays geht es ja die ganze Zeit ;)

Zitat:

Zitat von himitsu
Jupp, ShortString ist auch ein statisches Array, mit dynamischer Inhaltsverwaltung. :angel2:

Ya Jungs, das weiß ich doch :lol:
Ich wollte halt nur nicht, dass ein Anfänger denkt "Oho, wenn ich SetLength mit High nutze, verkürze ich immer um eins", obwohl das nur auf Lenght(...) - 1 zutrifft ...
(Ich bin halt unverbesserlich ...)

himitsu 15. Sep 2009 10:34

Re: problem mit dynamischem array
 
Im Prinzip stimmt dieses auch, nur daß beim Sonderfall ShortString
auf andere Funktionen umgeleitet wird, bzw. es bei High als Konstante angelegt und bei Length direkt das LängenByte ausgelesen wird.

- High enthält (in diesem Fall) die maximale Größe der speicherbaren Daten,
welches alerdings einem "normalem" High entspricht, da dieses der Index des letzen Arrays im internen statischen Array entspricht
- Length enthält (in diesem Fall) den Wert des nicht automatisch initialisierten LängenBytes

gangs-taas 15. Sep 2009 14:09

Re: problem mit dynamischem array
 
okay
ich kann euch nicht mehr folgen :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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