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

Gandi

Frischling

  • »Gandi« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Bayern

Beruf: Elektrotechnikingenieur

  • Private Nachricht senden

1

11.03.2010, 15:24

Fatal Error beim Start von .exe außerhalb Visual Studio

Hi,

ich entwickle ein Spiel in C++ mit der Leadwerks Engine, als IDE benutze ich Visual Studio 2008. Seit neuestem (genauer gesagt seit ein Kollege auch was reingecoded hat^^) hab ich das Problem, dass ich die .exe nicht mehr normal starten kann (bei ihm das selbe). Das Problem tritt sowohl bei Debug als auch bei Release auf.

Mein erster Gedanke war natürlich: "Klar, da ist der Pfad vom Arbeitsverzeichnis anders. Drum findets irgendwelche DLLs nich oder sowas."
Hab also unter Projekteigenschaften -> Debugging den Pfad der .exe und das Arbeitsverzeichnis so eingestellt, dass es _exakt_ das selbe ist, wie wenn ich die .exe normal starte. Wenn ich den altbekannten grünen Pfeil in VS benutze, klappt alles einwandfrei - wenn ich allerdings über Doppelklick oder eine Verknüpfung starte, bekomme ich beim Zurückkehren (!) einer Funktion, die eine Schriftart lädt, einen Fatal Error.

Also so in der Art

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void TestFunktion()
{
    <Mein Code hier...>

        //Das hier wird noch angezeigt...
    cout << "Am Ende von TestFunktion()" << endl;
}

int main()
{
    TestFunktion();

        //Das hier nicht mehr
    cout << "Nach TestFunktion()" << endl;
}


Daraufhin hab ich mir die Destruktoren der lokalen Variablen in der Funktion genauer angeschaut, aber außer ein paar std::string's, std::vector's mit einer Klasse, die wiederrum nur aus elementaren Typen besteht, war da nix besonderes zu finden.

Und überhaupt ist mir schleierhaft, wieso es von VS aus funktionieren sollte, wenn da ein Fehler drin wäre... und jetzt bin ich endgültig mit meinem Latein am Ende^^

2

11.03.2010, 16:35

Das was du schreibst, ist zu allgemein.
Zeig doch mal die besagte Funktion mit dem "Fatal Error".

Gandi

Frischling

  • »Gandi« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Bayern

Beruf: Elektrotechnikingenieur

  • Private Nachricht senden

3

11.03.2010, 17:18

Das ist die Funktion:

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
        void    Font::LoadFontF(str filename)
        {
            std::string fn = filename;
            fn.append(".dds");
            texture=LoadTexture((str)fn.c_str());
            std::string fn2 = filename;
            fn2.append(".cwf");
            str tmp = AbstractPath((str)fn2.c_str());
            FILE* f = fopen(tmp, "r");
            unsigned int width=TextureWidth(texture);
            unsigned int height=TextureHeight(texture);
            minIndex=-1;
            maxIndex=0;
            std::vector<Letter> v;
            char sign;
            char w;
            fread(&spaceSize, sizeof(char), 1, f);
            for(unsigned int y=0; y<height/LETTER_SIZE; y++)
            {
                for(unsigned int x=0; x<width/LETTER_SIZE; x++)
                {
                    
                    fread(&sign, sizeof(char),1, f);
                    fread(&w, sizeof(char),1, f);
                    //std::cout<<"Loading letter "<<sign<<std::endl;

                    if(sign>0)
                    {
                        if(sign<minIndex || minIndex==-1)
                        {
                            minIndex=sign;
                        }
                        if(sign>maxIndex)
                            maxIndex=sign;
                        Letter l = Letter(sign,Vec2(x*LETTER_SIZE,y*LETTER_SIZE),w);
                        v.push_back(l);
                    }
                }
            }
            fclose(f);
            letters = new Letter[maxIndex-minIndex];
            for each(Letter l in v)
            {
                letters[l.letter-minIndex]=l;
            }
            TextureFilter(texture, TEXFILTER_MIPMAP);
        }


Das hier ist die Letter-Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        struct Letter
        {
            Letter()
            {
                position=Vec2(0.0);
                width=0;
                letter=0;
            }
            Letter(char lettert, TVec2 positiont, unsigned int widtht)
            {
                position=positiont;
                width=widtht;
                letter= lettert;
            }
            TVec2   position;
            unsigned int    width;
            char letter;
        };


Wenn ihr noch was braucht, bitte melden.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

4

12.03.2010, 12:17

Bei Dateien wäre ich vorsichtig... Beim starten aus der IDE verwendet es die Dateien aus dem Projektordner (zumindest Bei VC++Exp; z.B. "C:/MeinProjekt/Meinprojekt/") und beim direkten Start mit der .exe (im Debug/ Release-Ordner) die aus dem entsprechenden Ordner (z.B. "C:/MeinProjekt/Debug/").

Mein Tipp: einen Ordner "Data" im Grundverzeichnis einrichten ("C:/MeinProjekt/Data/"), denn dann ist der aufruf immer der Selbe ;)

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

5

12.03.2010, 13:56

Man könnte auch die Projektoptionen ändern.
Ich pack die fertigen Dateien immer in den Bin Ordner, die Objektdateien werden aber nach den einzelnen Konfigurationen in unterschiedliche Ordner gepackt. So brauch ich die ganzen externen Daten nur einmal und hab auch kein Stress mit den Ordnern, wenn ich das mal über den Explorer starte, oder das ganze Verzeichnis jemanden zum testen kopiere.
Lieber dumm fragen, als dumm bleiben!

Gandi

Frischling

  • »Gandi« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Bayern

Beruf: Elektrotechnikingenieur

  • Private Nachricht senden

6

12.03.2010, 15:28

Ich hab doch schon gesagt dass ich die Pfade umgestellt habe. Ich hab die Ausgabedatei auf C:/MeinProjekt/Mein Projekt.exe gestellt (sowohl bei Debug als auch bei Release) und das Arbietsverzeichnis auf C:/MeinProjekt/

Wenn ich die .exe so ausführe, ist es genau das selbe.

Gandi

Frischling

  • »Gandi« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Bayern

Beruf: Elektrotechnikingenieur

  • Private Nachricht senden

7

17.03.2010, 14:58

So, ich hab jetzt zumindest mal rausgefunden, dass es wohl an dem Debug-Heap liegt, der verwendet wird, wenn man das Programm von Visual Studio aus startet.

Aber wirklich weiter bringt mich das auch nicht^^

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

8

17.03.2010, 18:01

Zitat von »"Gandi"«

So, ich hab jetzt zumindest mal rausgefunden, dass es wohl an dem Debug-Heap liegt, der verwendet wird, wenn man das Programm von Visual Studio aus startet.

Das bedeutet das du irgendwo einen Speicher-Zugriffsfehler drin hast, oder irgendwas das den Stack überschreibt.

Aus der Code-Qualität von dem Post schließe ich auf massive Probleme von eurem Projekt. Allein schon ein ungeprüfter

C-/C++-Quelltext

1
FILE* f = fopen(tmp, "r"); 

Gandi

Frischling

  • »Gandi« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Bayern

Beruf: Elektrotechnikingenieur

  • Private Nachricht senden

9

17.03.2010, 20:49

Zitat


Das bedeutet das du irgendwo einen Speicher-Zugriffsfehler drin hast, oder irgendwas das den Stack überschreibt.


Naja, soweit war ich eben auch schon, nur wo zur Hölle...

Zitat

Aus der Code-Qualität von dem Post schließe ich auf massive Probleme von eurem Projekt. Allein schon ein ungeprüfter
FILE* f = fopen(tmp, "r");

laber laber

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

10

18.03.2010, 13:44

Zitat von »"Gandi"«

Zitat

Aus der Code-Qualität von dem Post schließe ich auf massive Probleme von eurem Projekt. Allein schon ein ungeprüfter
FILE* f = fopen(tmp, "r");

laber laber


Wie willst du so denn weiter Hilfe bekommen?
fopen() kann nunmal auch 0 zurückgeben, was du nirgends überprüfst.

Werbeanzeige