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

1

11.07.2008, 18:31

Formsanwendung: array kann nicht größer als 410 sein! Warum?

Hallo.
Ich schreibe ein Programm, dass alle Ein/Ausgaben in eine Datenbank speichert.
Hier grob der c++ code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#define Max_Eintraege 410
class CFilemanager
{
public:struct   SEAChunk
{
    int id;
    char Titel[255];
    char Gruppe[255];
    int Monat;
    float Betrag;
    bool JedenMonat;

    SEAChunk()
    {
        id=0;
        Monat=0;
        Betrag=0;
        JedenMonat=true;
    }
};

int numEintraege;
SEAChunk Chunks[Max_Eintraege];

public: 

        bool ReadEA(string Benutzername)
        {
            char Filename[255];
            sprintf_s(Filename,"Datenbanken/%s.EA.table",Benutzername.c_str());
            fstream f;
            f.open(Filename,ios::in|ios::out|ios::binary);

            if(f.fail())
                return false;

            f.read((char*)&numEintraege,sizeof(int));

            for(int i=0;i<numEintraege;i++)
            {
                f.read((char*)&Chunks[i],sizeof(SEAChunk));
            }

            f.close();

            return true;
        }
};


Wenn man nun die Anzahl der eintraege erhöht dann stürzt das Programm ab!
Wenn ich das in eine normale Konsolenanwendung mache, dann funktioniert das sogar mit 1.000.000!
Was ist falsch?
Wo liegt das Problem?

Gruß Flo

2

11.07.2008, 18:37

Der Debugger sagt:
System.StackOverflowException

Das heißt doch eine Endlosschleife oder?

Aber das kann nicht sein...

Gruß Flo

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

11.07.2008, 18:37

Fehlermeldung? Ggf stackoverflow?

EDIT:
Das Array landet auf dem Stack welcher normalerweise bei VS auf 1 MB beschränkt ist. Kannst es mal bei einer einfachen Konsolenanwendung ausprobieren. Ab einer gewissen größe führt ein Array zu einem Stackoverflow. Entweder per new allokieren oder Stackgröße erhöhen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

4

11.07.2008, 18:39

ich kenn mich mit der C API nicht wirklich aus. aber das hier kommt mir merkwürdig vor:

C-/C++-Quelltext

1
f.read((char*)&numEintraege,sizeof(int)); 

Du castest numEinträge in einen char. Und ein char kann nur Werte von -128 bis 128 annehmen wenn ich mich recht erinnere.
folglich wirst du die Zahl der Einträge falsch lesen.

5

11.07.2008, 18:45

Wie kann man die Stackgröße erhöhen?

Gruß Flo

EDIT:
Das einlesen funktioniert aber alles!

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

6

11.07.2008, 18:47

Zitat von »"xardias"«

ich kenn mich mit der C API nicht wirklich aus. aber das hier kommt mir merkwürdig vor:

C-/C++-Quelltext

1
f.read((char*)&numEintraege,sizeof(int)); 

Du castest numEinträge in einen char. Und ein char kann nur Werte von -128 bis 128 annehmen wenn ich mich recht erinnere.
folglich wirst du die Zahl der Einträge falsch lesen.

Hoe? Das ist doch C++ I/O.. und er erstellt einen Zeiger auf ein char-Array, das sizeof(int) lang ist, also 4 chars. Und -128 bis 128 ist einer zu viel :)

Zitat von »"F-Wölkchen"«

Wie kann man die Stackgröße erhöhen?

Gruß Flo

EDIT:
Das einlesen funktioniert aber alles!

Per Paramater fuer den Compiler, wuerd ich vermuten
http://msdn.microsoft.com/en-us/library/tdkhxaks(VS.71).aspx
"Have you tried turning it off and on again?"

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

11.07.2008, 18:54

Zitat von »"xardias"«

ich kenn mich mit der C API nicht wirklich aus. aber das hier kommt mir merkwürdig vor:

C-/C++-Quelltext

1
f.read((char*)&numEintraege,sizeof(int)); 

Du castest numEinträge in einen char. Und ein char kann nur Werte von -128 bis 128 annehmen wenn ich mich recht erinnere.
folglich wirst du die Zahl der Einträge falsch lesen.


ne, er castet in nen zeiger auf char, was in dem fall ok is. ein char kann normal werte von -128 bis 127 annehmen (8 bit, zweierkomplement), wobei bei char nicht definiert ist ob er default signed oder unsigned ist. könnte also auch 0 bis 255 sein...


was mich ein wenig verwirrt ist die Fehlermeldung:

Zitat

System.StackOverflowException


hast du da ne C++/CLI anwendung am start oder wie!?


ein paar ratschläge zum programm vielleicht:

statt dem define wärs sicherlich zu überlegen ob man nicht lieber eine konstante nehmen sollte. und warum verwendest du überall char arrays, nur für den parameter von ReadEA nen string (für den wär vielleicht eine const referenz schöner)? warum nicht einfach gleich überall string verwenden (ja, das mit der datei is dann ein klein wenig komplizierter, aber dafür wird alles flexibler...).
im konstruktor von SEAChunk wär eine initialisierungsliste nett ;)

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

8

11.07.2008, 19:02

Sorry, mein Fehler. Habt recht ist schon richtig so. Mein Kopf ist was träge heute ;)

9

11.07.2008, 20:14

Zitat von »"F-Wölkchen"«

Wie kann man die Stackgröße erhöhen?


Eigentlich würde man die Variable mit new am heap erzeugen, ich glaube da gibt es keine Begrenzung für die Arraygröße (muss halt irgendwie in den Ram passen).
Lieber dumm fragen, als dumm bleiben!

10

11.07.2008, 20:15

So dumm es jetzt auch klingen mark:
ich habe

C-/C++-Quelltext

1
SEAChunk Chunks[Max_Eintraege];

einfach mit

C-/C++-Quelltext

1
2
3
4
5
SEAChunk* Chunks;
CFilemanager()
{
 Chunks=new SEAChunk[Max_Eintraege];
}


ersetzt und es klappt jetzt!

Vielen Dank für den Tipp

Gruß Flo

PS: mit define definiert man doch eine konstante oder sehe ich das falsch?

Werbeanzeige