2010-07-06 10 views
0

Je tente de modifier un simulateur MIPS pour afficher le contenu de ses registres pendant l'exécution. Ma question concerne la façon dont je prévois de faire cela. Donc ...Utilisation de variables publiques globales

J'ai un fichier, fichier1.cpp et fichier2.cpp. Il y a une variable publique locale dans file1.cpp appelé

typedef long ValueGPR; 
ValueGPR reg[33]; 

que je veux accéder à file2.cpp. Chacun de ces fichiers contient un fichier d'en-tête. File2.cpp contient une fonction qui suit de façon itérative l'exécution d'une instruction de programme par une instruction en faisant l'endroit idéal pour insérer un printf ("REG [% d]:% d \ n", i, reg [i]); déclaration ou quelque chose comme ça, mais reg est une variable locale dans file1.cpp. Comment assembler quelque chose qui me permettra d'accéder à cette variable reg?

C'est ce que les deux fichiers ressemblent vraiment (après avoir réfléchi à cela un peu plus): "File1.h"

typedef long ValueGPR; 
... 
class ThreadContext { 
    ... 
    public: 
     ValueGPR reg[33]; 
     ... 
    ... 
} 
... 

"File2.cpp"

... 
#include ".../ThreadContext.h" 
... 
long ExecutionFlow::exeInst(void) { 
    ... 
    //ADD PRINTF OF reg[1] - reg[32] HERE 
    ... 
} 
... 
+0

Woops, j'ai foiré ma description ... Donc, reg est utilisé dans fichier1.cpp mais il est défini de la manière suivante dans fichier1.h: 'typedef long ValeurGPR; public: ValueGPR reg [33]; ' –

+0

Donc, si c'est le cas, puis-je remplacer public: ValueGPR reg [33]; avec extern ValueGPR reg [33] ;? –

+0

@Dan: Si 'reg' est un membre d'une classe (ce qui semble être le résultat de vos commentaires), alors le changer en global serait une mauvaise idée - vous aurez un comportement incorrect si vous en avez plus d'un instance de la classe. Au lieu de cela, vous devriez trouver un moyen de passer soit 'reg', soit l'objet qui le contient, en référence à la fonction dans' file2.cpp' qui veut y accéder. –

Répondre

1

réponse est correcte de Cogwheel, mais votre commentaire indique une possibilité de confusion, alors peut-être il est préférable de clarifier un peu:

file1.h:

#ifndef FILE1_H_INCLUDED 
#define FILE1_H_INCLUDED 

typedef long ValueGPR; 
extern ValueGPR reg[]; 
#define NUM_REGS 33 

#endif 

fichier1.c:

#include "file1.h" 

ValueGPR reg[NUM_REGS]; 

fichier2.c:

#include "file1.h" 

/* ... */ 
for (i=0; i<NUM_REGS; i++) 
    show(reg[i]); 

Edit: Étant donné le point supplémentaire que reg est vraiment un membre d'une classe, le code ci-dessus ne fonctionnera pas clairement, bien que l'idée générale reste la même. Pour un membre de la classe, vous devez traiter la classe dans son ensemble, pas seulement la classe reg elle-même. Prendre un coup de poignard sauvage à ce que les choses pourraient ressembler, vous pourriez avoir quelque chose comme:

file1.h:

// include guard here 

class CPU_state { 
public: 
    typedef long ValueGPR; 
    static const int num_regs = 33; 
    ValueGPR reg[num_regs]; 

    //or, preferably: 

    // std::vector<ValueGPR> regs; 
    // CPU_state() : regs(num_regs) {} 
    // ... 
}; 

extern CPU_state cpu; 

file1.cpp:

#include "file1.h" 
CPU_state cpu; 

file2.cpp:

#include "file1.h" 

for (int i=0; i<cpu.num_regs; i++) 
    show(cpu.reg[i]); 

Si vous pouvez créer plus d'un processeur à la fois, vous aurez probablement besoin pour passer un pointeur ou une référence à un CPU_state (ou quoi que vous l'appeliez) plutôt que de s'appuyer sur une instance globale comme ce code l'utilise.

+0

J'ai essayé ceci avec erreur. Je pense que cela a à voir avec le fait que reg est contenu dans une classe à l'intérieur de file1.h J'ai oublié de mentionner ce détail important ... –

+0

Donc, le fichier file1.h avait déjà une ligne "typedef CPU_state cpu", mais quand j'ajoute "extern" à cette ligne on me dit qu'il y a plusieurs classes de stockage dans cette déclaration. Des idées? –

+0

@Dan: vous ne voulez probablement pas que ce soit un typedef, juste 'extern CPU_state cpu;'. –

4

Je propose le typedef en file1.h avec la déclaration suivante:

extern ValueGPR reg[]; 

Laissez le ValueGPR reg[33]; dans le fichier 1.cpp.