| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
sasha12
Registrado: 27 Sep 2007 Mensajes: 13
| Publicado: 19/10/2007 10:42 am | | | Título: non lvalue in assignment |
| Hola, cambie de tema y titulo en este thread para preguntar otra cosa sobre el mismo codigo:
| Código: | char* pTC; char* pTE; pTC = new char [prod.size()+1]; strcpy (pTC, prod.c_str()); /*....*/ pTE = new char [chooseTV.size()+1]; strcpy (pTE, chooseTV.c_str()); /*....*/ strnicmp (pTE, strtok(pTC, " "), 9); // << acá no hay error strnicmp (pTE, strtok(NULL, " "), 9); // << acá sí
|
Que tiene esto de malo? si es muy poco por favor avisar que pongo mas codigo (aunque el error esta solo ahi) el error es 'non-lvalue in assignment'
Ultima edición por sasha12 el 19/10/2007 3:00 pm; editado 1 vez |
| | Volver arriba | |  | cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 19/10/2007 11:58 am | | | Título: |
| El code tiene varias incongruencias, supongo que derivadas del desconocimiento de la clase std::string.
C++ es fuertemente tipificado, si el parámetro de una función espera un tipo const T*, este debe ser const T*, salvo en las conversiones triviales hay que tener especial cuidado, y el typecast no siempre es una solución.
La clase string tiene sobrecargado entre otros los operadores == y != , ambos devuelven true o false al comparar dos objetos del tipo mencionado.
Por otra parte esta asignación no es correcta:
prod se avalúa y como resultado devuelve la dirección del primer elemento que no es ni de lejos un (char*) si no un puntero a un array de std::string, y aun eliminando el '&' se resuelve al devolver un puntero a std::string y ni hablar de usar reinterpret_cast.
Una forma de declarar e inicializar el puntero correctamente:
| Código: | pTC = &prod[0]; // o también pTC = prod;
|
Ahora podemos actuar con el normalmente, esto implica aritmética para indexación, indirecion y referencia, siempre que sean consistentes, en el bloque donde utilizas strnicmp no lo es.
Si quisiéramos un puntero a los elementos de un std::string el método a utilizar es c_str() este retorna un const char* recordando que const no califica como en C, en C++ se refiere a un tipo de solo lectura.
Y después de meter este ladrillo ... ¿Que es lo que quieres hacer?
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso. |
| | Volver arriba | |  | cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 19/10/2007 5:04 pm | | | Título: |
| Si a strtok le pasas NULL en vez de un buffer modificable el resultado es desastroso, si a esto añadimos que strtok devuelve NULL sobre strnicmp es posible que tu PC salga corriendo del susto.
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso. |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3841 Ubicación: Mexico
| Publicado: 19/10/2007 7:12 pm | | | Título: |
| El paso de NULL como primer argumento en la segunda llamada a strtok es valido e indica a esta funcion que devuelva el siguiente token, aun asi es una muy mala idea colocar la llamada a strtok dentro de la llamada a strnicmp por la razon ya mencionada por Cheroky.
El error "non-lvalue in assignment" indica que al tratar de realizar una asignacion en la forma "x = y" el identificador o expresion "x" no denota (o hace referencia a) un objeto.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |