Использовать общедоступную переменную глобально

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

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

typedef long ValueGPR;
ValueGPR reg[33];

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

Вот как на самом деле выглядят оба файла (подумав об этом еще немного): «File1.h»

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

"Файл2.cpp"

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

person Dan Snyder    schedule 06.07.2010    source источник
comment
Упс, я напортачил с описанием... Итак, reg используется в файле1.cpp, но определяется следующим образом в файле1.h: typedef long ValueGPR; public: ValueGPR reg[33];   -  person Dan Snyder    schedule 06.07.2010
comment
Итак, если это так, я могу просто заменить public: ValueGPR reg[33]; с внешним ValueGPR reg[33];?   -  person Dan Snyder    schedule 06.07.2010
comment
@Dan: Если reg является членом класса (о чем, судя по вашим комментариям, судя по вашим комментариям), то менять его на глобальный было бы плохой идеей - вы получите неправильное поведение, если у вас есть более одного экземпляра класса сорт. Вместо этого вы должны найти способ передать либо reg, либо объект, который его содержит, по ссылке на функцию в file2.cpp, которая хочет получить к нему доступ.   -  person Mike Seymour    schedule 06.07.2010
comment
Вы правы, reg является частью класса. Можно ли определить глобальный указатель внутри объекта, содержащего reg? Как это сделать, а затем получить к нему доступ в файле2.cpp?   -  person Dan Snyder    schedule 06.07.2010
comment
Пожалуйста, опубликуйте объявление классов. Я путаюсь.   -  person Thomas Matthews    schedule 06.07.2010
comment
File1.h выглядит так: typedef long ValueGPR; ... class ThreadContext { ... public: ValueGPR reg[33]; ... ... } ...` File2.cpp выглядит следующим образом: `... #include .../ThreadContext.h ... long ExecutionFlow::exeInst(void) { ... //ДОБАВИТЬ PRINTF OF reg[1] - reg[32] ЗДЕСЬ ... } ... (как добавить теги кода?)   -  person Dan Snyder    schedule 06.07.2010


Ответы (2)


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

файл1.ч:

#ifndef FILE1_H_INCLUDED
#define FILE1_H_INCLUDED

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

#endif

файл1.с:

#include "file1.h"

ValueGPR reg[NUM_REGS];

файл2.с:

#include "file1.h"

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

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

файл1.ч:

// 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;

файл1.cpp:

#include "file1.h"
CPU_state cpu;

файл2.cpp:

#include "file1.h"

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

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

person Jerry Coffin    schedule 06.07.2010
comment
Я пробовал это с ошибкой. Я думаю, это связано с тем, что reg содержится в классе внутри file1.h. Я забыл упомянуть эту важную деталь... - person Dan Snyder; 06.07.2010
comment
Итак, в файле file1.h уже есть строка typedef CPU_state cpu, но когда я добавляю extern к этой строке, мне говорят, что в этом объявлении есть несколько классов хранения. Есть идеи? - person Dan Snyder; 06.07.2010
comment
@Dan: вы, вероятно, не хотите, чтобы это было typedef, просто extern CPU_state cpu;. - person Jerry Coffin; 06.07.2010
comment
Оказывается, в файле file2.cpp уже был определен объект, который позволил мне получить доступ к переменной reg, которую я искал. - person Dan Snyder; 06.07.2010

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

extern ValueGPR reg[];

Оставьте ValueGPR reg[33]; в файле1.cpp.

person Cogwheel    schedule 06.07.2010