2017-01-27 4 views
-1

Also bevor ich diese Frage gestellt habe, habe ich versucht, eine Antwort zu finden, aber alles, was ich fand, war Leute mit Fehlern in ihrem Code und/oder der Code war nicht wirklich identisch.Genau derselbe C++ Code gibt verschiedene Ausgaben

Mein Problem ist genau das - identischer Code, nur Unterschiede sind verschiedene Dateinamen. (Zwei Ordner, zwei Projekte, verschiedene Dateinamen, identischer Code außer der #Include-Zeile)

http://imgur.com/a/5HmzN Vergleich von Code und Ausgabe. Code auf der linken Seite funktioniert und die Vektorgröße ist 2 nach dem Beenden.

Dies ist der Code: (Projekt A Dateiname/Projekt B Dateiname)

main.cpp/main.cpp

#include <iostream> 
#include <vector> 
#include "class.h" //this would be "Card.h" in project B 

using namespace std; 

int main() 
{ 
    cout<<"Start of main"<<endl; 
    cout<<K.size()<<endl; 
    K.push_back("random STR"); 
    cout<<K.size()<<endl; 
    cout<<"End of main"<<endl; 
    return 0; 
} 

class.cpp/Card.cpp

#include "class.h" //this would be "Card.h" in project B 
#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

vector<string> K; 

Card::Card(string card_name   , 
      string card_type   , 
      bool card_active  , 
      bool card_discardable , 
      bool card_heals  , 
      bool card_deals_damage , 
      bool card_draws  , 
      bool card_blocks  , 
      bool card_discards  , 
      void (*card_pointer)() ) 
{ 
    Name   = card_name   ; 
    Type   = card_type   ; 
    Active   = card_active  ; 
    Discardable  = card_discardable ; 
    Heals   = card_heals  ; 
    Deals_damage = card_deals_damage ; 
    Draws   = card_draws  ; 
    Blocks   = card_blocks  ; 
    Discards  = card_discards  ; 
    Execution  = card_pointer  ; 
    cout<<"Start of Class"<<endl; 
    cout<<K.size()<<endl; 
    K.push_back(Name); 
    cout<<K[0]<<endl; 
    cout<<K.size()<<endl; 
    cout<<"End of Class"<<endl; 
} 
string Card::getName() 
{ 
    return Name; 
} 
void Card::execute() 
{ 
    Execution(); 
}  

class.h/Card.h

#ifndef CARD_H 
#define CARD_H 
#include <string> 
#include <vector> 

extern std::vector<std::string> K; 

class Card 
{ 
    public: 
     Card( std::string card_name  , 
       std::string card_type  , 
       bool   card_active  , 
       bool   card_discardable , 
       bool   card_heals  , 
       bool   card_deals_damage, 
       bool   card_draws  , 
       bool   card_blocks  , 
       bool   card_discards , 
       void (*card_pointer)()   ); 
     std::string getName(); 
     void execute(); 
    private: 
     std::string Name  ; 
     std::string Type  ; 
     bool  Active  ; 
     bool  Discardable ; 
     bool  Heals  ; 
     bool  Deals_damage; 
     bool  Draws  ; 
     bool  Blocks  ; 
     bool  Discards ; 
     void  (*Execution)(); 
}; 



#endif 

aFile CPP/test.cpp

#include <iostream> 
#include "class.h" 
void execute_stab() 
{ 
    std::cout<<"You dealt 2 dmg to enemy player"<<std::endl; 
} 
Card Stab("Stab", "Offensive", false, true, false, true, false, false, false, execute_stab); 

Ausgabe ist im Album, für diejenigen, die hier nicht verwenden können Imgur es ist:

Projekt A:

Start of Class 
0 
1 
Stab 
End of Class 
Start of main 
1 
2 
End of main 

Projekt B:

Ich entschuldige mich, wenn mein Code ist chaotisch oder ich mache Dinge auf eine dumme Weise, ich habe gerade angefangen zu lernen C++ und das war mein Versuch zu erstellen Kartenspiel. Die große Frage ist also, warum identischer Code unterschiedliche Ausgaben liefert? Vielen Dank

+3

Versuchen Sie, es auf einen [MCVE] zu reduzieren. Der Prozess, wenn er beschnitten wird, kann Ihnen helfen, den Fehler zu finden, und es wird uns sicherlich leichter machen, ihn zu reproduzieren. Im Moment gibt es einfach zu viel Fremdcode für eine gute Frage. – BoBTFish

+1

Sie könnten auch versuchen, die beiden Versionen vorzuverarbeiten, die nur # include's und Makros verarbeiten und dann das Ergebnis vergleichen, um zu sehen, wo der Unterschied tatsächlich liegt. Mit g ++ oder clang ++ machen Sie das mit der Option '-E'. – BoBTFish

+0

@BoBTFish es gibt keinen Fehler, der Code funktioniert perfekt auf meinem Projekt A. Frage ist, warum die identische Kopie nicht funktioniert. –

Antwort

6

Die Reihenfolge der Initialisierung von globalen Variablen ist nur für eine einzelne translation unit gut definiert. Die Reihenfolge zwischen den Übersetzungseinheiten ist undefined. Das passiert hier.

können Sie nicht wissen, ob K von Card.cpp zuerst oder Stab von test.cpp initialisiert werden.

+0

Sollte das nicht beide Projekte brechen? Ich verstehe nicht, wieso es bei meinem Projekt A so funktioniert. Danke für die Antwort, ich werde versuchen, es zu beheben. –

+3

@MantasKandratavicius Das ist * undefined Verhalten * für Sie. Manchmal scheint es gut zu funktionieren, und in der nächsten Minute wird es einfach zusammenbrechen. –

+0

Ich sehe, danke. Ich werde das gründlich lesen. Ich denke, das beantwortet meine Frage. –

Verwandte Themen