PDA

Ver la versión completa : [Programación] Punteros y estructuras C



turco
20/01/2010, 19:47
Hola a todos.

¿Que estoy haciendo mal en esta función? :loco:



typedef struct {
void* hScroll;
void* vScroll;
void* viewPort;
} MG_ScrollPane;

void* MG_GetScrollPaneComponents(MG_ScrollPane* scrollPane) {
MG_Component* comps = (MG_Component*) calloc( 3, sizeof(MG_Component) );

comps[0] = (MG_Component*) scrollPane->hScroll; // linea 399
comps[1] = (MG_Component*) scrollPane->vScroll; // linea 400
comps[2] = (MG_Component*) scrollPane->viewPort; // linea 401

return comps;
}

Todos los miembros de la structura MG_ScrollPane son punteros a MG_Component, pero tengo que declararlos como void* porque tengo referencias cruzadas.

Al compilar me lanza el error:


MG_ScrollPane.c:399: error: tipos incompatibles en la asignación
MG_ScrollPane.c:400: error: tipos incompatibles en la asignación
MG_ScrollPane.c:401: error: tipos incompatibles en la asignación


Gracias de antemano.
Un saludo.

<--->

Creo que lo he solucionado con esto. Aun no lo he probado pero al menos no me da error al compilar.


void* MG_GetScrollPaneComponents(MG_ScrollPane* scrollPane) {
MG_Component* comps = (MG_Component*) calloc( 3, sizeof(MG_Component) );
MG_Component* tempPointer = comps;

tempPointer = (MG_Component*) scrollPane->hScroll;
tempPointer++;
tempPointer = (MG_Component*) scrollPane->vScroll;
tempPointer++;
tempPointer = (MG_Component*) scrollPane->viewPort;

return comps;
}


He visto que el problema era que al acceder por un índice como si se tratase de un vector, no se accede a una dirección sino a su contenido. Espero que esto me sirva :D

juanvvc
20/01/2010, 21:05
Entiendo que comps tiene que ser un array de punteros, pero tal como lo estás definiendo es solo un puntero. Creo que lo que está bien es algo así:



void* MG_GetScrollPaneComponents(MG_ScrollPane* scrollPane) {
MG_Component** comps = (MG_Component**) calloc( 3, sizeof(MG_Component*) ); // fíjate en los asteriscos

comps[0] = (MG_Component*) scrollPane->hScroll; // linea 399
comps[1] = (MG_Component*) scrollPane->vScroll; // linea 400
comps[2] = (MG_Component*) scrollPane->viewPort; // linea 401

return comps;
}


En el otro códgo que propones no solucionas nada, solo lo enmascaras porque tempPointer es, de nuevo, un puntero. Te dará error en ejecución.

Por cierto, no he entendido por qué no puedes declarar la estructura como:


typedef struct {
MG_Component* hScroll;
MG_Component* vScroll;
MG_Component* viewPort;
} MG_ScrollPane;

SplinterGU
20/01/2010, 21:46
esta mal lo que estas haciendo...


esto es un puntero a un array de comps...

MG_Component* comps = (MG_Component*) calloc( 3, sizeof(MG_Component) );

aca estas asignando MG_Component* (puntero) a MG_Component (dato)

comps[0] = (MG_Component*) scrollPane->hScroll; // linea 399
comps[1] = (MG_Component*) scrollPane->vScroll; // linea 400
comps[2] = (MG_Component*) scrollPane->viewPort; // linea 401

No se que es lo que queres hacer, si guardar los punteros o los datos. Cada [] del array es el elemento/dato no su puntero...

si queres guardar el puntero, entonces deberias cambiar esto...

MG_Component* comps = (MG_Component*) calloc( 3, sizeof(MG_Component) );

por esto

MG_Component** comps = (MG_Component**) calloc( 3, sizeof(MG_Component*) );

si lo que queres es guardar el dato/elemento, entonces tenes que cambiar esto...

comps[0] = (MG_Component*) scrollPane->hScroll; // linea 399
comps[1] = (MG_Component*) scrollPane->vScroll; // linea 400
comps[2] = (MG_Component*) scrollPane->viewPort; // linea 401

por esto

comps[0] = *(MG_Component*) scrollPane->hScroll; // linea 399
comps[1] = *(MG_Component*) scrollPane->vScroll; // linea 400
comps[2] = *(MG_Component*) scrollPane->viewPort; // linea 401

suponiendo que hScroll, vScroll y viewPort son punteros al dato de tipo MG_Component.

edit: como bien te puso juanvvc

turco
20/01/2010, 23:48
Antes de nada muchas gracias a los dos, teneis razón.

Lo que quería era devolver tres punteros a MG_Component indicando la dirección del primero de ellos para despuer acceder a los otros como si fuesen un array.

Me quedo con esto:

void* MG_GetScrollPaneComponents(MG_ScrollPane* scrollPane) {
MG_Component** comps = (MG_Component**) calloc( 3, sizeof(MG_Component*) ); // fíjate en los asteriscos

comps[0] = (MG_Component*) scrollPane->hScroll; // linea 399
comps[1] = (MG_Component*) scrollPane->vScroll; // linea 400
comps[2] = (MG_Component*) scrollPane->viewPort; // linea 401

return comps;
}

Muchas gracias de nuevo.