duda doble puntero char a matriz de char

Iniciado por neo_from_cs_matrix, 4 Septiembre 2011, 19:59 PM

0 Miembros y 1 Visitante están viendo este tema.

neo_from_cs_matrix

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


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?


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).
...  :¬¬



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:


char** mVector = (char**)malloc(sizeof(char)*(filas*columnas));


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


LearningSpanishProgrammer

Se recorde que esto:

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
Estoy aprendiendo español, y tu estas aprendiendo programación

neo_from_cs_matrix

grax
y aparte el memset no anda bien de esta forma


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


el memset debe aserse por partes tmb ?


rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language