Errores en esta función de C++. Ayuda
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
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
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
> 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
