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

15.04.2015, 00:59

Wie kann das sein? unnützes std::cout verhindert Programmabsturz...

Bin grade dabei einen Parser für mathematische Formel zu schrieben...
Funktioniert auch alles ohne Probleme, jedoch nur wenn ich mitten im Code ein eigentlich unnützes

C-/C++-Quelltext

1
std::cout << ' ';


einfüge.
( Jedes andere Zeichen / String geht auch - Hauptsache einmal "cout" , beziehungsweise Hauptsache eine Verzögerung... )

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
double prim(bool get)
{
    if( get ) get_token();
    switch(curr_tok)
    {
        case NUM:
        {
            double v = number_value;
            get_token();
            return v;
        }
        case VAR:
        {
            double& v = table[string_value];
            get_token();
            return v;
        }
        case SUB:
            return -prim(true);
        case LP:
        {
            double e = expr(true);
            if(curr_tok != RP) return error(") erwartet"); 
            get_token();
            return e;
        }
        default:
            return error("primary erwartet");
    }
}



Sobald ich es rausnehme und versuche klammern auszurechnen plopt beim Start sofort "Taschenrechner.exe funktioniert nicht mehr..."
Schätze wenn ich genug probiere würde ich eine Lösung dazu finden, jedoch interessiert es mich grade wieso es so ist wie es ist?
Woran könnte es liegt das?


(Ich hoffe es gibt sowas noch nicht - mir ist grade nicht wirklich was eingefallen nach was ich bei sowas suchen sollte... )

2

15.04.2015, 02:08

Wo fügst du das cout ein? Was sollen wir mit diesem Ausschnitt anfangen? Wir haben keine Informationen, was deine Funktionen, die du aufrufst, machen, noch welche Typen/Werte deine globalen Variablen haben.

Ganz allgemein sollte dir der Debugger hierbei allerdings eine sehr gute Idee davon vermitteln, was eigentlich schief läuft.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

3

15.04.2015, 07:33

Tut mir leid - ich dachte man kann aus meinen Text herauslesen wozu das cout da ist.
Hauptsache einmal "cout" , beziehungsweise Hauptsache eine Verzögerung...
Bevor ich gestern schlafen ging hatte ich es nur mit cout und usleep versucht, da beide das Programm ausführbar machen, kram ich zum Fazit das es irrelevant ist welche Funktion aufgerufen wird, solange nur eine minimale Verzögerung statt findet.

Den Ausschnitt habe ich mit gepostet, da ich nach langen herumprobieren und Ausklammern, den Fehler in dieser Funktion gefunden haben
( genauer gesagt zwischen dem IF und dem get_token() , wo ich dann auch zum Testet das cout eingefügt habe)


Aber du hast wohl damit recht das es sinnvoller gewesen wäre noch zu posten wie die ganze Funktion aufgerufen wird...
Das ganze Programm ist wie gesagt dafür das mathematische Formeln auszurechnen.
Um das möglichst effizient machen zu können ist alles schön verschachtelt und führt an manchen stellen halt auch wieder zurück zu unter levligen methotn (z. b. expr -> term -> expt -> ....) zwischendrin sind Endlosschleifen die nur beim z. b. ende der Formel durch break oder ein retrun beendet werden.

Wünschte der Debugger würde das tun - für den ist ja alles in Ordnung - ist ja auch, nichts Falschs (funktioniert ja wenn denn dann eine kleine Verzögerung drin ist).

Könnte Windows evtl. denken das sich das Programm fest gefressen hat es deswegen in die knie zwingen?

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

15.04.2015, 07:41

Vielleicht hast du auch einfach undefiniertes Verhalten programmiert?

5

15.04.2015, 07:52

Was verstehst du unter "undefiniertes Verhalten" ?

Ich kann nur wieder wiederholen:
Mit einer Verzögerung funktioniert es, ohne führt es zum Programmabsturz.

Würde schätzen es liegt an einer zu tiefgehenden Verschachtelungs kette... (oder wie auch immer man das nennen mag ^^ )
Kann man evtl. beim Compilieren angeben das so etwas vorhanden ist und (sofern es an Windows liegt ) dem Betriebssystem sagen das es so richtig ist?

6

15.04.2015, 08:06

"Undefiniertes Verhalten" ist z.B. int* f(){int x; return &x;} int main(){int* i = f(); *i=5;}. Da ist nicht definiert, was passiert. Der Zeiger kann z.B. auf eine andere Variable zeigen bzw. ins Leere oder es entsteht ein Zugriffsfehler beim Speicherzugriff etc.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

7

15.04.2015, 08:26

Kann ja aber nicht vorliegen, durch eine Verzögerung geht es ja , und diese definiert ja nicht aus jux undefinierte Variablen? Oder doch? o.ô

Tobiking

1x Rätselkönig

  • Private Nachricht senden

8

15.04.2015, 08:55

Kann ja aber nicht vorliegen, durch eine Verzögerung geht es ja , und diese definiert ja nicht aus jux undefinierte Variablen? Oder doch? o.ô

Üblicherweise stürzt ein Programm ab wenn es auf einen Speicherbereich zugreift der nicht dem Programm gehört. Wenn du durch undefiniertes Verhalten eine Adresse bekommst die nicht zum Programm gehört und der Funktionsaufruf dafür sorgt, dass er doch dazu gehört, klar.

9

15.04.2015, 09:40

Edit: War Unsinn :P

10

15.04.2015, 10:10

Kann ja aber nicht vorliegen, durch eine Verzögerung geht es ja , und diese definiert ja nicht aus jux undefinierte Variablen? Oder doch? o.ô

Üblicherweise stürzt ein Programm ab wenn es auf einen Speicherbereich zugreift der nicht dem Programm gehört. Wenn du durch undefiniertes Verhalten eine Adresse bekommst die nicht zum Programm gehört und der Funktionsaufruf dafür sorgt, dass er doch dazu gehört, klar.
Aber wieso sollte dann ein kleines Delay mitten im Code davor schützen?

Werbeanzeige

Ähnliche Themen