Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Probleme mit Arrays !
Janus - Do 13.03.03 15:24
Titel: Probleme mit Arrays !
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:
| // ************************** get a uniqe ID *********************************** function getID(max: Integer; index: array of Integer): Integer; var i,tmpID: Integer; hit: Boolean; begin hit := false;
while true do begin tmpID := 1+Random(max);
for i:=0 to Length(index) do begin if index[i] = tmpID then begin hit := true; break; end; end;
if not hit then break; end;
SetLength(index,Length(index)+1); // hier kommt der Fehler "inkompatible Typen" index[Length(index)] := tmpID; result := tmpID; end; //***************************************************************************** |
Popov - Do 13.03.03 15:50
Length ist eine Funktion für Strings. Man bekommt dann die Länge einer Zeichenkette zurück. Leider kenn ich mich mit dynamischen Arrays kaum aus, da ich überwie´gend mit D3 arbeite, aber falls es auch für Arrays ein Length gibt, dann bekommt der Compiler es nicht mit. Es glaubt auf jedem fall eine String-Funktion vo sich zu haben.
Möglichkeit 1: Du legst die Reihenfolge der Units in der Uses neu fest.
Möglichkeit 2: Du schreibst vor Length die Unit hin, z.B. Blabla.Length. Somit sagst du dem Compiler welche Length du meinst.
Ich hoffe, daß es der Fehler war.
Ansonsten würde ich schon aus Prinzip bei einer Frage den Code kommentieren. Wenn du willst, daß andere sich Arbeit machen und antworten, dann solltest du auch Arbeit investieren.
Peter2002 - Do 13.03.03 16:10
Soweit ich weiß, gibt es keine function Length für Arrays.
wenn ich das richtig verstanden habe, willst du die Anzahl der Felder in deinem array um eins erhöhen.
Die Function
High dürfte dir dann weiterhelfen. Diese gibt den höchsten Index deines Arrays zurück
Quelltext
1:
| SetLength(index,High(index)+2); |
Janus - Do 13.03.03 16:15
Tja also, der Fehler kommt von der Prozedur SetLength...
SetLength(index,1); gibt den gleichen Fehler aus !
Peter2002 - Do 13.03.03 16:21
innerhalb einer Function geht das irgendwie nicht.
wenn du dir einen neuen Typ definierst, dann gehts interesanter weise
Quelltext
1: 2: 3: 4:
| type tArrayOfInteger = Array of Integer; ... function getID(max: Integer; index: tArrayOfInteger): Integer; |
kann das irgendwer erklären?
PS: Length funktioniert doch (habs grad probiert)
Janus - Do 13.03.03 16:27
Nun kann ich das Programm zwar kompilieren, doch es löst eine Exception vom Typ EInvalidPointer aus Meldung: Ungültige Zeigeroperation...
Popov - Do 13.03.03 16:30
Hat mit dem Thema eigentlich nicht zu tun, aber bei normalen Variablen muß man ein var vor den Paremeter stellen, wenn man etwas an den Werten machen will. Ich weiß es aber nicht ob es auch für Arrays gilt.
Peter2002 - Do 13.03.03 16:53
... würd ich auch sagen... dann kommt jedenfalls keine Exception mehr
noch was: sollte man nicht Randomize aufrufen, bevor man Random benutzt?
Christian S. - Do 13.03.03 18:02
Quelltext
1:
| index[Length(index)] := tmpID; |
Das kann so nicht gehen. Length(index) gibt die Anzahl der Items in index an. Da die Indizierung der Items bei dynamischen Arrays bei Null startet, ist der höchst zulässige Index Length(index)-1 oder einfacher High(index).
Das Problem entsteht jedoch dadurch, das Arrays, die als Paramter übergeben werden, nicht mit SetLength funktionieren.
Mehr zu Arrays könnt Ihr auch
hier [
http://www.delphi-forum.de/viewtopic.php?t=7204] nachlesen.
MfG,
Peter
mars - Do 13.03.03 19:14
| Peter2002 hat folgendes geschrieben: |
noch was: sollte man nicht Randomize aufrufen, bevor man Random benutzt? |
Man sollte der Random-Funktion tatsächlich ein Randomize voranstellen, damit die Random-Funktion auch -zumindest grösstenteils - wirklich "Zufallswerte" erzeugt. Üblich ist es, den Zufallsgenerator von der Zeit abhängig zu machen.
Aber kannst ja auch selber F1 drücken... :wink:
Tino - Fr 14.03.03 09:48
Nur zur Info da hier schon zwei mal geschrieben wurde das die Funktion Length nur im zusammenhang mit Strings zu gebrauchen wäre. Hier der Hilfetext für Length (Delphi 5):
| Delphi-Hilfe hat folgendes geschrieben: |
| Length gibt die Anzahl der im angegebenen String vorhandenen Zeichen oder die Anzahl der Elemente im Array zurück. |
Gruß
TINO
HeLe - So 16.03.03 19:58
Wenn du schreibst
| Zitat: |
| function getID(max: Integer; index: array of Integer): Integer; |
dann heißt das, daß index ein sog.
offener Arrayparameter (schlag das mal in der Hilfe nach) ist, es könnte also auch ein statisches Array übergeben werden! Deswegen gibt das bei setlength einen Typfehler.
Richtig muß es heißen:
Quelltext
1: 2: 3: 4:
| type Tintarr = array of integer; [...] function getID(max: Integer; index: Tintarr): Integer; |
So drückst du aus, daß ein dyn. Array übergeben werden soll
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!