Errores en esta función de C++. Ayuda

rrr_vanquish
15 de Julio del 2004
Os pongo en contexto: la función se encarga de leer un fichero de texto y extraer la información hacia una estructura que forma parte de una lista doblemente enlazada. Me da un error q no comprendo:

int cargar_datos_cliente(contadores *c,char *linea)
{
cliente *aux; char *campo; int cantidad;
/* posicion y tipo ya tratados */
strtok(linea,"#");
strtok(NULL,"#");
campo= new char[sizeof(char)*80];
aux=(*c).actual_lista->persona;
/* almacenamos los campos leidos */
strcpy(campo,strtok(NULL,"#"));
(*aux).nombre=strdup(campo); //error
strcpy(campo,strtok(NULL,"#"));
(*aux).direccion=strdup(campo); //error
strcpy(campo,strtok(NULL,"#"));
(*aux).dni=strdup(campo); //error
strcpy(campo,strtok(NULL,"#"));
cantidad=atoi(campo);
(*aux).saldo=cantidad;//strdup(campo);
return 0;
}

Compiling ACADEM~2FINAL.CPP:
Error ACADEM~2FINAL.CPP 831: Lvalue required
Error ACADEM~2FINAL.CPP 834: Lvalue required
Error ACADEM~2FINAL.CPP 837: Lvalue required

Gracias y saludos

Alejandro_
15 de Julio del 2004
Encuentro varias cosas "raras"...

> campo= new char[sizeof(char)*80];

el operador new asigna espacio en memoria el tipo de dato de que se trate, así que sizeof(char)*80 en el mejor de los casos es redundante, aunque en máquinas donde un char no sea de 8 bits (puede ser de 32), new estaría asignando 4 veces más memoria que lo necesario.
Y, ah, no te olvides de "delete[] campo;" cuando ya no vaya a ser necesario.

> strcpy(campo,strtok(NULL,"#"));

En la primera llamada a strtok hay que poner como primer parámetro la cadena de caracteres desde donde se van a extraer los "tokens" (hasta el delimitador '#'); para obtener el resto de los caracteres, después de la primera llamada, sí hay que poner NULL.

> (*aux).nombre=strdup(campo); //error

Acá tendría que ver la definición de cliente. Si la variable "nombre" es un puntero a carácter, esta línea debería funcionar, aunque antes habría que ver el contenido de "campo". En este caso, yo pondría una línea adicionar adelante de ésta:
cout << campo;
para ver si en "campo" hay una cadena de caracteres válida.
(Por otro lado, en lugar de (*aux).nombre, es más común poner aux->nombre).

Alejandro