La Web del Programador: Comunidad de Programadores
 
    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,