Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] realloc array 3 dimensiones char

Estas en el tema de realloc array 3 dimensiones char en el foro de C/C++ en Foros del Web. Me pueden hechar una mano,tengo una funcion que tiene como parametro un arreglo de tipo char de 2 dimensiones y tengo un arreglo de 3 ...
  #1 (permalink)  
Antiguo 20/10/2014, 22:03
 
Fecha de Ingreso: febrero-2008
Mensajes: 8
Antigüedad: 16 años, 2 meses
Puntos: 0
realloc array 3 dimensiones char

Me pueden hechar una mano,tengo una funcion que tiene como parametro un arreglo de tipo char de 2 dimensiones y tengo un arreglo de 3 dimensiones donde meto esta informacion pero necesito redimensionarla en 1 cada vez que entra,vamos que la primera vez [5][1],la segunda vez es [5][2] y asi susesivamente tengo este codigo

Código:
if (record_count==0) //primero verificamos esta variable para saber si hay que inicializar el arreglo
    {
        arr_number=argc;
        Col_name=azColName;
        rows=(char *** )calloc(argc, sizeof(char ** )) ; //se inicializa el array dependiendo de la variable argc
        for(int i = 0 ; i < argc; i++ )
        {
            rows[i] = (char ** ) calloc(1,sizeof(char * )) ;
        }

    }
    else{ //si ya se inicializo entonces solo reasignamos memoria

        for(int i = 0 ; i < argc; i++ )
        {
            rows[i] = (char ** ) realloc(rows[i],(record_count+1) * sizeof(char * )) ;
        }
    }

 for(i=0;i<argc;i++)
 {
 for(j=record_count; j<(record_count+1) ; j++ )
 {
   s=argv[i];
   rows[i][j]=argv[i];
 }
 }
el problema es que si lo hace, pero copia 2 veces la misma información y después 3 y así sucesivamente,y lo que tenia anteriormente lo borra y se va duplicando,alguien me hecha una mano.
  #2 (permalink)  
Antiguo 21/10/2014, 00:07
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: realloc array 3 dimensiones char

Cita:
Iniciado por luvac Ver Mensaje
Me pueden hechar una mano,tengo una funcion que tiene el problema es que si lo hace, pero copia 2 veces la misma información y después 3 y así sucesivamente,y lo que tenia anteriormente lo borra y se va duplicando,alguien me hecha una mano.
Código C++:
Ver original
  1. for(i=0;i<argc;i++)
  2.  {
  3.    for(j=record_count; j<(record_count+1) ; j++ )
  4.    {
  5.      s=argv[i];
  6.      rows[i][j]=argv[i];
  7.    }
  8.  }

Ahí estás asignando argv[i] a cada elemento de rows[i], es decir, que si record_count vale 9, los elementos de rows[i][0] a rows[i][9] van a apuntar al mismo sitio: argv[i]

¿Es ese tu problema?
  #3 (permalink)  
Antiguo 21/10/2014, 07:44
 
Fecha de Ingreso: febrero-2008
Mensajes: 8
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: realloc array 3 dimensiones char

No entiendo?,argv[i] es un array de 2 dimensiones tipo char y cada vez que entra a la funcion argv trae nuevos datos,record_count se incrementa cada vez que sale entonces la primera vez vale 0 y va de 0 al 1,entonces solo agrega 1 elemento a la lista de row cuando termina incrementa en 1 y asi susesivamente creo que no puse el codigo completo lo anexo aqui:

Código:
 int Tadquery::callback(int argc, char **argv, char **azColName){
int i,j,h;
h=0;
char *s;

    if (record_count==0)
    {
        arr_number=argc;
        Col_name=azColName;
        rows=(char *** )calloc(argc, sizeof(char ** )) ;
        for(int i = 0 ; i < argc; i++ )
        {
            rows[i] = (char ** ) calloc(1,sizeof(char * )) ;
        }

    }
    else{

        for(int i = 0 ; i < argc; i++ )
        {
            rows[i] = (char ** ) realloc(rows[i],(record_count+1) * sizeof(char * )) ;
        }
    }

 for(i=0;i<argc;i++)
 {
   for(j=record_count; j<(record_count+1) ; j++ )
   {
     s=argv[i];//esto no lo tomes en cuenta solo lo hize para saber que datos traia
     rows[i][j]=argv[i];
   }
 }
system("cls");
 for(i=0;i<argc;i++)
 {
 for(j =0 ; j < (record_count+1) ; j++ )
 {
  printf("%s \n",rows[i][j]);
 }
 }

record_count++;
return 0;
}
Una disculpa

Última edición por luvac; 21/10/2014 a las 07:53
  #4 (permalink)  
Antiguo 21/10/2014, 08:18
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: realloc array 3 dimensiones char

Código C++:
Ver original
  1. for(i=0;i<argc;i++)
  2.  {
  3.    for(j=record_count; j<(record_count+1) ; j++ )
  4.    {
  5.      rows[i][j]=argv[i];
  6.    }
  7. }

El bucle en cuestión... esto es lo que hace:
  • supongo que "record_count" vale 1 y argc 3 (por ejemplo)
  • i=0, j=0 =>rows[0][0] = argv[0]
  • i=0, j=1 =>rows[0][1] = argv[0] <-- Nota que en [0,0] y [0,1] estás guardando lo mismo
  • i=1, j=0 => rows[1][0] = argv[1]
  • i=1, j=1 => rows[1][1] = argv[1] <-- Vuelves a duplicar valores
  • i=2, j=0 => rows[2][0] = argv[2]
  • i=2, j=1 => rows[2][1] = argv[2] <-- Vuelves a duplicar valores

Al final, en "rows" tendrás el siguiente contenido:

Código:
argv[0]    argv[0]
argv[1]    argv[1]
argv[2]    argv[2]
En la siguiente llamada al código, el susodicho bucle volvería a ejecutarse y la matriz "rows" quedaría tal que:

Código:
argv[0]    argv[0]    argv[0]
argv[1]    argv[1]    argv[1]
argv[2]    argv[2]    argv[2]
Mi pregunta es si te refieres a este efecto cuando has dicho que te duplicaba el contenido.
  #5 (permalink)  
Antiguo 21/10/2014, 08:32
 
Fecha de Ingreso: febrero-2008
Mensajes: 8
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: realloc array 3 dimensiones char

Si a eso me referia,he cambiado esa parte a esto:

Código:
 
for(i=0;i<argc;i++)
 {
   rows[i][record_count]=argv[i];
 }
Pero lo sigue duplicando,¿sigue estando mal?
  #6 (permalink)  
Antiguo 21/10/2014, 08:57
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: realloc array 3 dimensiones char

La pregunta no es si ese código está funcionando mal... la pregunta es ¿qué es lo que pretendes hacer?
  #7 (permalink)  
Antiguo 21/10/2014, 09:11
 
Fecha de Ingreso: febrero-2008
Mensajes: 8
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: realloc array 3 dimensiones char

tengo esta función "int Tadquery::callback(int argc, char **argv, char **azColName)" que recibe entre otros un arreglo de 2 dimensiones tipo char (argv) lo que pretendo es meter esa información en otro arreglo en este caso de 3 dimensiones ¿porque? bueno para tenerla almacenada y acomodada,así si el argc marca 5 bueno entonces [0][0],[1][0],[2][0] , [3][0] y [4][0] por ejemplo tiene el primer registro que mando, después si se vuelve a llamar entonces incrementamos y ahora [0][1],[1][1],[2][1],[3][1] y [4][1] tienen el segundo registro que mando y así sucesivamente,para después en otra función si el usuario requiere la información se puede buscar mas fácil. Saludos
  #8 (permalink)  
Antiguo 21/10/2014, 10:08
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: realloc array 3 dimensiones char

Bueno, tal cual lo cuentas, tu código ya está haciendo eso.

Eso si, tienes que tener en cuenta que no estás copiando el contenido de los punteros sino que estás copiando los punteros en sí... eso quiere decir que un cambio en uno de los elementos de la matriz conlleva a que dicho cambio se va a reflejar en las otras "filas" de la matriz. Por ejemplo, un cambio en el contenido apuntado por [0][1] se reflejará también en [1][1], [2][1], [3][1], ...

Me explico:

Código C++:
Ver original
  1. int var = 4;
  2. int* ptr1 = &var;
  3. int* ptr2 = &var;
  4.  
  5. *ptr1 = 8;
  6.  
  7. printf( "%d %d %d", var, *ptr1, *ptr2 );

El ejemplo anterior va a imprimir "8 8 8"...

Por otro lado, dado que cada vez que incrementas el tamaño de la matriz la vuelves a rellenar de cero como si no tuviese valores previos, puedes cambiar tranquilamente el realloc por un malloc y un free... realloc tiene la mala costumbre de hacer una copia de la región vieja de memoria a la nueva... te puedes ahorrar ese tiempo si no lo necesitas.
  #9 (permalink)  
Antiguo 21/10/2014, 12:02
 
Fecha de Ingreso: febrero-2008
Mensajes: 8
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: realloc array 3 dimensiones char

Si creo que estoy copiando los punteros (me lleva!!!),¿como le hago para copiar el contenido del array?
  #10 (permalink)  
Antiguo 21/10/2014, 13:41
 
Fecha de Ingreso: febrero-2008
Mensajes: 8
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: realloc array 3 dimensiones char

Bueno tenias razon copiaba el puntero mas no la informacion,la maña que tengo por usar ides visuales,pero bueno el codigo quedo asi por si alguien le sirve:
Código:
if (record_count==0)
{
 rows=(char *** )calloc(1, sizeof(char ** )) ;
    for(int i = 0 ; i <1; i++ )
    {
        rows[i] = (char ** ) calloc(argc,sizeof(char * )) ;
        for ( int j = 0 ; j < argc ; j++ )
        {
            rows[i][j] = (char *) calloc(sizeof(argv[i]),sizeof(char));
        }
    }

}
else {
  if ((rows=(char *** )realloc(rows,(record_count+1)*sizeof(char ** )))==NULL)
        printf("Error");
    for(i =record_count ; i < record_count+1; i++ )
    {
       rows[i] = (char ** ) calloc(argc,sizeof(char * )) ;
        for (j = 0 ; j < argc ; j++ )
        {
           rows[i][j] = (char *) calloc(sizeof(argv[i]),sizeof(char));
        }
    }

}
Gracias eferion por hacerme ver mi error.
  #11 (permalink)  
Antiguo 21/10/2014, 13:41
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: realloc array 3 dimensiones char

Dado que son strings, puedes usar la función strcpy para copiar los strings... ahora, ten presente que tendrás que reservar memoria para esos nuevos strings... el código ya se te empieza a complicar con esta configuración

Código C++:
Ver original
  1. if (record_count==0)
  2. {
  3.     arr_number=argc;
  4.     Col_name=azColName;
  5.     rows=(char *** )calloc(argc, sizeof(char ** )) ;
  6.     for(int i = 0 ; i < argc; i++ )
  7.     {
  8.         rows[i] = (char ** ) calloc(1,sizeof(char * )) ;
  9.         rows[i][0] = (char*) calloc( 20, sizeof(char));
  10.     }
  11. }
  12. else
  13. {
  14.     for(int i = 0 ; i < argc; i++ )
  15.     {
  16.         rows[i] = (char ** ) realloc(rows[i],(record_count+1) * sizeof(char * )) ;
  17.         rows[i][record_count] = (char*)calloc(20, sizeof(char));
  18.     }
  19. }

Más o menos quedaría así... esto suponiendo una longitud máxima de 19 caracteres para cada elemento de la tabla.

Y luego para almacenar los datos

Código C++:
Ver original
  1. for(i=0;i<argc;i++)
  2. {
  3.    strcpy( rows[i][record_count], argv[i]);
  4. }

Espero no haber metido la pata en el código.

Etiquetas: char, dimensiones, funcion, realloc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:34.