AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ungültige Zeigeroperation

Ein Thema von Yheeky · begonnen am 15. Jul 2005 · letzter Beitrag vom 15. Jul 2005
Antwort Antwort
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

Ungültige Zeigeroperation

  Alt 15. Jul 2005, 08:32
Hi,

ich habe eine 2D-Karte mit X*Y Feldern auf der Karte. Ich benutze hierbei ein dymnamisches Array, damit der User die Anzahl der Felder der X- oder Y-Achse wechseln kann. Ich habe das wiefolgt gemacht:

Delphi-Quellcode:
type
    TFeldDaten = record
      FeldArt : Integer;
    end;

...

type
    TFelder = record
      FeldX, FeldY : Integer;
      Felder : Array of TFeldDaten;
    end;

...

Isokarte : TFelder;

...

SetLength(Isokarte.Felder, MaxX*MaxY);
Wenn ich nun die Anzahl der Felder verändere und es statt 5x5 nur noch 4x4 Felder gibt, motzt Delphi rum und zeigt mir eine ungültige Zeigeroperation an. Wenn ich die Anzahl auf 7x7 erhöhe gibt es keine Probleme. Ich rufe SetLength immer dann auf, wenn sich die Größe der X- oder Y-Achse verändert. Wo liegt das Problem?
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#2

Re: Ungültige Zeigeroperation

  Alt 15. Jul 2005, 09:31
1. Editiere mal deinen Beitrag und ändere deine [ code ][ /code ]-tags in [ delphi ][ /delphi ]-tags (ohen die Leerzeichen natürlich)
2.
Zitat von Yheeky:
SetLength(Isokarte.Felder, MaxX*MaxY);
Also MaxX und MaxY sind integers. Delphi multipliziert diese. bei 4x4 kommt da beispielsweise 16 raus. Das heißt du erhälst einen eindiemnsionalen Array von 0-15. Nicht, dass du denkst, dass der array mit 1 anfängt und du probierst in das 16 Element zu schreiben. Stoppe doch mal die Ausführung beim stelength (links auf den grauen Rand klicken, dann wird die Zeile rot, kompilieren, warten bis das Programm an der Stelle stoppt und dann mit F7 zeilenweise weiterausführen.)
Dann siehst du, ob es am setlength-Befehl liegt (ich kann mir das dann nämlcih nciht erklären...).
Ansonsten sollstest du darüber nachdenken, ob ein 2D-Array bei einer 2D Karte nicht angenehmer ist. den musst du so deklarieren:
Delphi-Quellcode:
type
    TFelder = record
      FeldX, FeldY : Integer;
      Felder : Array of Array of TFeldDaten;
    end;
also einfach nur ein Array of Array...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#3

Re: Ungültige Zeigeroperation

  Alt 15. Jul 2005, 11:03
Mhmm, als dann müsste ja
SetLength(Isokarte.Felder, MaxX*MaxY+1); funktionieren oder?

Leider treten immer unterschiedliche "Ungültige Zeigeroperationen" auf. Immer wird eine andere Zeile im Quellcode markiert. Irgendwas stimmt da nicht. Ich arbeite u.a. mit der Komponente DelphiX bzw. mit der DXDraw Komponente aus dem Package. Vielleicht hilft das manchem als Info.

Wie "bedient" man denn ein 2D-Array? Alleine das Erstellen reicht mir leider nicht an Informationen :-/
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#4

Re: Ungültige Zeigeroperation

  Alt 15. Jul 2005, 11:10
dann ist dein Problem wirklich schwer nachzuvollziehen...

Einen zweidemensionalen Array bedients du eigentlich so:
meinarray[x][y]
Allerdings bietet dir Delphi auch eine Kurzschreibweise:
meinarray[x,y]
bei setlength nimmst du einfach noch einen parameter mehr:
setlength(meinarray,x,y);
Du solltest dir in der Hilfe mal das Kapitel

Multidimensional dynamic arrays

durchlesen, da ist alles beschriben...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Antwort Antwort


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 +1. Es ist jetzt 05:14 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