c casting multidimensional-array void-pointers

casting void** a la matriz 2D de int-C



multidimensional-array void-pointers (1)

El compilador tiene razón, una matriz de matrices (o un puntero a una matriz) no es lo mismo que un puntero a un puntero. Solo piense en cómo se presentarían en la memoria:

Una matriz de tamaño MxN en forma de una matriz de matrices:

+--------------+--------------+-----+----------------+--------------+-----+------------------+ | matrix[0][0] | matrix[0][1] | ... | matrix[0][N-1] | matrix[1][0] | ... | matrix[M-1][N-1] | +--------------+--------------+-----+----------------+--------------+-----+------------------+

A y la misma "matriz" en forma de puntero a puntero:

+-----------+-----------+-----------+-----+ | matrix[0] | matrix[1] | matrix[2] | ... | +-----------+-----------+-----------+-----+ | | | | | V | | +--------------+--------------+-----+ | | | matrix[2][0] | matrix[2][1] | ... | | | +--------------+--------------+-----+ | | | V | +--------------+--------------+-----+ | | matrix[1][0] | matrix[1][1] | ... | | +--------------+--------------+-----+ | V +--------------+--------------+-----+ | matrix[0][0] | matrix[0][1] | ... | +--------------+--------------+-----+

No importa si asigna el tamaño correcto, las dos variables simplemente son incompatibles, que es lo que le dice su compilador.

Estoy tratando de lanzar un puntero void ** a una matriz int ** 2D en C

aquí está el código con el que estoy tratando de trabajar (con todos los bits extraños eliminados):

/*assume that i have a data structure called graph with some *element "void** graph" in it and some element "int order" */ void initialise_graph_data(graph_t *graph) { void **graph_data = NULL; int (*matrix)[graph->order]; size_t size = (graph->order * graph->order) * sizeof(int); graph_data = safe_malloc(size); /*safe malloc works fine*/ matrix = (int(*)[graph->order])graph_data; graph->graph = graph_data; }

cuando compilo eso, funciona bien, pero me da una advertencia de que la variable ''matriz'' está configurada pero no utilizada. Realmente no quiero tener que usar la variable de matriz interina porque la función se supone que inicializa la matriz, no pone nada en ella; pero si trato de lanzar graph_data directamente a un int ** cuando lo estoy asignando para graficar-> graph así:

graph->graph = (int(*)[graph->order])graph_data;

me da una asignación de advertencia de tipo de puntero incompatible.

¿No lo estoy lanzando correctamente? ¿Alguien tiene alguna sugerencia sobre cómo puedo hacerlo funcionar sin la variable interina "matriz"? o si no, ¿qué puedo hacer con esa variable para que no me dé la advertencia de que está configurada pero no utilizada?

Gracias