AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Warum macht das großen Array Probleme?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum macht das großen Array Probleme?

Ein Thema von qubeus · begonnen am 30. Apr 2006 · letzter Beitrag vom 1. Mai 2006
Antwort Antwort
qubeus

Registriert seit: 19. Jan 2006
17 Beiträge
 
#1

Warum macht das großen Array Probleme?

  Alt 30. Apr 2006, 00:33
Hi Leute!

Ich programmiere grade ein Tool mit Delphi, das mir dabei hilft Tiles für mein eigenes RPG zu erstellen und daraus Maps zu erstellen. Ich habe zunächst ein Array gehabt, dass nur die Daten eines Tiles enthält und das sah folgendermaßen aus:

tile1: array[1..16,1..16] of integer;

....und funktionierte wunderbar....

da ich aber jetzt nicht nur ein Tile bearbeiten möchte, sondern eine ganze Map die aus 1024 Tiles besteht habe ich das Array erweitert und noch eine dritte Dimension hinzugefügt:

tile1: array[1..16,1..16,1..1024] of integer;

....und hierbei kam folgende Fehlermeldung:

FEHLER>
Im Projekt Project1.exe ist ein Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zufgriffsverletzung bei Adresse 00447C27 in Modul 'Project1.exe'. Schreiben von Adresse 00439C70'. Prozeß wurde angehalten. Mit Einzelnen Anweisungen oder Start fortsetzen.
<FEHLER

Ich habe dann die 1024 durch eine 128 ersetzt und der Fehler kam weiterhin und dann habe ich sie durch eine 64 ersetzt und der Fehler kam nicht mehr... es muss also mit der Größe des Arrays zusammenhängen, dass diese Fehlermeldung kommt.

tile1: array[1..16,1..16,1..64] of integer; <=== KEIN FEHLER DA "64" statt "1024"

Naja mein Problem ist denke ich klar, ich will statt 64 Tiles 1024 Tiles benutzen können und ich glaube nicht, dass mein Arbeitsspeicher zu klein ist für ein etwas größeres Array von 16x16x1024 des Typs Integer.

Hoffe also, dass ihr mir helfen könnt, dass ist sicher ein typisches Delphi Problem, für das man nur die Lösung wissen muss, um damit umzugehen. Freue mich über schnelle Antworten!!
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: Warum macht das großen Array Probleme?

  Alt 30. Apr 2006, 00:39
Wo wirds definiert. Das Array dürfte 1MB groß sein. Auf dem Stack (als lokale Variable) könnte es da schon Probleme geben, aber dann würde Stack-Überlauf kommen. Schalte doch mal die Bereichsprüfung in den Compiler-Optionen an. Vielleicht gibt das ja Aufschluss.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#3

Re: Warum macht das großen Array Probleme?

  Alt 30. Apr 2006, 00:46
Wenn du Delphi >3 benutzt, kannst du es so lösen:
Delphi-Quellcode:
tile1: array of array of array of Integer;

SetLength(tile1, 16, 16, 1024);
Damit wird das Array auf dem Heap gespeichert, und der ist, ums mal so zu sagen, enorm groß^^ Allerdings musst du bei dieser Variante aufpassen, weil die Indizes nicht mehr bei 1, sondern bei 0 anfangen.

Alternativ ginge noch das hier:
Delphi-Quellcode:
type
  TMap = array[1..16, 1..16, 1..1024] of Integer;
  PMap = ^TMap;

tile1: PMap;

New(tile1);
Damit sind die Indizes wieder 1-basiert, allerdings musst du, wenn du mit dem Array fertig bist, das ganze wieder mit Dispose(tile1) freigeben.
  Mit Zitat antworten Zitat
qubeus

Registriert seit: 19. Jan 2006
17 Beiträge
 
#4

Re: Warum macht das großen Array Probleme?

  Alt 30. Apr 2006, 01:43
Danke für die schnellen Antworten!!
Zwar war keine Lösung dabei die mir perfekt gefallen hat, aber ich denke meine Frage ist beantwortet. Also danke nochmal!!


OK bin nochmal da:
1:
ich verstehe das hier nicht ganz:
Delphi-Quellcode:
type
  TMap = array[1..16, 1..16, 1..1024] of Integer;
  PMap = ^TMap;

tile1: PMap;

New(tile1); // so jetzt nochmal ein Nachtrag: ich habe diesen Befehl eingegeben und dabei kommt eine Fehlermeldung, da der Befehl nicht angenommen wird. Lasse ich den Befehl jedoch weg, dann kommt die gleiche Fehlermeldung wie bei meiner ursprünglichen eigenen Version des Arrays.
also zuerst wird ein Typ festgelegt, so wie ich ihn brauche und dann wird ein Pointer daraufgesetzt der wiederum der Typ ist von tile1 und dann kommt New(tile1); <=? - was macht der - ich versteh nicht wie man diesen Code benutzt, also wie definiere ich das array global und wie greife ich drauf zu, das würde mich mal interessieren.


Wieder ein nachtrag: so habe jetzt diese version so ausprobiert, dass unter
Delphi-Quellcode:
typ
TMap = array[1..16, 1..16, 1..1024] of Integer;
PMap = ^TMap;
und unter dem globalen
var
tile1: PMap;
und nach dem ersten
Delphi-Quellcode:
begin
new(tile1);
stehen habe, überall anders wird das new(tile1); nicht verstanden... trotzdem kommt jetzt immernoch die Fehlermeldung, wenn das Programm läuft, die schon bei meiner Ursprünglichen Version kam.


2:
wenn ich beim definieren
Delphi-Quellcode:
tile1: array of array of array of Integer;
SetLength(tile1, 16, 16, 1024);
schreibe kommt ne fehlermeldung, ich habe aber delphi 5 und ich denke das zählt zu Delphi >3, also würde mich freuen, wenn ich die netten Antworten von euch auch noch verstehen würde und damit mein Problem lösen könnte.

[edit=SirThornberry]Delphi-Tags gesetzt. Nächstes mal bitte selbst machen. Mfg, SirThornberry[/edit]

Mmm wie macht man denn Delphi-Tags? - so?
test-code
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Warum macht das großen Array Probleme?

  Alt 30. Apr 2006, 09:37
Würdest du uns sagen, welcher fehler komt ( Var 1 + 2)
Markus Kinzler
  Mit Zitat antworten Zitat
qubeus

Registriert seit: 19. Jan 2006
17 Beiträge
 
#6

Re: Warum macht das großen Array Probleme?

  Alt 30. Apr 2006, 13:17
Also wenn ich von meiner ursprünglichen Fehlermeldung rede, wie ich es oben getan habe, dann meine ich folgenden Fehler, der erst nach der Compilierung auftritt und bei der Nutzung des Programms erscheint:

FEHLER>
Im Projekt Project1.exe ist ein Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zufgriffsverletzung bei Adresse 00447C27 in Modul 'Project1.exe'. Schreiben von Adresse 00439C70'. Prozeß wurde angehalten. Mit Einzelnen Anweisungen oder Start fortsetzen.
<FEHLER

In den übrigen Fällen, bei denen ich davon spreche, dass ein Befehl an bestimmten Stellen nicht verstanden wird, stehen z.B. bei Befehlen wie "New(tile1);" solche Dinge wie ":" erwartet, aber "(" gefunden, eigentlich eine typische Meldung, wenn man sich vertippt hat.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Warum macht das großen Array Probleme?

  Alt 30. Apr 2006, 13:35
Hallo qubeus,

du hast es selbst schon geschrieben: "New" ist ein Befehl. Befehle werden in Delphi zwischen BEGIN und END einer Prozedur und Methode geschrieben und nicht in den Deklarationsteil, der durch CONST, TYPE oder VAR eingeleitet wird. Man kann es auch an der Fehlermeldung des Compilers erkennen: er hat "New" als Variable interpretiert und erwartet nun ein ":", das dann üblicherweise von der Typangabe gefolgt wird.

Um den Laufzeitfehler zu finden zu können, bräuchte man ein größeres Stück deines Quelltextes. Insbesondere wäre zunächst der Teil interessant, in dem du das Array verwendest. Falls der Ausschnitt allzu groß ist, hänge ihn als Attachment an deinen nächsten Beitrag an; ein kürzeres Stück kannst du auch mit den Delphi-Tags in deinen Beitrag einbauen.

Noch ein Vorschlag: wenn du die von dir benutzte Delphi-Version in deinem Profil angibst, kann man dir besser helfen. Ansonsten werden möglicherweise Lösungen vorgeschlagen, die mit deiner Delphi-Version nicht funktionieren.

Gruß Hawkeye
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#8

Re: Warum macht das großen Array Probleme?

  Alt 30. Apr 2006, 15:47
Zitat:
wenn ich beim definieren
Delphi-Quellcode:
tile1: array of array of array of Integer;
SetLength(tile1, 16, 16, 1024);
schreibe kommt ne fehlermeldung, ich habe aber delphi 5 und ich denke das zählt zu Delphi >3, also würde mich freuen, wenn ich die netten
Aalso, auch das setlegth ist ein normaler Befehl, und wo gehören die hin? Zwischen Begin und End.

mfG

Markus
Markus
  Mit Zitat antworten Zitat
qubeus

Registriert seit: 19. Jan 2006
17 Beiträge
 
#9

Re: Warum macht das großen Array Probleme?

  Alt 1. Mai 2006, 02:45
Also ich hoffe mal, dass noch ne Antwort kommt, die mir weiter hilft:

Wenn ich folgendes wischen Begin und End schreibe, dann steht das nur undefinierter bezeichner "tile1" und "(" erwartet aber ";" gefunden
Delphi-Quellcode:
tile1: array of array of array of Integer;
SetLength(tile1, 16, 16, 1024);
dass man new(tile1); zwischen begin und end schreibt war mir schon klar und dass habe ich oben auch beschrieben und zwar als den Fall, bei dem meien ursprüungliche Fehlermeldung auftritt und jetzt fragt bitte keiner, welche meine ursprüngliche Fehlermeldung war - das war die, die ich in meinem letzten Beitrag nochmal wiederholt habe.

Jetzt kann ich nur noch sagen, dass ich eine Möglichkeit suche, die möglichst große und globale Arrays zulässt und die ich auch verstehe. Denke dafür ist es nicht nötig, dass ich meinen Quellcode hier angebe, trotzdem würde es mich mal interessieren wie man hier z.B. ein ganzes Projekt oder etwas größeren Code reinläd.

Edit:
So also ich habe es jetzt hinbekommen:

Delphi-Quellcode:
//ich wusste nicht, dass dieser Teil hier die Definition der Variable ersetzen muss:
 
tile1: array of array of array of Integer;

//und nur diese Zeile hier zwischen einem Begin und einem End stehen muss:

SetLength(tile1, 16, 16, 1024);

So jetzt ist das Problem, denke ich, gelöst! - Danke! - Scheinbar war schon der erste Tipp der, den ich zur Lösung brauchte, aber irgendwie war mir dabei sehr unklar, welche Zeilen an welche Stellen geschrieben werden müssen.
  Mit Zitat antworten Zitat
Benutzerbild von Aya
Aya

Registriert seit: 24. Jul 2003
Ort: Kassel
138 Beiträge
 
Delphi 6 Professional
 
#10

Re: Warum macht das großen Array Probleme?

  Alt 1. Mai 2006, 03:07
Hi,

Variante A:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  tile1: array of array of array of Integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(tile1, 16, 16, 1024);
end;

end.
Variante B:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
  TMap = array[1..16, 1..16, 1..1024] of Integer;
  PMap = ^TMap;

var
  Form1: TForm1;
  tile1: PMap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  New(tile1);
end;

end.
Proceduren und Funktionen kommen zwischen begin/end und Variablen in den var-Block...

Aya~
I aim for my endless dreams and I know they will come true!
S: String = #86^)^3^)^4#58#32^(^4^4^0#58#47#47^7^7^7#46^+^/^3^(^)^'^!^9^!#46^$^%;
  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:53 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