Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

thil

Frischling

  • »thil« ist der Autor dieses Themas
  • Private Nachricht senden

1

30.03.2015, 16:43

riesiges array = error

</iframe>#piccshare_pic_options, #piccshare_pic_options > *, #piccshare_tint, #piccshare_logo { border-radius: 0; -moz-border-radius: 0; border: none; margin: 0; padding: 0; }


hi ich habe ein kleines programm geschrieben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include bla bla ...

int main ()
{
    struct block
    {
        short art = 1;//block-id
        char metadaten;//metadaten
        int connection;//connections
    };

Block lel[48][48][300];

}


das problem?

wenn ich Block

C-/C++-Quelltext

1
lel[48][48][1];
hinschreibe läuft alles,
aber sobald ich Block

C-/C++-Quelltext

1
lel[48][48][5];
eingebe komm ein fehler beim ausführen (nicht beim compilieren)

;( :dash: :fie: :hmm:

die fehler meldung : Ausnahmefehler bei 0x010348D7 in Spiel.exe: 0xC00000FD: Stack overflow (Parameter: 0x00000000, 0x001B2000)

vc++ öffnet dann die crtexe.c


danke im voraus;




(Link)


(Link)

(Link)

(Link)




(Link)


(Link)

(Link)

(Link)




(Link)


(Link)

(Link)

(Link)
»thil« hat folgendes Bild angehängt:
  • error.png

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »thil« (30.03.2015, 16:54)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

30.03.2015, 17:05

Das Array braucht zu viel Speicher um auf den Stack zu passen. Du kannst die Stackgröße zwar justieren, aber besser wäre es wohl das Array auf den Heap zu legen.

Edit:
Hier die Rechnung:

Ein Block belegt ~8 Byte (alignment etc...), mit 48*48*300 = 691200 Einträgen belegt das Array knapp 5 MB Speicher, was die (normale) Defaultgröße von 1 MB für den Stack überschreitet.

Leg die Daten auf den Heap, dann bekommst du keine Probleme mehr:

C-/C++-Quelltext

1
Block* lel = new Block[48*48*300];
@D13_Dreinig

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (30.03.2015, 17:14)


Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

3

30.03.2015, 18:30

C-/C++-Quelltext

1
std::vector<Block> lel(48*48*300);
Nur so, damit man nicht katastrophalerweise ein delete vergisst oder Exceptions nicht bedenkt.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

4

30.03.2015, 18:40

Kleiner Hinweis ein Array fängt immer bei 0 an nicht bei 1!

Wird von dir nicht Beachtet!
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

5

30.03.2015, 19:04

Kleiner Hinweis ein Array fängt immer bei 0 an nicht bei 1!

Wird von dir nicht Beachtet!

Das wollte ich vorhin auch schreiben, aber soweit ich das dann richtig verstande habe, sind das keine Zugriffe aufs Array, sondern InitialisierungenDeklarationen mit verschiedenen Größen.

6

30.03.2015, 19:10

Das wollte ich vorhin auch schreiben, aber soweit ich das dann richtig verstande habe, sind das keine Zugriffe aufs Array, sondern InitialisierungenDeklarationen mit verschiedenen Größen.


Nee er hat ein Array mit der Größe

C-/C++-Quelltext

1
Block lel[48][48][300];

und greift dann auf das Element [48][48][1] bzw. [5] zu.

Bei [1] kommt es zu keinem Fehler bei [5] schon.

Wie gesagt er soll mal über den Hinweis grübeln, dann kommt er auf seinen Fehler.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (30.03.2015, 19:18)


CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

7

30.03.2015, 22:48

Wie gesagt er soll mal über den Hinweis grübeln, dann kommt er auf seinen Fehler.

Der Fehler wurde von David_pb schon aufgezeigt. Das Array ist zu groß für den Stack. Das hat nichts mit dem Zugriff zu tun.

8

31.03.2015, 06:18

Ja, und trotzdem wird er beim nächsten Array den selben (Zugriffs)Fehler machen.
Hätte meinen letzten Post etwas anders formulieren sollen!
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

9

31.03.2015, 08:18

Der Fehler wurde von David_pb schon aufgezeigt.
Der Fehler wurde ihm schon von seinem Computer aufgezeigt. David_pb war nur so nett ihm das nochmal vorzulesen.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

10

31.03.2015, 08:19

@Koschi:
Wenn es denn Zugriffe auf das Array wären, dann ja. Schau nochmal genau auf die beiden "Zugriffe" und auf das "Block" vor dem Codeblock. Offensichtlich hat er bei der Formatierung nur einen kleinen Fehler gemacht. Ein Indiz dafür ist, dass der erste seiner beiden zusätzlichen Codeausschnitte funktioniert. Das kann nicht der Fall sein, wenn es nur Zugriffe auf das bereits vorhandene Array wären, da das Erzeugen des Arrays bereits zu viel Speicher auf dem Stack erfordert.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige