0

実行時にレジスタの内容を表示するように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
    ...
}
...
4

2 に答える 2

4

次の宣言とともに、typedef を file1.h に移動します。

extern ValueGPR reg[];

ValueGPR reg[33];file1.cppのままにします。

于 2010-07-06T15:50:08.227 に答える
1

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 (またはそれを呼び出すもの) へのポインターまたは参照を渡す必要があります。

于 2010-07-06T16:18:07.363 に答える