Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: neo_from_cs_matrix en 4 Septiembre 2011, 19:59 pm



Título: duda doble puntero char a matriz de char
Publicado por: neo_from_cs_matrix en 4 Septiembre 2011, 19:59 pm
yo se que este tema fue discutido pero todavia no entiendo porque esto que compilamdo bien, no funciona. no se porque el compilador no reconoce mi declaracion

Código:
char **mVector = (char**)malloc(sizeof(char)*(filas*columnas));

como si fuera una matriz, mas bien lo reconoce como un vector de vectores,
pero como creo entonces una matriz de  char dinamicamente?

Código:
int main(int argc, char *argv[])
{
int filas=7;
int columnas=16;
char **mVector = (char**)malloc(sizeof(char)*(filas*columnas));

       //memset(mVector, 0, sizeof(char)*(filas*columnas));
       for(int r=0;r<7;r++)
for(int s=0; s<16;s++)
mVector[r][s]=0;

for(int rr=0;rr<7;rr++)
for(int ss=0; ss<16;ss++)
cout << mVector[rr][ss]<<endl;//ERROR al leer!!!!!!!!


free(mVector);


        system("pause");
return 0;
}


http://foro.elhacker.net/programacion_cc/martiz_de_char_doble_puntero-t333527.0.html
en mi anterior tema me dijeron que debia reservar memoria primero para los vectores supongamos que son 7 en mi caso, y despues sus longitudes osea 16,
pero me confunde esta forma de hacerlo, no hay una mas directa asi como en el codigo mostrado ?


>>

esto fue solucionado asi pero como ya digo, no se porque debe hacerse asi por partes y no todo junto (osea multiplicando filas por columas lo cual da la dimension).
...  :¬¬

Código:

void main()
{
        int filas=7;
int columnas=16;
//char** mVector = (char**)malloc(sizeof(char)*(filas*columnas));
char** mVector = (char**)malloc(sizeof(char*)*(filas*columnas));
for(int read=0;read<filas;read++){
mVector[read] = (char*)malloc(sizeof(char)*columnas);
}

//memset(mVector, 0, sizeof(char)*(filas*columnas));
for(int r=0;r<7;r++)
for(int s=0; s<16;s++)
mVector[r][s]='X';

for(int rr=0;rr<7;rr++)
for(int ss=0; ss<16;ss++)
cout << rr << ":" << ss << "  " << mVector[rr][ss]<<endl;

free(mVector);
system("pause");
}

si alguien fuera amable de decirme porque  :rolleyes:
o por deduccion contraria, que es lo que ahce esto entonces  :huh:

Código:
char** mVector = (char**)malloc(sizeof(char)*(filas*columnas));

porque ami forma de apreciarlo esto calcula la dimension total ...



Título: Re: duda doble puntero char a matriz de char
Publicado por: LearningSpanishProgrammer en 4 Septiembre 2011, 21:10 pm
Se recorde que esto:
Código:
char ** m

significa que 'm' es un vector de puntero para un puntero para un (arreglo de) char.

Cuando tu llhama 'malloc' estas pidiendo una region de la memoria con 'sizeof(char) * m * n'. Sin embargo, esta región no es formado por punteros para punteros para char. Esta region es lineal.

Pero lo compilador no sabes que quieres usar esto como una matriz.

Esto
Citar
char m[15][15]
no es
Citar
char **m;

El primero es una matriz asignados contiguamente, lo segundo es un puntero para puntero (? para arreglo) de char. Pero, el puntero debe apuntar para una memoria asignada por 'malloc'

Mi español no es muy bueno, pero, lamento no ser capaz de explicar mejor

Para leer más tarde:
http://foro.elhacker.net/programacion_cc/duda_con_arreglo_bidimensional_dinamico_en_ide_devc-t337905.0.html;msg1658904#msg1658904


Título: Re: duda doble puntero char a matriz de char
Publicado por: neo_from_cs_matrix en 5 Septiembre 2011, 03:32 am
grax
y aparte el memset no anda bien de esta forma

Código:
// memset(mVector, 0, sizeof(char)*(filas*columnas));//no sirve para la asignacion de memoria anterior!!!!!!!

el memset debe aserse por partes tmb ?



Título: Re: duda doble puntero char a matriz de char
Publicado por: rir3760 en 5 Septiembre 2011, 03:53 am
En el primer programa la llamada a "memset" es correcta, el problema como ya te indicaron se debe a la forma en que tratas de acceder al bloque de memoria.

Si reservas un solo bloque por supuesto basta con una sola llamada a "memset", si reservas varios pues, varias llamadas.

Pero si, como sugiere el programa, lo primero que haces es asignarles un valor a cada elemento del bloque no es necesaria la llamada (o llamadas, según el caso) a esa función.

Un saludo