[C con Clase] Emulando C++ con C

vicente lozano vicentelozano en gmail.com
Vie Ene 29 11:00:56 CET 2010


Hola,

estoy haciendo, por enesima vez, una practica en la que se utilizan
matrices, y por enesima vez, he perdido los sources de matrices que hice en
su dia, asi que para no aburrirme hasta la extenuacion y, de paso, intentar
comprender mejor como funcionan los objetos por dentro, estoy intentando
hacer en C, un tipo matriz, que funcione conceptualmente como un objeto.

*He la definicion y el creador:*

*typedef struct {*
* int filas;*
* int columnas;*
* float* celdas;*
*} _matriz;*
*
*
*typedef _matriz* matriz;*
*
*
*void crearMatriz(matriz* m, int filas, int columas)*
*{*
*     (*m)=malloc(sizeof(_matriz));*
*     (*m)->filas=filas;*
*     (*m)->columnas=columnas;*
*     (*m)->celdas=malloc(filas*columnas*sizeof(float));*
*}*

*He aqui el codigo invocante:*

*void main(){*
* matriz miMatriz;*
* *
* crearMatriz(&miMatriz);*
* eliminarMatriz(&miMatriz);*
*}*

Esto funciona bien, el problema aparece cuando intento* crear otro tipo que
contenga una matriz, por ejemplo:*

*typedef struct {*
* int nodos;*
* matriz matrizDeConectividad;*
*} _grafo;*
*
*
*typedef _grafo* grafo;*

void crearGrafo(grafo* g,int nodos)
{
     (*g)=malloc(sizeof(_grafo));
     (*g)->nodos=nodos;
     crearMatriz((*g)->matrizDeConectividad , nodos,nodos);
}

El problema es que si a la funcion crear matriz le pasamos directamente un
valor "matriz", el malloc no reserva memoria pues no puede cambiar la
direccion del puntero, por lo tanto le tenemos que pasar un puntero a
puntero, necesitamos 2 niveles de indireccion.

Pero en el caso de crearGrafo, la matriz es una parte de un struct asi qeu
no podemos darle 2 niveles de indireccion.

No se si me he explicado muy bien, espero que entendais lo que quiero hacer
y cual es el problema, hoy estoy un poco espeso.

Saludos!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100129/8a35c639/attachment.html>


Más información sobre la lista de distribución Cconclase