2010-12-07 2 views
0

첫 번째 오류 :C - 1 차원 배열을 두 개로 매핑 - 왜 작동하지 않습니까?

error: a value of type "float *" cannot be used to initialize an entity of type "float (*)[2000]" 

을 Heres 관련 코드 : 내가 나중에 함수에 이중 포인터를 전달하고 참조 할 수 있도록 두 가지 차원으로 정상화를 시도하고

#define opType float 
const int N = 2000; 
opType *a_h,*b_h,*d_h, *a_d,*b_d, *d_d; 
opType (*normalized_a)[N] = a_h; 
opType (*normalized_b)[N] = b_h; 
opType (*normalized_d)[N] = d_h; 

opType (*normalized_a_d)[N] = a_d; 
opType (*normalized_b_d)[N] = b_d; 
opType (*normalized_d_d)[N] = d_d; 

속기 브래킷 구문을 사용하는 두 가지 차원 CUDA를 사용하고 있으므로 메모리를 복사하는 데 일차원 선언이 있어야합니다. 위의 작업을 수행 할 수있는 방법이 있습니까?

이 구조는 배열 초기화에 대한 데이터가 어디에서 오는지 내가 볼 수없는 http://forums.nvidia.com/index.php?showtopic=83941&view=findpost&p=475901

int linear[10*32]; // linear array 
int (*twodim)[32] = linear; // interpreted as a two-dimensional [10][32] array. 
assert(&twodim[2][4] == &linear[2*32 + 4]); // these are the same 
+2

'typedef '를 사용하십시오. – nmichaels

+0

잘 들어, 나는 미래를 염두에 두겠다. –

답변

2

에서 차용되지만 오류 메시지는 매우 분명하다 당신은 6 개 배열 된 각각의 선언 2000 개의 float 포인터를 포함합니다. 물론 이러한 배열 중 하나를 하나의 float 포인터로 초기화 할 수는 없습니다.

기본 데이터는 어떤 형식이며 어떻게 사용 하시겠습니까?

편집 : 값 가득

float myData[N][N]; 

같은 OK, 당신의 의견에 따라 당신이 가지고 뭔가. 이 양식에서는 이미 myData [i] [j]로 액세스 할 수 있습니다. 지금, 당신은 당신이 또한 myDataFlat를 통해 액세스 할 수 있습니다

float *myDataFlat = (float*)myData; 

같은 플로트 포인터에 이상 던져 경우 [내가 N +의 J를 *].

+0

편집을 참조하십시오, 내 기본 데이터는 N * N 수레로 할당됩니다. 나는 기본적으로'float x [N] [N]'을 직렬화하려하지만 직렬 형태뿐만 아니라 어떤 형태로도 2 차원 (double pointer) 인 것처럼 그것을 참조 할 수있다. –

0

배열을 변수로 초기화 할 수 없습니다. 일부 회원은 constant으로 초기화 할 수 있습니다.

opType (*normalized_a)[N] = {0}; /* all members 0 */ 

또는 당신은 루프 또는 memset 함수를 사용할 수 있습니다 이 경우가 될 것이다.

0

저는 C 전문가가 아닙니다. 그 오류는 C++에서와 같이 형식 불일치로 인한 것 같습니다.
과제 수행 중 일부 캐스팅을해야한다고 생각합니다. 읽을 수있게하려면 typedef를 입력해야합니다.

typedef float opType; 
const int N = 2000; 
typedef opType (*TPointerToArray)[N]; // may be defined outside of a function 
opType *a_h; // no value assigned yet 
TPointerToArray normalized_a; // no value assigned yet 

void MyCode() 
{ 
    ... 
    a_h = ...; // i don't know how the value is assigned; it should be done first 
    ... 
    normalized_a = (TPointerToArray)a_h; // "normalization" 
    normalized_a[100][200] = 900; // usage 
    ... 
} 

나는 재미를 위해서만 전역 변수를 사용한다고 가정합니다. 별로 중요하지 않습니다.
이 코드에서 기술적으로 normalized_a는 배열에 대한 포인터이지만 배열 배열 또는 2 차원 배열로 생각할 수 있습니다.

관련 문제