[C con Clase] Problema conceptual al pasar por referencia array de 2 dimensiones en C

Diego diegogeid en gmail.com
Mie Jun 10 22:48:59 CEST 2015


Hola, gracias a ambos. Ambos tienen razón en decir que los arrays
bidimensionales no se tratan de igual forma que punteros dobles, no
los organiza de esa forma.

El error surgió porque, tal como un array se puede direccionar como
una variable a puntero debido a su organización de memoria, asumí que
un array bidimensional se puede interpretar como un array de punteros
a punteros, NO SE ORGANIZA ASÍ EN MEMORIA, en realidad es un array de
[MxN], de esa forma, Horacio, la solución que brindas solo sirve para
los elementos de la primera fila. El parámetro a pasar, como bien
indicas Horacio es un puntero a float, y para utilizar el elemento M,
N debería usar referencia[M*5+N], creo que es la solución que indicás
Felipe, o definir el pasaje de referencia como referencia[5][5] en el
prototipo de la función, o en un tercer caso, definir como puntero a
puntero correctamente, inicializar y ahí direccionar como hice adentro
de la función. Ese caso sería mas eficiente si voy a utilizar varias
veces los índices.

Finalmente, Felipe, entiendo que puede haber diferencias en el tamaño
de datos, pero no creo que influya el tamaño de datos en el problema,
siempre que se asigne correctamente como puntero a float, mas allá de
la arquitectura, agradezco si es una aclaración, si es una confusión,
no dudes en plantearla.

Saludos y gracias a ambos!
Diego





El día 10 de junio de 2015, 17:03, Felipe Valencia <anfevp en gmail.com> escribió:
> Hola,
>
> Esencialmente existe una diferencia entre como se organizan los dople
> punteros y las matrices de dos dimensiones. Las marices de dos dimensiones
> se organizan consecutivamente y los dobles punteros estan esparcidos en
> memoria.
>
> Mira este enlace
> http://stackoverflow.com/questions/4470950/why-cant-we-use-double-pointer-to-represent-two-dimensional-arrays
> (Ingles)
>
> De hecho en la posicion test[1] esta el valor de la siguiente linea, seria
> un 6 si continuaras con la inicializacion, y en la posicion referencia[1]
> sera leida como la direccion de la siguiente linea.
>
> Ademads en PC de  64 bits los punteros son de 64 bits y los float son de 32
> bits. Agrega la linea printf("Size %d %d \n",sizeof(float*),sizeof(float));
>
> Yo usualmente en estos casos uso matrices de una dimension en vez de dos
> dimensiones, y calculo los indices, o solo uso punteros reservando memoria
> con malloc o new.
>
> Ademas uso como IDE eclipse el cual trae un debuggeador donde puedes vez los
> valores en memoria, supongo que Code::Blocks tambien debe mostrar memoria
>
>
> Chao!!
>
>
>
>
> El 10 de junio de 2015, 20:17, Diego <diegogeid en gmail.com> escribió:
>>
>> Hola, saludos a todos.
>>
>> Aparentemente estoy teniendo un error conceptual. Copio el código
>> abajo. Alguien podría ayudarme?
>>
>> Al intentar acceder a un elemento del aray desde el main no tengo
>> problemas, pero al intentar acceder desde una función el programa
>> retorna al sistema operativo un código de error (0xC0000005) y
>> porsupuesto que no continúa.
>>
>> Según los printf, los punteros apuntan a la misma posicion de memoria
>> tanto en el main como en la función, que estoy haciendo mal?
>>
>> PD: estoy compilando en Windows mediante Code::Blocks en Windows
>> mediante gcc, el error que da, según google, corresponde a una
>> violación de acceso a memoria.
>>
>> Saludos y gracias!
>>
>> ----------------------------------------------
>>
>> #include <stdio.h>
>> #include <stdlib.h> //No es necesario
>>
>> void probar(float **referencia)
>> {
>>
>>     printf("La posición de memoria donde empieza el array
>> multidimensional es %p\n", referencia);
>>
>> //No imprime el siguiente printf y vuelve al ssitema con un error
>> 0xC0000005
>>
>>     printf("test: %f %f...!\nPuntero: %p\n", referencia[0][0],
>> referencia[0][1], referencia);
>> }
>>
>> int main()
>> {
>>     float test[5][5]={1, 2, 3, 4, 5};
>>
>>     printf("La posición de memoria donde empieza el array
>> multidimensional es %p\n", test);
>>
>>     printf("test: %f %f...!\nPuntero: %p\n", test[0][0], test[0][1],
>> test);
>>
>>     probar(test);
>>
>>     return 0;
>> }
>>
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
>
>
>
> --
> Andrés Felipe Valencia P
> MSc student
> ALaRI - Advanced Learning and Research Institute USI - Università della
> Svizzera Italiana
> Via Giuseppe Buffi 13, Lugano CH-6904, Switzerland
> Mobile: + 41 076 822 27 57
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




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