2009-08-10 7 views
2

J'ai un tableau de float rtmp1 [NMAX * 3] [3], et il est utilisé comme rtmp1 [i] [n], où n est de 0 à 2, et Je vais de 0 à 3 * NMAX - 1. Cependant, je voudrais convertir rtmp1 en rtmp1 [3 * 3 * NMAX]. Est-ce que l'adressage de ce nouveau tableau 1D comme rtmp1 [3 * i + n] serait équivalent à rtmp1 [i] [n]? Merci d'avance pour les clarifications.C++: tableaux 2D vs. différences de tableaux 1D

+0

Ne devrais-je pas être de 0 à (3 * NMAX) - 1? – KTC

+0

Clarification s'il vous plaît. Voulez-vous dire "i est de 0 à 2" ou rtmp1 [3 * 4 * NMAX]? –

+0

@KTC: oui, et je l'ai corrigé @bill tisserand: S'il vous plaît clarifier votre question. – stanigator

Répondre

4

rtmp1 [i] [n] est équivalent à rtmp1 [i * NMAX + n]

Voir http://www.cplusplus.com/doc/tutorial/arrays/, où votre Nmax leur largeur.

+0

Le but principal de ce que j'essayais de faire est de convertir d'un tableau 2D en un tableau pseudo-2D. Votre réponse est celle que j'accepte. Merci. – stanigator

0

Oui, mais qu'est-ce que vous essayez de prouver en faisant cela? rtmp1 [i] [n] aurait très probablement un meilleur temps d'exécution et serait plus facile à lire.

"En fait, vous voudriez utiliser rtmp [i + 3 * n]" quelle est la différence? Tout ce que vous faites est d'échanger des adresses.

+0

J'essaie de faire en sorte que rtmp1 soit dynamiquement assigné pour être un tableau 1D, car je ne connais pas sa taille avant l'exécution. NMAX est un très grand nombre à allouer statiquement, dont l'implémentation actuelle est très ghetto quand il s'agit de consommation de mémoire. – stanigator

0

Je ne suis pas sûr que cela ne brise pas certaines règles de prévention des alias. Ma lecture est que c'est OK, mais j'ai déjà eu tort et toute la zone est parfois confuse et audacieuse pour savoir laquelle de deux règles contradictoires dans différentes parties de la norme a la priorité.

Exemple:

typedef float Point[3]; 

void f(float* tab, Point* pt) 
{ 
    (*pt)[2] = 6; 
    // I don't think the compiler can assume that (*pt)[2] isn't modified by 
    tab[5] = 3.141592; 

}

// context which give a problem if I'm wrong. 
float rtmp1[NMAX*3][3]; 
float *ptr = &rtmpl[0][0]; 
f(ptr, rtmpl[1]);