Autor Beitrag
Janus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Do 13.03.03 15:24 
ausblenden 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;
//*****************************************************************************

_________________
Don't give in the hate, that leaves to the dark side of the force !!!


Zuletzt bearbeitet von Janus am Do 13.03.03 15:38, insgesamt 5-mal bearbeitet
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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.

_________________
Popov
Peter2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: 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

ausblenden Quelltext
1:
SetLength(index,High(index)+2);					
Janus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Do 13.03.03 16:15 
Tja also, der Fehler kommt von der Prozedur SetLength...

SetLength(index,1); gibt den gleichen Fehler aus !

_________________
Don't give in the hate, that leaves to the dark side of the force !!!
Peter2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Do 13.03.03 16:21 
innerhalb einer Function geht das irgendwie nicht.
wenn du dir einen neuen Typ definierst, dann gehts interesanter weise
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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...

_________________
Don't give in the hate, that leaves to the dark side of the force !!!
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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.

_________________
Popov
Peter2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 13.03.03 18:02 
ausblenden 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 nachlesen.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
mars
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: 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:
ausblenden 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