Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 09, 2025 09:19

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: arrays
BeitragVerfasst: Mo Jun 19, 2006 17:56 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
Hallo,
hab irgendwo mal den Befehl
Map : array of TMap
gesehen. Das sieht aus als wäre es ein offenes array .. sowas bräuchte ich . leider Meckert der Compiler wenn ich
Map[1] := TMap.Create ;
eingebe.Wieso ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 18:26 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Was sagt er denn? Eventuell beginnt dein Array ja bei 0 und nicht bei 1...
Meine Glaskugel is defekt. Ohne etwas mehr Code isses ganz schlecht zu beantworten.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: arrays
BeitragVerfasst: Mo Jun 19, 2006 18:48 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
simon1988 hat geschrieben:
Leider Meckert der Compiler
Wie Meckert er? Wie gross ist deine Array und wie ist TMap definiert?

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 19:45 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
Code:
  1.  
  2. TMapTileR = class
  3.    PunkteX, PunkteY : integer;
  4.    CtrlPoints2D : array[0..6] of array[0..6] of array[0..2] of Single ;
  5.    constructor Create(anzX, anzY,abstX,abstY,hoehe: integer) ;
  6. end;  
  7.  
  8. TMap = class
  9.    MapRundAnz : integer ;
  10.    MapTileR : array of TMapTileR ;
  11.    //MapTileE : array of TMapTileE ;
  12.    constructor Create;
  13.    procedure render ;
  14. end;
  15.  
  16. {...}
  17. Map := TMap.Create ;
  18. Map.MapTileR[1] := TMapTile.Create(4,3,2,2,5);
  19.  
  20.  
  21.  

ist das so möglich zu schreiben ?


Zuletzt geändert von simon1988 am Mo Jun 19, 2006 20:11, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 19:57 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
sorry .. hab mich geirrt ..
also was ist daran falsch ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 19, 2006 22:32 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Wo steht Setlength(MapTileR, 2)?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 20, 2006 17:03 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
also damit legt man fest wie viel letztenendes der array< haben soll ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 20, 2006 17:19 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Genau, denn das Array hat als undefiniertes Array erst keine Länge.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 20, 2006 17:31 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
CtrlPoints2D : array of array of array[0..2] of Single ;
wie würde ich bei diesem array das erste mit 3 und das zweite array von 0..4 belegen ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 20, 2006 17:35 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Code:
  1. CtrlPoints2D : array[0..2] of array[0..3] of array[0..2] of Single;

oder
Code:
  1. var i: Integer;
  2. begin
  3.   SetLenght(CtrlPoints2D, 3);
  4.   for i := 0 to 3 do
  5.     SetLenght(CtrlPoints2D[i], 4);
  6. end

Aber bist du dir sicher, dass du Pascal kannst?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 20, 2006 17:38 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
genau so hab ichs auch geschrieben .. aber da kommt immer nen compiler fehler

SetLength(CtrPoint2d,3,4) ;
hm ..das geht bei mir schon ehre ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 21, 2006 12:27 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
so also.

ich hab hier will jetzt ne schöne runde fläche per randomhoehen machen. Ich hab zwei möglichkeiten programmiert.
Die möglkichkeit, mit der ich arbeiden will, klappt nich so ganz .
erstmal die funktionierende

Code:
  1.  
  2. TMapTileR = class
  3.    PunkteX, PunkteY : integer;
  4.    public
  5.    CtrlPoints2D : array of array[0..3] of array[0..2] of Single ;
  6.    constructor Create ;
  7.    procedure RandomCtrPoints(anzX, anzY,abstX,abstY,hoehe: integer) ;
  8.   end;
  9.  
  10.   TMap = class
  11.    Texture : array of GluInt ;
  12.    MapRundAnz : integer ;
  13.    MapTileR : array of TMapTileR ;
  14.    constructor Create;
  15.    destructor destroy ;
  16.    procedure render ;
  17.   end;
  18.  
  19. procedure TMapTileR.RandomCtrPoints(anzX, anzZ,hoehe: integer) ;
  20. Var u,s,i : integer ;
  21. begin
  22. SetLength(CtrlPoints2D, anzZ);
  23. for u := 0 to (anzY-1) do
  24. begin
  25.  for s := 0 to (anzX-1) do
  26.  begin
  27.   CtrlPoints2D[u,s,0] := s ;
  28.   CtrlPoints2D[u,s,1] := random(hoehe) ;
  29.   CtrlPoints2D[u,s,2] := u ;
  30.  end;
  31. end;
  32. end;
  33.  
  34. {hier hab ich nur den ersten array von CtrlPoints2D variable. Das funktioniert perfekt .. bekomme eine schöne fläche}
  35.  
  36.  


jetzt das zweite , was nicht funktioniert.

Code:
  1.  
  2. TMapTileR = class
  3.    PunkteX, PunkteY : integer;
  4.    public
  5.    CtrlPoints2D : array of array of array[0..2] of Single ;
  6.    constructor Create ;
  7.    procedure RandomCtrPoints(anzX, anzY,abstX,abstY,hoehe: integer) ;
  8.   end;
  9.  
  10.   TMap = class
  11.    Texture : array of GluInt ;
  12.    MapRundAnz : integer ;
  13.    MapTileR : array of TMapTileR ;
  14.    constructor Create;
  15.    destructor destroy ;
  16.    procedure render ;
  17.   end;
  18.  
  19. procedure TMapTileR.RandomCtrPoints(anzX, anzZ,hoehe: integer) ;
  20. Var u,s,i : integer ;
  21. begin
  22. {a)}SetLength(CtrlPoints2D, anzZ,anzX);
  23. {b)}SetLength(CtrlPoints2D, anzZ);
  24.       for i := 0 to anzZ-1 do
  25.        SetLength(CtrlPoints2D[i], anzX);
  26. //hier hab ich beide möglichkeiten ausprobiert, gehen beide nicht
  27. for u := 0 to (anzY-1) do
  28. begin
  29.  for s := 0 to (anzX-1) do
  30.  begin
  31.   CtrlPoints2D[u,s,0] := s ;
  32.   CtrlPoints2D[u,s,1] := random(hoehe) ;
  33.   CtrlPoints2D[u,s,2] := u ;
  34.  end;
  35. end;
  36. end;
  37.  

hier rendert er mir auch eine fläche aber eine total wirre fläche.
was mir komisch forkommen anzX hat ja den wert 4. das würde ja array[0..3] ensprechen.
ich ich aber jetzt anstatt anzX nur die 3 eingebe meckert der Compiler nicht, dass der array zu klein ist.
also irgendwie klappt das mit dem zweiten array nicht ganz .. weiß einer warum ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 21, 2006 13:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also, da du recht wenig Ahnung von Arrays hast solltest du im Delphi vorerst die Bereichsprüfung aktivieren.
Projekt -> Optionen -> Compiler -> Bereichsprüfung

Bei einem Array kann es ohne die Prüfung locker mal passieren, dass du zwar nur 4 Einträge hast aber auf den Eintrag 6-7 zugreifst und dann in einen anderen Speicherbereich hineinschreibst oder liest.

Dann musst du unterscheiden zwischen Dynamischen und Statischen Array.

Statisch array[0..9] of Integer. Da existieren dann immer die Felder 0 bis 9. Also ingesammt 10 Stück. Die Größe ist fest. Das lässt sich nicht ändern.

Dynamisch array of Integer. Die haben zu Begin eine Größe von 0. Mit SetLength kann du ihnen eine Größe zuweisen.

Du kannst im übrigen auch das Kleinste bzw das Größte Element eines Arrays. Das geht mit den Methode Low und High. Eine schleife könnte dann auch so aussehen.
Code:
  1. for u := Low(CtrlPoints2D) to High(CtrlPoints2D) do
  2.   for s := Low(CtrlPoints2D[u]) to High(CtrlPoints2D[u]) do

Aber wäre in diesem Falle auch nichts anderes als 0 bis AnzY -1 und 0 bis AnzX -1. So gesehen würde ich sogar sagen, dass der Code der nicht gehen dürfte aber eigentlich fnktionieren müsste.

Zur Not könntest du aber auch dein Array konstrukt vereinfachen. Das Letzte müsste zum Beispiel auch nicht unbedingt ein Array sein, da in deinem Falle auch ein Single ausreichen würde. Der Grund ist S und U musst du nicht extra ablegen, da diese ja eigentlich durch die Koordinaten im Array definiert wären. Dann würde ein array of array of single vollkommen genügen.

Zum Setzen der Größe würde ich SetLength(CtrlPoints2D, anzZ, anzX); benutzen. Das ist eigentlich genau das Gleich wie die andere Variante nur mit dem unterschied, dass hier alles in einem Rutsch passiert.

Ich würde dir auch mal Empfehlen das Debugger Tutorial durchzulesen. Und dann mal zu schauen wie die Struktur nach dem Setzen der Größe aussieht und wie es sich mit Daten füllt. Bei 3*4 sollte das kein Ding sein. Wenn das so aussieht wie man es erwarten würde dann würde ich mal deine Ausgabe untersuchen. Vielleicht macht die ja Murks.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Majestic-12 [Bot] und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 17 Queries | GZIP : On ]