¿Cómo devolver una matriz 2D a una función en C?

Soy un progtwigdor de Ruby que terminó desarrollando un código generado para C. Es como pedirle a una limusina que remolque un camión de la década de 1960. De todas formas.

Esto es lo que pensé que debería funcionar pero no funciona.

float[][] pixels() { float x[][]= { {1,1},{2,2} }; return x } void drawLine(float x[][2]) { //drawing the line } //inside main drawLine(pixels()); 

Me he golpeado la cabeza en mi escritorio tratando de hacer que esto funcione. Por favor ayuda.

Pobrecito. En C, los punteros y matrices están estrechamente relacionados. Además, por lo general, debe pasar el tamaño de una matriz como una variable separada. Vamos a empezar con:

 #include  float** createArray(int m, int n) { float* values = calloc(m*n, sizeof(float)); float** rows = malloc(n*sizeof(float*)); for (int i=0; i 

Gracias a todos por sus respuestas y más específicamente por la explicación detallada de la relación matriz-puntero.

Encapsulé la matriz en una estructura.

  struct point_group1 { float x[3]; float y[3]; }; struct point_group1 pixels(){ struct point_group1 temp; temp.x[0] = 0.0; temp.x[1] = 1.0; temp.x[2] = -1.0; temp.y[0] = 0.0; temp.y[1] = 1.0; temp.y[2] = 1.0; return temp; } struct point_group1 points1 = pixels(); axPoly(points1.x, points1.y ,3, 0.0); 

En C/C++ , cuando se pasa una matriz a una función, decae como un puntero que apunta al primer elemento de la matriz. Por lo tanto, en la función de pixels() , está devolviendo la dirección de una variable asignada de stack. La dirección de la variable de retorno ya no es válida porque en pixels() regresa, la variable asignada de stack se sale del scope Por lo tanto, en lugar de eso, debería usar una variable cuyo almacenamiento sea dynamic (es decir, usando malloc, calloc).

Por lo tanto, para una matriz bidimensional, puede usar float** arrayVariable; . Además, si pasa esto a una función, debe tener cuidado con el número de filas y columnas que tiene.

 int rows, columns; float** pixels() { // take input for rows, columns // allocate memory from free store for the 2D array accordingly // return the array } void drawLine( float** returnedArrayVariable ) { //drawing the line } 

Dado que, la matriz 2D está administrando los recursos por sí misma, debería devolver los recursos a la tienda gratuita mediante el uso gratuito .

 float (*pixels(void))[2] { static float x[2][2]= { {1,1},{2,2} }; return x; } void drawLine(float (*x)[2]) { //drawing the line //x[0][0]; } //inside main drawLine(pixels()); 

La forma más sencilla es probablemente declarar la matriz float en main y tener pixels simplemente rellenarlo:

 #define PIXEL_X_SIZE 2 #define PIXEL_Y_SIZE 2 int pixels(float x[][PIXEL_X_SIZE], int len) { /* I don't know if you want the logic of this method to ever change, but this will be roughly equivalent to what you do above */ if (len < PIXEL_Y_SIZE) { /* the length of the passed array is too small, abort */ return -1; } x[0][0] = x[0][1] = 1; x[1][0] = x[1][1] = 2; return 0; } void drawLine(float x[][PIXEL_X_SIZE]) { /* this will work fine */ } int main() { float pixel_array[PIXEL_Y_SIZE][PIXEL_X_SIZE]; pixels(pixel_array, PIXEL_Y_SIZE); drawLine(pixel_array); } 

También puede usar malloc y free y almacenar sus píxeles en el montón, pero si esto es tanto más grande que la matriz de píxeles va a ser, realmente no hay necesidad y solo agrega complejidad adicional para asegurarse de que su memoria siempre se asigne correctamente. liberado.