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

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

1

18.09.2007, 16:28

Fehler bei Microsoft visual c++ 6.0?

Ich habe folgendes Problem:
Mein Programm verhält sich komplett anders, je nach dem wo ich cout anweisungen hinsetze. Was noch seltsamer ist: Wenn ich diese weglösche, neu kompiliere, wieder einfüge und wiede kompiliere ändert sich das Verhalten auch. Es gibt dann folgende 3 Möglichkeiten:

Das Programm funzt wie es soll
Das Programm stürzt nach kurzer Zeit ab
Ein Teil des Programms verhält sich seltsam

und dies wie gesagt nur durch einsetzen und löschen von cout.

Nun zu meinem Programm:
es ist ein 2D-Spiel mit der SDL und FMOD, es laufen mehrere Threads und es liest Daten von Datein aus. Kompilieren konnte ich es nur mit VS 6.0, da ich es peinlicherweise nicht mehr schaffe den 2005er ordnungsgemäß zu installieren (Edit: hat sich erledigt).
Ich hatte ein ähnliches Problem vor ca einem halben Jahr, als ein Konsolenprogramm (Das müsste ich sogar noch irgendwo haben) seltsame Zeichen in einen String einfügte, wenn ich eine bool-Variable außerhalb der main-Funktion deklarierte und das sowohl bei VS 6.0 und 2005.

Wenn ihr Quellcode haben wollt, meldet euch. Mein 2D-Spiel hat über 6000 Zeilen auf 15-20 Dateien verteilt und ich habe keine Ahnung wo der Fehler liegt. Wenn ihr aber das Konsolenprogramm sehen wollt hat das ca 100 Zeilen. Ich habe es damals, als der Fehler auftrat rein darauf reduziert, dass man den Fehler sieht, es hat nun keine wirkliche Funktion mehr und dient lediglich dazu, dieses seltsame Problem zu veranschaulichen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

18.09.2007, 17:26

dann poste mal die 100 zeilen ;)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

18.09.2007, 20:21

Schonmal einfach das Projekt bereinigt und neu erstellen lassen?^^ Löste bei mir schon manches Mysterium ;)
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.

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

4

22.09.2007, 14:34

Dies ist jetzt mein sinnloses Programm, das verrückt spielt. Hat übrigens nur gut 20 Zeilen.

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
 #include <fstream>

#include <iostream>
#include <string>

using namespace std;

string Line;
char Letter;
bool PrintLine = false;        //löscht man diese Zeile

int j, i;

int main (){

    PrintLine=true;        // und setzt vor diese "bool" taucht bei mir ein eigenartiger Fehler auf. Bei euch auch?


    char text[99];

    ifstream Data("Data.txt", NULL);  // Achja, diese Datei sollte ein paar Zeilen Text enthalten.


    Data.read(text, 99);

    Data.close();

    for (i=0; i<99; i++){

        for (j=i;text[j] != '\n'&&j<99;j++){}

        Line.erase(Line.begin(), Line.end());   // letzte Zeile löschen


        for (int x=i; x<j; x++){

            Letter = text[x];

            Line.append(&Letter);

        }

        cout <<Line<<endl;

        i=j;

    }

    return 0;

} 


Soviel dazu. Und jetzt mein cout problem.
Ich hab das mit dem 2005er jetzt hingekriegt. :oops: Bitte nicht all zu laut lachen. Dort gibt es jetzt nur 2 Möglichkeiten, wieder duch cout versetzen hervorgerufen.
1) Das Programm funzt wie es soll
2) Ein Teil des Programms verhält sich seltsam

Ob es wirklich beim den gleichen Quellcode verschiedene Sachen macht, kann ich nicht mehr bestätigen, das ist bei mir seit dem letzten post nie mehr aufgetreten. Dieses Mysterium wäre vielleicht dadurch zu erklären, dass ich nicht Strg+Z gedrückt habe, sondern alles neu getippt und mich im cout-Text (cout << "cout-Txet"; ) verschrieben habe. Trotzdem nach wie vor seltsam.

@Nox: Hab ich schon versucht, da kamen aber lauter Linkerfehler weil ich die Libraries irgendwie falsch eingerichtet habe (was mit NOEXECUTE oder so). Da war ich zu faul um das Forum zu durchsuchen und hab mir gedacht, dass das auch anders gehen muss, dass der Fehler vielleicht wirklich an mir liegt. Aber deiner Aussage nach zu schließen dann doch nicht. Wenn ich nix finde hört ihr bald näheres und wenn schon, dann könnt ihr euch schon bald auf eine Vorab-Beta-Demo oder sowas freuen, denn dann wäre der erste Abschnitt geschafft und ich könnte das Projekt ankündigen. :D
Hoffentlich ist es bald soweit.

neido

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

22.09.2007, 14:53

Zitat von »"neido"«


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//...

    for (i=0; i<99; i++){

        for (j=i;text[j] != '\n'&&j<99;j++){}

        Line.erase(Line.begin(), Line.end());    // letzte Zeile löschen


        for (int x=i; x<j; x++){

            Letter = text[x];

            Line.append(&Letter);

        }

        cout <<Line<<endl;

        i=j;

    } 
//...


Der Teil sieht bissl kriminell aus... schau dir nochma ganz genau im Debugger an, ob das wirklich das macht was du willst / erwartest. Vor allem Line.append(&Letter); solltest du lieber anders lösen - gefordert wäre hier ein 0-terminierter String und kein Pointer auf ein char (soweit ich das im Kopf hab ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

22.09.2007, 17:36

was dein "verrücktes" programm angeht:

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
// ...


string Line;     // warum machst du die variablen alle global?

char Letter;
bool PrintLine = false;
int j, i;           // vor allem schleifenzähler!?


int main (){

    PrintLine=true;

    char text[99];

    ifstream Data("Data.txt", NULL);

    Data.read(text, 99);

    Data.close();

    for (i=0; i<99; i++){

        for (j=i;text[j] != '\n'&&j<99;j++){}

        // warum kopierst du jetzt alles in einen string, nur um es auszugeben?


        Line.erase(Line.begin(), Line.end());

        for (int x=i; x<j; x++){

            Letter = text[x];

            // Line.append(&Letter);   <- das is böse, erklärung folgt

            Line += Letter;  // wenn, dann besser so



        }

        cout <<Line<<endl;

        i=j;

    }

    return 0;

} 



das da:

C-/C++-Quelltext

1
Line.append(&Letter);


macht folgendes:

Line.append hängt einen std::string an Line an. das problem ist nur, dass ein char kein string ist. um das zu umgehen, hast du, vermutlich nachdem der compiler gemeckert hat, einfach die adresse des char übergeben. das kompilliert, weil der compiler einen impliziten cast von char* nach std::string machen kann und dies hier tut. ABER bei dieser umwandlung wird eine nullterminierte zeichenkette erwartet und nicht einfach nur ein zeiger auf einen char. beim konstruieren des string wird also, vom übergebenen startzeichen ausgehend, jedes byte das danach im speicher folgt an den string angehängt, bis eine 0 kommt. nachdem der inhalt des speichers immer anders ist, bekommst du auch immer eine andere "verrückte" ausgabe. soweit meine theorie.

was genau bezweckst du mit dem programm. bzw. was erwartest du als ausgabe?
willst du einfach nur den inhalt der datei zeilenweise ausgeben!?

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

7

25.09.2007, 14:45

@dot: Danke für den Tipp, das werdi ich sicher noch öfter brauchen und das würde erklären, warum es nicht funktioniert hat. Was mich aber gewundert hat ist, dass es funktioniert hat, wenn man das macht, was ich in den Kommentaren versucht habe zu beschreiben. Dieses Programm hat keinen Sinn und ist nur ein Teil eines größeren Programms, den ich notdürftig auf wesentliche zusammengekürzt habe. Deswegen treten einige redundanzen auf. Ich habe die variablen deshalb global deklariert, da ich nur die main-Funktion habe. deshalb finde ich es so übersichtlicher. Bitte korrigiert mich wenn ich mich irre. Und ja, der Teil des Programms soll die Datei zeilenweise in einen String einlesen und den dann untersuchen. Ich weis mittlerweile, dass das auch einfacher geht (das stand hier irgendwo im Forum) aber damals eben noch nicht.

@Nox: Ich habs jetzt geschafft, das Projekt neu zu erstellen und: Tatsächlich, It works!
Mit der Projektankündigung müsst ihr noch ein paar Tage warten, da doch noch ein paar mehr bugs aufgetreten sind, als ich gedacht habe aber das schlimmste wäre geschafft.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

25.09.2007, 17:54

was datei zeilenweise einlesen angeht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
#include <string>

int main()
{

  std::ifstream file("blub.txt");

  while( !file.eof() )
  {
    std::string line;
    std::getline(file, line);
    std::cout << line << std::endl;
  }

  return 0;
}

Werbeanzeige