es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Advertencia: se está devolviendo ‘float (*)[3]’ desde una función con un tipo de retorno incompatible ‘float *’

Estoy recibiendo el error ‘warning: returning ‘float (*)[3]’ from a function with incompatible return type ‘float *’ cuando estoy tratando de devolver un array en una función. He leído que en C hay problemas para devolver arrays pero realmente no entiendo por qué ni qué hacer para solucionarlo. Este es mi código:

float * buildlocs(int L, int W, int H){
int c = 0, xmin, xmax, x, ymin, ymax, y, h;
unsigned int nX, nY;
L = L/4;
W = W/4;
float cellarray[16][3];


for(nX = 0; nX < 4;nX++) {
    for(nY = 0; nY < 4;nY++) {
        xmin = 0+L*(nX-1);
        xmax = L*nX;
        x = xmin+rand()*(xmax-xmin);

        ymin = 0+W*(nY-1);
        ymax = W*nY;
        y = ymin+rand()*(ymax-ymin);

        h = rand()*H;

        for(int i = 0; i < 3; i++){
            if(i == 0){
                cellarray[c][i] = x;                     
            }
            if(i == 1){
                cellarray[c][i] = y;  
            }
            if(i == 2){
                cellarray[c][i] = h;
            }

        }

        c = c + 1;
    }
}

return cellarray;
}

El objetivo es tener una matriz bidimensional con 16 entradas que contengan 3 variables. ¿Podría alguien ayudarme a corregir el error, por favor?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que la función está devolviendo un puntero a un arreglo de floats con tamaño [16][3] (float (*)[3]), pero se espera que el tipo de retorno sea un puntero a un solo float (float *).

    El problema con devolver arreglos en C es que los arreglos se degradan a punteros cuando se pasan o devuelven como argumentos de función. Esto significa que no se devuelve los datos reales del arreglo, sino solo un puntero a su primer elemento. En el caso de un arreglo multidimensional, como el utilizado en el código, el puntero devuelto apuntaría a la primera fila en memoria, pero sin ninguna información sobre el número de columnas o filas.

    Para solucionar el error y devolver un puntero al arreglo, una opción es asignar dinámicamente el arreglo utilizando malloc, lo cual garantizará que la memoria para el arreglo persista después de que la función haya finalizado. Esto implicaría cambiar la definición de la función a float (*)[3] buildlocs(int L, int W, int H) y utilizar malloc para asignar memoria para el arreglo:

    float (*cellarray)[3] = malloc(16 * sizeof(float[3]));
    

    Luego, los valores pueden ser asignados al arreglo accediendo a cada elemento utilizando la aritmética de punteros:

    cellarray[c][0] = x;
    cellarray[c][1] = y;
    cellarray[c][2] = h;
    

    Finalmente, la función devolvería el puntero al arreglo:

    return cellarray;
    

    Es importante tener en cuenta que la memoria asignada con malloc debe ser liberada utilizando free cuando ya no se necesite, para evitar fugas de memoria.

    Alternativamente, el arreglo podría ser definido fuera de la función y pasado como argumento, permitiendo que la función modifique sus valores directamente, sin necesidad de devolver un puntero a este. Esto implicaría cambiar la definición de la función a void buildlocs(float cellarray[][3], int L, int W, int H) y pasar el arreglo como argumento:

    float cellarray[16][3];
    buildlocs(cellarray, L, W, H);
    

    Dentro de la función, los valores pueden ser asignados al arreglo directamente:

    cellarray[c][0] = x;
    cellarray[c][1] = y;
    cellarray[c][2] = h;
    

    Con este enfoque, no es necesario devolver un puntero al arreglo, pero los datos del arreglo solo persistirán mientras estén en alcance, ya que se asignan en la pila.

Comments are closed.