2016-10-04 5 views
1

Ich arbeite an einer Aufgabe zum Erstellen eines MIPS-Simulators in C++. Ich habe
Fehler: ‚Provisorien‘ keinen Typen
Fehler beim Namen nennen: ‚gerettet‘ Namen hat keinen Typen
Ich bin die Umsetzung nur das arithmetische Teil und bin mit drei Dateien, main.cpp, al.cpp, al .h.C++: Fehler nennt keinen Typ

al.h

#ifndef AL_H 
#define AL_H 
#include<vector> 
#include<string> 
#include<cstdlib> 
#include<iostream> 

int *temporaries; 
int *saved; 

typedef struct 
{ 
    std::string name; 
    int value; 
}label; 

//function declarations 

#endif  

main.cpp

#include "al.h" 
#include<fstream> 
std::vector<label> labels; 
temporaries=malloc(10*sizeof(int)); 
saved=malloc(10*sizeof(int)); 

//main() 

al.cpp

#include "al.h" 
using namespace std; 
//function definitions 

ich g ++ bin mit

g++ al.cpp main.cpp al.h 

Ich bin nur ein Anfänger im Progammieren. Es wird großartig sein, wenn mir jemand helfen kann.

bearbeiten

extern in den Header-Dateien verwendet und erklärt die Variablen in den Quelldateien wie Paddy zeigte und es wurde behoben. Danke für die Hilfe!

+0

Warum verwenden Sie "int * gespeichert" statt 'std :: vector gespeichert? Wollen Sie tatsächlich globale Variablen (wenn Sie die Frage nicht verstehen, ist die Antwort nein)? Wenn du aus irgendeinem Grund wirklich "malloc" willst, dann musst du 'static_cast (Std :: malloc (10 * sizeof * gespeichert))' '' '' ' In C++ können Sie einfach 'struct label' haben, das Sie nicht tun müssen, um die TypeDef-Sache zu tun. –

+0

Ich denke, dass 'gespeichert' sollte eine globale Variable sein, wie ich es in 'al.cpp' sowie in 'main.cpp' ändern. Was malloc betrifft, habe ich es mir einfach als eine Möglichkeit angesehen, "gespeichert" zu initialisieren. Ich habe 'vector gespeichert' in 'al.h' und 'saved.resize (10)' in 'main.cpp' vorher verwendet, aber ich habe den gleichen Fehler. –

+0

Sie können eine Variable in main erstellen und sie an andere Funktionen übergeben, oder wenn sie zusammenhängen, aber sie in einer 'Klasse' zusammen. Globale Variablen sind (fast) nie die Antwort. 'malloc' ist eine sehr niedrige Lösung, die nicht notwendig erscheint (und Kopfschmerzen für neue Programmierer). Wenn Sie wissen, dass Ihre Typen eine feste Größe haben, können Sie einfach auch ein 'std :: array gespeichert 'verwenden. –

Antwort

2

Sie können die Zuordnung auf globaler Bereichsebene nicht tun, es sei denn, es initialisiert einen Typ. Das versuchen die Fehlermeldungen Ihnen zu sagen.

Die schnelle Lösung ist es in Ihrer Haupt-Funktion zu setzen:

int main() 
{ 
    temporaries=malloc(10*sizeof(int)); 
    saved=malloc(10*sizeof(int)); 

    // Other program logic here... 

    return 0; 
} 

Aber beachten Sie, dass Sie ein Problem mit der Deklaration in der Header-Datei haben. Die in al.cpp sichtbare Version temporaries und saved ist nicht identisch mit main.cpp. Um das zu erreichen, müssen Sie etwas wie folgt aus:

al.h

extern int *temporaries; 
extern int *saved; 

void al_init(); 

al.cpp

// These are the actual symbols referred to by the extern 
int *temporaries = nullptr; 
int *saved = nullptr; 

// Since these belong to `al`, initialize them in that same source unit. 
void al_init() 
{ 
    temporaries=malloc(10*sizeof(int)); 
    saved=malloc(10*sizeof(int)); 
} 

main.cpp

int main() 
{ 
    al_init(); 
    return 0; 
} 

Natürlich bekommen wir jetzt eine seltsame Mischung aus C- und C++ - Stil, und ich höre auf, in dieses Kaninchenloch zu gehen. Hoffe, das hilft dir beim Einstieg.

+0

Ich vermute, dass OP Globals verwendet, weil sie * nichts * innerhalb einer Funktion haben, nicht weil sie tatsächlich Globals wollen –

+0

Ja, es ist möglich, dass es ein Verwirrung darüber, warum man Variablen in eine Header-Datei schreiben würde.Ich habe es auf den Nennwert genommen: sie sind in der Header-Datei, daher sind sie Teil der Schnittstelle dieser Einheit, deshalb sollten sie extern sein ot, dann sollten sie nicht im Header sein. – paddy

+0

Sie müssen auch auf diese malloc Anrufe wirken. –

1

Um die Frage zu beantworten: Ihr Code muss innerhalb einer Funktion¹ sein, d. H. main() (Sie brauchen es in Ihrem Programm sowieso, wenn Sie es nicht bereits definiert haben).

int main() 
{ 
    std::vector<label> labels; 
    temporaries = static_cast<int*>(malloc(10*sizeof *temporaries)); 
    saved = static_cast<int*>(malloc(10*sizeof *saved)); 
} 

¹ einige Code im globalen Bereich ausgeführt werden kann, aber das ist jenseits Bereich dieser Frage

² sans Umgebung freistehend

+0

... oder irgendeine Funktion, die nicht direkt oder indirekt von 'main()' aufgerufen wird. Das ist keine Voraussetzung, also übertreibe dies nicht. – IInspectable

+0

Ich werde es umformulieren. Es ist jedoch ein Ratschlag für einen Neuling. – krzaq

+1

* "Muss in einer Funktion sein" * ist Neuling-freundlich, und kürzer und korrekter. – IInspectable