2011-02-25 6 views
0

다음 코드를 사용하면 "get"을 통해지도를 받고 지정된 위치에 값을 반환 할 수 있습니까?함수에 C 포인터를 전달하는 방법?

나는 포인터와 메모리 할당에 대해 머리를 감싸려고 C로 셀룰러 오토 마톤을 작성하려고 시도하고있다. 이전처럼 직접 맵 [x + world.w * y] 대신 데이터를 얻기 위해 "get"을 만들기로 결정할 때까지는 아무 문제가 없었습니다. 앞으로는 동일한 크기의 두 개의지도를 가지고 같은 함수를 사용하여 데이터를 가져올 계획이므로 ("& map2, x, y)"대신 " 수 (&지도, X, Y) ".

나는이이 내가 전역을 사용에 대해 조언했기 때문에, 그래서 주에있는 두 개의 맵을 유지하고 처리하는 기능에 자신의 주소를 보내드립니다.

입니다 않는다 C 언어가 없으므로 C++ 솔루션이 유효하지 않습니다.

Google에서이 문서를 검색하려고했지만 모든 문서는 매우 기술적이며 복잡합니다. 실제로이 프로 시저가 실제로 어떻게 명명되는지는 잘 모르겠습니다. ... 그럼, 누구도 이걸 도와 줄 수 있니? malloc 배열을 함수에 전달하고 그것으로부터 데이터를 검색하거나 변경하려면 어떻게해야합니까?

typedef struct Map { 
int HP; 
int type; 
unsigned int flags; 
} Map; 

typedef struct World { 
int w; 
int h; 
} World; 

struct World world; 

int tile (int x, int y) { return x + world.w * y; } 

int get (/*unknown*/map , int x, int y){ 
int val = x + world.w * y; 
return /*unknown ->?*/ type; 
} 


int main(){ 
Map* map; 
world.w = 8; 
world.h = 8; 
int tiles = world.w * world.h; 
map = (Map*)malloc(sizeof(Map) * tiles); 
int i; 
for(i = 0; i < tiles; i++){ 
    map[i].type = rand()%2; 
} 
int x,y; 

while(1){ 
    put(0,0); 
    for(y = 0; y < world.h; y++){ 
     printf("\n"); 
     for(x = 0; x < world.w; x++){ 
      printf("%i ", get(&map, x, y)); 
     } 
    } 
}; 
printf("\n"); 
return 0; 

}

+0

'지도'와 '세계'의 관계를 분명히해야한다고 생각합니다. 내가 뭔가를 오해하고 있지 않는 한, 함수에 대한 포인터가 아주 잘 풀 수있는 문제가있는 것처럼 나에게 보이지 않는다. –

+0

@Jerry : 나는 그것이 어떻게 문제인지 보지 못한다. World는지도 크기 (다른 변수와 함께 나중에 확장 됨)를 정의하며, Map은지도 데이터입니다. – viktorry

답변

2

대신에 : 당신이 주소가 malloc에지도 포인터의 주소의을 통과하는 이

get(&map, x, y)

() 반환,

get(map, x, y)
AFAICT 코드에서 malloc()은 get()이 찾고있는 것, 즉 64 타일 공간이있는 메모리의 포인터를 반환합니다. 그래서 get()은 다음과 같이 보일 수 있습니다 :
int 
get(Map *map, int x, inty ) { 
    int val = x + map->w * y; // map is a pointer to struct, not the struct itself 
    return val;    // get() returns an int, and it's in val 
}

그게 당신이 원하는 것일 수도 있습니다.

- 피트

도 코드에서 몇 가지 다른 오류가 있습니다 만, 이것은 컴파일러가 땅에 하차 할 수 있습니다.

+0

정확하게 필요한 것. 이제 나는 마침내 아이디어를 얻었고 getter와 setter를 만들었습니다. http://paste.ubuntu.com/572308/. 이것으로 automata 코드를 계속 수행 할 수 있습니다. – viktorry

+0

그런데 더 중요한 오류가 보이십니까? 컴파일러는 아무 것도 출력하지 않습니다. – viktorry

+0

관련성이 없지만 "AFAICT"를 사용하는 것이 좋습니다. :) – tekknolagi

1

main()에 대한 여러분의 map 변수가 Map * 그래서 전화 사이트에서 그것에 &를 appling에 의해 그것의 이중 간접 포인터를 생성하지 않는 이미. 또한

, int get(Map *m, int x, int y) { ... return map[...]; }

malloc(3)에서 반환 값을 캐스팅하지 마십시오.

+0

위의 typedef에서 type 변수를 사용할 수 있습니까? 반환지도 [---]와 같은 유형? 편집 : 그것은 보인다! 이것은 작동하는 것 같습니다. 그러나 언제 실제로 &를 전달해야합니까? 평신도 용어의 차이점은 무엇입니까? – viktorry

+0

'x '가 이미 포인터가 아니며, int, double 또는 struct라고 상상해보십시오. 이제'& x'는'int *','double *','struct *'를 제공합니다. 인생을 흥미롭게 유지하기 위해서, 이것은 배열과 함께 자동적으로 발생하고,'&'연산자는 필요 없다. – DigitalRoss

0

내가 틀릴 수도 있지만 귀하의 질문을 읽을 때 실제로 함수 포인터를 찾고있는 것처럼 보이지 않습니다. 대신 Map 구조체를 가리키는 포인터가 함수로 전달됩니다. 아마도 특정 Map 요소에 대한 포인터도 반환하려고합니다. 이 경우는 다음과 같이 보일 것입니다 :

typedef struct Map { 
int HP; 
int type; 
unsigned int flags; 
} Map; 

typedef struct World { 
int w; 
int h; 
} World; 

struct World world; 

int tile (int x, int y) { return x + world.w * y; } 

Map * get (Map *map , int x, int y){ 
return map[x + world.w * y]; 
} 


int main(){ 
Map *map; 
Map *m; 
world.w = 8; 
world.h = 8; 
int tiles = world.w * world.h; 
map = (Map*)malloc(sizeof(Map) * tiles); 
int i; 
for(i = 0; i < tiles; i++){ 
    map[i].type = rand()%2; 
} 
int x,y; 

while(1){ 
    put(0,0); 
    for(y = 0; y < world.h; y++){ 
     printf("\n"); 
     for(x = 0; x < world.w; x++){ 
      m = get(map, x, y); // map was already declared as a pointer 
      printf("%d\n", m->HP); 
      printf("%d\n", m->type); 
      printf("%X\n", m->flags); 
     } 
    } 
}; 
printf("\n"); 
return 0; 
0

C에서 구조체 (또는 조합)에 대한 포인터를 전달은 간단합니다 :

typedef struct Foo 
{ 
    int a  ; 
    char b[32] ; 
} FOO ; 

void do_something_with_a_foo(FOO* p) 
{ 
    // using the arror operation '->' to deference a structure pointer 
    int m = p->a ; 
    char n = p->b[3] ; 

    // using the * operator to deference a structure pointer 
    int x = (*p).a ; 
    char y = (*p).b[3] ; 

    return ; 
} 

void pass_a_foo_pointer_to_function() 
{ 
    FOO stack_instance = { 3 , "hello, world" , } ; 
    FOO* heap_instance = malloc(sizeof(FOO)) ; 

    heap_instance->a = 12 ; 
    strcpy(heap_instance->b , "this, that and the other") ; 

    do_something_with_a_foo(&stack_instance) ; 
    do_something_with_a_foo( heap_instance ) ; 

    free(heap_instance) ; 

    return ; 
} 

건배!

관련 문제