Pregunta: | 65904 - PROBLEMA: PUNTERO A CAMPO DE ESTRUCTURA |
Autor: | Marcos Sanchez |
Bueno, ando molestándolos nuevamente, tengo que hacer un programita que tiene que(entre otras cosas) leer un archivo de texto y corroborar si uno de los campos (el campo fecha), contiene un cero en alguno de los 4 primeros caracteres, para lo que use un puntero(cadena) para que apunte al arreglo (fecha), y el puntero itera a través de un lazo for. Pero me tira un error que me dice:
In function `void sacarRegCeros()': 46 C:... incompatible types in assignment of `char (*)[10]' to `char*[10]' Espero que alguien me pueda ayudar, muchas gracias. (Utilizo el dev cpp 4.9.9.2) Este es el codigo: //Este programa debe leer un archivo, y copiar los contenidos de las fechas de nac // que no tengan ceros como principio. Ademas, los registros que estén bien, //deben ser guardados y ordenados con un campo mas llamado numeroDeCliente. #include <iostream> #include <stdio.h> #include <string.h> #define ARCHIVO "PASADOBIEN.DAT" struct cli {char fechaN[10]; char nombre[35]; char direccion[35]; }; struct client {int numeroDcli; char feechaN[10]; char nombreE[35]; char direccionE[35]; }; FILE *archivoPtr; FILE *pasPtr; void abrirA(void); void sacarRegCeros(void); void guardarRe(struct cli comprobar); void cerrar(void); int main (void); /******************************************************************************/ void abrirA(void) { archivoPtr = fopen("ARCHIVOnuevo.DAT", "r"); pasPtr = fopen ("PASADOBIEN.DAT", "a+"); sacarRegCeros(); return; } /******************************************************************************/ void sacarRegCeros(void) { fseek(archivoPtr, 0L, SEEK_SET); struct cli comprobar; memset(&comprobar,0,sizeof(comprobar)); int contador; char *cadena[10]; cadena = &comprobar.fechaN; while(archivoPtr != NULL) { for(contador = 0; contador <4; contador++) { if(cadena[contador] == 0) {fseek(archivoPtr, sizeof(comprobar), SEEK_CUR); } if((contador == 3)&& cadena[contador] !=0) {guardarRe(comprobar); fseek(archivoPtr, sizeof(comprobar), SEEK_CUR); } } } return; } /******************************************************************************/ void guardarRe(struct cli comprobar) { fseek(pasPtr, 1L, SEEK_END); struct client n; n.numeroDcli = ftell(pasPtr)/sizeof(n); strcpy(n.feechaN, comprobar.fechaN); strcpy(n.nombreE, comprobar.nombre); strcpy(n.direccionE, comprobar.direccion); fwrite(&comprobar, sizeof(comprobar), 1, pasPtr); return; } /******************************************************************************/ void cerrar (void) { fclose(archivoPtr); fclose(pasPtr); return; } /******************************************************************************/ /******************************************************************************/ int main(void) { abrirA(); cerrar(); printf("archivo procesado"); system("pause"); return 0; } |
Respuesta: | Capitan Kirk |
En la función sacarRegCeros has declarado
char *cadena[10]; con lo que cadena es un array de 10 punteros a char. En C / C++, el nombre de un array es un puntero al primer elemento del array. En este caso, cadena contendrá la dirección donde comienza un array de 10 punteros a char. Por ser una declaración explícita, se resuelve en tiempo de compilación y no puede cambiarse su valor en tiempo de ejecución. Al hacer la asignación cadena = &comprobar.fechaN; estás intentando cambiar la dirección de comienzo de ese array en tiempo de ejecución, cosa que no puedes hacer, y es ese el error que te está dando, o al menos así lo creo, dado que en el código que has posteado la línea 46 corresponde a una comparación. Saludos, |