2010-12-07 4 views
0

d'abord l'erreur:C - Mapper un tableau dimensionnel en deux - Pourquoi cela ne fonctionne-t-il pas?

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

Heres le code correspondant:

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

Je cherche à normaliser à deux dimensions afin que je puisse passer un double pointeur vers une fonction plus tard et faire référence à la deux dimensions en utilisant la syntaxe des parenthèses courtes. J'utilise CUDA donc je dois avoir des déclarations unidimensionnelles pour la copie de la mémoire. Y at-il un moyen de faire ce qui précède?

Cette construction est empruntée à 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

Regardez dans l'utilisation de 'typedef'. – nmichaels

+0

Bonne prise, je garderai ça à l'esprit pour l'avenir. –

Répondre

2

Je ne vois pas où les données de votre initialisation de tableau vient, mais le message d'erreur est tout à fait clair: Vous déclarez 6 tableaux, dont chacun contient 2000 pointeurs flottants. Bien sûr, vous ne pouvez pas initialiser l'un de ces tableaux avec un seul pointeur flottant.

Alors sous quelle forme sont vos données de base et comment voulez-vous l'utiliser?

Edit: OK, en fonction de votre commentaire que vous avez quelque chose comme

float myData[N][N]; 

rempli de valeurs. Dans ce formulaire, vous pouvez déjà y accéder en tant que myData [i] [j]. Maintenant, si vous venez de le lancez sur un pointeur flottant comme

float *myDataFlat = (float*)myData; 

vous pouvez également y accéder via myDataFlat [i * N + j].

+0

Voir modifier, mes données de base sont allouées en N * N flottants. Essentiellement, j'essaie de sérialiser 'float x [N] [N]', mais je peux toujours me référer à lui comme s'il s'agissait de deux dimensions (double pointeur) sous une forme ou sous une forme sérielle. –

0

Vous ne pouvez pas initialiser un tableau à une variable. Vous pouvez initialiser certains membres à constant. Dans ce cas, il serait:

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

ou vous pouvez utiliser une boucle ou memset.

0

Je ne suis pas un expert en C; Je suppose que l'erreur est due à une incompatibilité de type (comme cela aurait été le cas en C++).
Je pense que vous devez faire du casting en mission. Pour lisible, vous devez faire introduire un 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 
    ... 
} 

Je suppose que vous utilisez des variables globales juste pour le plaisir; ça n'a pas beaucoup d'importance.
Dans ce code, techniquement, normalized_a est un pointeur vers un tableau mais je peux y penser comme un tableau de tableaux ou un tableau bidimensionnel.

Questions connexes