2012-04-02 18 views
5

Estoy tratando de pasar una matriz (2d) a una función como parámetro. Tengo un código como sigue:Cómo pasar una matriz bidimensional a una función en C++

int main() 
{ 
    float T[100][100]; 
    void set_T(float T[][]); 
} 


void set_T(float T1[][]) 
{ 


    for (int i =0 ; i<90;i++) 
    { 
     for(int j =0 ;j <90;j++) 
     { 
      T1[i][j] = 3; 
     } 
    } 

} 

No estoy seguro de cómo pasar matriz a una función ... estoy recibiendo gran cantidad de errores. ¿Puede alguien ayudar por favor?

+0

posible duplicado de [pasar matriz 2D a función] (http://stackoverflow.com/questions/8767166/passing-2d-array-to-function) – legends2k

Respuesta

-3

a llamarlo así:

int main() 
{ 
    float T[100][100]; 
    set_T(T); 
} 

Y como @suddnely_me Dicho esto, el tipo de T1 en la declaración de función tienen que ser float**.

+2

'float [] []' y 'float **' son diferentes. –

+0

@Jesse tiene razón. Una matriz 2D estilo C no está implementada como una matriz de * punteros * a las matrices. Es una matriz de matrices, es decir, la primera fila de 100 elementos seguida de la segunda fila de 100 elementos, etc. Por lo tanto, para acceder correctamente a una matriz 2D utilizando la sintaxis C, la función llamada necesita especificar todas menos una dimensión. –

5
void set_T(float (&T)[100][100]); 
8

Hay dos cuestiones aquí:

  • C no soporta matrices 2D, sólo matrices de matrices o arrays de punteros a las matrices, ninguno de los cuales es exactamente lo mismo como una matriz 2D
  • C no permite pasar matrices a funciones como argumentos, solo punteros a matrices (generalmente, utiliza un puntero al elemento 0 de una matriz, ya que así es como termina el nombre de la matriz, por lo que su indexación se parece a un acceso de matriz)

Por lo tanto, debido al primer problema, debe decidir cómo va a representar una matriz 2D: una matriz de matrices o una serie de punteros a matrices. Si usted va la primera ruta, su código termina pareciéndose a:

void set_T(float (*T1)[100]) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float T[100][100]; 
    set_T(T); 
} 

Aquí, ha declarado en T para ser un array de 100 series de 100 flotadores, y set_T toma un puntero a matrices de 100 flotadores como su argumento Pasas 'T' directamente a set_T, ya que el lenguaje trata los nombres de los arreglos como punteros a su 0 ° elemento.

Si por el contrario desea utilizar una matriz de punteros a las matrices, se termina con algo como:

void set_T(float **T1) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float *T[100]; 
    float space[100*100]; 
    for (int i = 0; i < 100; i++) 
     T[i] = space + i*100; 
    set_T(T); 
} 

La desventaja aquí es que se necesita para asignar espacio para todas las matrices de segundo nivel y Inicialice manualmente todos los punteros de primer nivel para señalarlos. La ventaja es que los tamaños de las matrices de segundo nivel no son parte del tipo de argumento pasado a set_T, por lo que puede tratar más fácilmente con matrices de tamaño variable.

Por supuesto, si realmente usa C++ y no C, no debería usar matrices C en absoluto; en su lugar, debe usar std::vector o std::array, que comparten el único problema C array 1D, por lo que necesita un vector de vectores o una matriz de matrices (o posiblemente un vector de matrices o una matriz de vectores)

+0

Siento que su respuesta podría incluir algunas alternativas mejores a 'float (*) [100]' o 'float **' para estar realmente completo. –

Cuestiones relacionadas