0

グローバル.h

typedef enum _global_list {
    TEST_VAR1,
    TEST_VAR2
} list;

/*Mapper between enum varibales and global variable*/
typedef struct _var_map{
    list list_type;
    void *ptr;
} var_map;

/*struct to hold global variable*/
typedef struct _glo_ptr{
    int *ptr1;
    float *ptr2;
} g_ptr;
g_ptr ptr;
void update_global(list ,void *);

global.c

#include "globals.h"

static var_map map[2] = { { TEST_VAR1, &(ptr.ptr1) }, { TEST_VAR2, &ptr.ptr2 } };

update_global(list var, void* ptr){

    if (map[0].list_type == TEST_VAR1){
        map[0].ptr =  ptr;
    }
}

testfile.c

#include "globals.h"
int main(){
    int test_var1=0;
    update_global(TEST_VAR1, &test_var1);
    test_var1=4;
    printf("%d",*ptr.ptr1); //should contain value 4
}

私がやろうとしているのはg_ptr、それが指す最新の値を含める必要があるということです。しかし、ポインターへのポインターでは、値の適切な更新につながる間違いをどこかで行っています。例: 私の最終的なg_ptr.ptr1値には 4 が含まれている必要があります。これで何を修正する必要がありますか?

4

1 に答える 1

2

問題は、マップ内の実際のポインターを変更しているが、ポイントされているデータには影響を与えていないことです。

map[0].ptr =  ptr;

する必要があります:

*(int**)map[0].ptr =  (int*)ptr;

あなたのプログラムの背後にある動機は少し疑わしいですが、これはあなたが探しているものをあなたに与えると私は信じています...私は私の距離を保ちます=)

ああ、私は別のことに気づきました...あなたはの別々のインスタンスを宣言しますptrglobal.h各ソースファイルに含めると、それらはptrプライベート静的変数として表示されます。それはあなたが望むものではありません。次のように宣言して定義する必要があります。

global.h

extern g_ptr ptr;

global.c

g_ptr ptr;
于 2012-10-30T02:48:03.710 に答える