Использовать общедоступную переменную глобально - PullRequest
0 голосов
/ 06 июля 2010

Я пытаюсь изменить симулятор MIPS для отображения содержимого его регистров во время выполнения.Мой вопрос относится к тому, как я планирую это сделать.Итак ...

У меня есть файл, file1.cpp и file2.cpp.В file1.cpp есть локальная общедоступная переменная с именем

typedef long ValueGPR;
ValueGPR reg[33];

, к которой я хочу получить доступ в file2.cpp.Каждый из этих файлов имеет заголовочный файл.File2.cpp содержит функцию, которая итеративно отслеживает выполнение инструкции программы по инструкции, что делает это идеальным местом для вставки printf ("REG [% d]:% d \ n", i, reg [i]);оператор или что-то в этом роде, но reg является локальной переменной в file1.cpp.Как мне сшить что-то, что позволит мне получить доступ к этой переменной reg?

Вот как на самом деле выглядят оба файла (немного подумав об этом): "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
    ...
}
...

Ответы [ 2 ]

4 голосов
/ 06 июля 2010

Я бы переместил typedef в file1.h вместе со следующим объявлением:

extern ValueGPR reg[];

Оставьте ValueGPR reg[33]; в file1.cpp.

1 голос
/ 06 июля 2010

Cogwheel ответ правильный, но ваш комментарий указывает на некоторую возможность путаницы, поэтому, возможно, лучше уточнить:

file1.h:

#ifndef FILE1_H_INCLUDED
#define FILE1_H_INCLUDED

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

#endif

file1.c:

#include "file1.h"

ValueGPR reg[NUM_REGS];

file2.c:

#include "file1.h"

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

Редактировать: Учитывая дополнительный момент, что reg действительно является членом класса, приведенный выше код явно не будет работать, хотяОбщая идея остается прежней.Для участника класса вам нужно иметь дело с классом в целом, а не только с самим reg.Взглянув на то, как могут выглядеть , вы можете получить что-то вроде:

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]);

Если вы можете создать более одного CPU одновременно, то вам, вероятно, нужно будет передать указатель или ссылку на CPU_state (или как вы его называете)это) вместо того, чтобы полагаться на глобальный экземпляр, как этот код использует.

...