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

Aktuelle Zeit: Mi Jul 09, 2025 04:48

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



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 16:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
Ich hab' keine Ahnung was hier nicht stimmt:
Das Programm lädt eine Karte aus einer Bitmap. Jeder Pixel soll je nach Farbe einer Mauer, einem Punkt oder nichts entsprechen. Die Werte werden dann in ein Array gespeichert.

Code:
  1.  
  2. type TGegenstand = (Mauer,Punkt,leer);
  3.  
  4. var Feld: Array of Array of TGegenstand;
  5.       breite,hoehe: Integer
  6.       bmp: TBitmap  
  7.   
  8.  
  9. procedure ladebitmap;
  10. var i,j:Integer;
  11. begin
  12.  bmp := TBitmap.create;
  13.  bmp.loadfromfile('Karte.bmp');
  14.  breite := bmp.width;
  15.  hoehe := bmp.height;
  16.  setlength(feld,breite+1,hoehe+1);
  17.  
  18.  for i := 1 to breite do
  19.   begin
  20.    for j := 1 to hoehe do
  21.     begin
  22.      if bmp.canvas.pixels[i-1,j-1] = clblack then feld[i,j] := mauer
  23.      else if bmp.canvas.pixels[i-1,j-1] = cllime then feld[i,j] := punkt
  24.      else feld[i,j] := leer;
  25.     end;
  26.    end;
  27.  
  28. end;
  29.  

In der Draw-Prozedur dann:
Code:
  1.  
  2. for i := 1 to breite do
  3. begin
  4.  for j := 1 to hoehe do
  5.   begin
  6.    if Feld[i,j] = Mauer then
  7.       begin
  8.         //Mauer zeichnen
  9.       end;
  10.      if Feld[i,j] = Punkt then
  11.       begin
  12.         //Punkt zeichnen
  13.       end;
  14.   end;
  15. end;
  16.  


Beim ausführen des Programms kommt dann In der Zeile if Feld[i,j] = Mauer then ein EAccessViolation.
Seht ihr an was das liegt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 17:11 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Hi,

ein Array geht normalerweis von 0..(Anzahl - 1) und nicht von 1 bis Anzahl. Wenn Du mit Feld[Anzahl] darauf zugreifst, erzeugst Du ein illegalen Zugriff.

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
KidPaddle hat geschrieben:
ein Array geht normalerweis von 0..(Anzahl - 1) und nicht von 1 bis Anzahl. Wenn Du mit Feld[Anzahl] darauf zugreifst, erzeugst Du ein illegalen Zugriff.

Deshalb habe ich setlength(feld,breite+1,hoehe+1); geschrieben, dann kann ich bei 1 anfangen.
Das ist nicht das Problem...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 18:05 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Hi,

ich habe jetzt den Code Delphi 5 reinkopiert und es kommt bei mir zu keiner Exception. Welche Delphiversion verwendest Du?

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 18:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
Auch 5 (Standard)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 21:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 10:50
Beiträge: 42
Wohnort: [Auch diese Steine können Sie klauen...]
Hi Mari,

schalte mal spasshalber die Optimization aus, und mache dann einen Build.

Gruß


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 26, 2003 16:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
neuromancer hat geschrieben:
Hi Mari,

schalte mal spasshalber die Optimization aus, und mache dann einen Build.

Gruß

Hab's ausprobiert, bringt nichts :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 26, 2003 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich geh mal davon aus, das deine Schleifen irgendwo die Grenzen des Arrays überschreitet.Aktivier mal bei den Compileroptionen die Bereichs- und Überlaufsprüfung ein.Dann sollte aus der kryptischen EAccessViolation eine Fehlermeldung kommen, in der dir mitgeteilt wird das die Grenzen des Arrays verletzt wurden.

Dann wird dein Programm ja angehalten, und du kannst dir ganze bequem die in i bzw. j und Feld[] enthaltenen Werte ansehen.Das sollte die Fehlersuche erleichtern.Wenn die Meldung nämlich am Ende der Schleifendurchgänge kommt (i=breite bzw. j=hoehe, oder beides=Maximalwert), dann hast du dein dynamisches Array nicht richtig dimensioniert. (Probier mal bei Setlength statt breite+1/hoehe+1 breite+2/hoehe+2)

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 26, 2003 18:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
Es muss irgendwie an dem dynamischen Array liegen.
Wenn ich ein statisches zweidimensionales Array mit [100,100] nehme dann geht es, wenn ich aber beim dynamischen Array über setlength 100,100 einstelle dann geht es nicht (???)!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 26, 2003 18:39 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Mari ist Array mit [100,100] = [0..100,0..100] - das wäre was anderes als SetLength(100,100), das wäre SerLength(100+1, 100+1), wobei mir der Setlength mit den 2 parametern als solcher unbekannt ist.... bei delphi5 gabs ihn jedenfalls nicht


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 26, 2003 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Mari hat geschrieben:
Es muss irgendwie an dem dynamischen Array liegen.
Wenn ich ein statisches zweidimensionales Array mit [100,100] nehme dann geht es, wenn ich aber beim dynamischen Array über setlength 100,100 einstelle dann geht es nicht  (???)!

Dann probier mal folgendes :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>
<span class='reserved'>for</span> i := <span class='integer'>1</span> <span class='reserved'>to</span> breite <span class='reserved'>do</span>
<span class='reserved'>begin</span>
SetLength(Feld, Length(Feld)+<span class='integer'>1</span>);
<span class='reserved'>for</span> j := <span class='integer'>1</span> <span class='reserved'>to</span> hoehe <span class='reserved'>do</span>
<span class='reserved'>begin</span>
SetLength(Feld[i], Length(Feld[i])+<span class='integer'>1</span>);
<span class='reserved'>if</span> bmp.canvas.pixels[i-<span class='integer'>1</span>,j-<span class='integer'>1</span>] = clblack <span class='reserved'>then</span>
feld[i,j] := mauer
<span class='reserved'>else</span>
<span class='reserved'>if</span> bmp.canvas.pixels[i-<span class='integer'>1</span>,j-<span class='integer'>1</span>] = cllime <span class='reserved'>then</span>
feld[i,j] := punkt
<span class='reserved'>else</span>
feld[i,j] := leer;
<span class='reserved'>end</span>;
<span class='reserved'>end</span>;
</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

Damit wird dein dynamisches Array auch dynamisch in der Schleife vergrößert...das sollte eigentlich zu 100% funzen.Darüber bin ich mir bei SetLength(Feld, 100, 100) nämlich nicht ganz sicher.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 27, 2003 11:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
-Beitrag gelöscht-


Zuletzt geändert von Mari am Do Mär 25, 2010 16:30, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 27, 2003 15:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
-Beitrag gelöscht-


Zuletzt geändert von Mari am Do Mär 25, 2010 16:31, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 27, 2003 19:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
-Beitrag gelöscht-


Zuletzt geändert von Mari am Do Mär 25, 2010 16:31, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 29, 2003 15:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Sep 04, 2002 21:26
Beiträge: 63
Hat's schon jemand bei sich versucht?
Wenn ja, ist es gegangen oder nicht?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.009s | 16 Queries | GZIP : On ]