C/Visual C - control errores c++

 
Vista:

control errores c++

Publicado por Cristi (9 intervenciones) el 21/05/2006 15:08:56
tengo el siguiente trozo de codigo, en marquee puedo meter solo alternate o scroll, los movimientos de una marquesina, pero como hago para comprarar el valor qeu tiene la marquesina con uno de los valores posibles? para comparar caracteres es con strcmp no? me sale este error:

strcmp' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

case 2:
cout <<"introduce "<<a<<" nueva"<<endl;
cin>>com;
if (com!=alternate || com!= scroll)
{b=2;
throw ERROR_EN_MOVIMIENTO;
}
if ((strcmp(com, alternate)<0) || (strcmp(com, alternate)>0) || (strcmp(com, scroll)!=0) || (strcmp(com, scroll)!=0))
{
b=2;
throw ERROR_EN_MOVIMIENTO;
}

movimiento=com;
b=0;
break;
}
}
catch(error e)
{
switch(e)
{
case ERROR_EN_MOVIMIENTO:
cerr<<"Ese movimiento no existe"<<endl;
break;
case RANGO:
cerr<<"El numero introducido esta fuera del rango"<<endl;
break;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:control errores c++

Publicado por fernando.gomez (1603 intervenciones) el 22/05/2006 03:49:36
Mirando rápido tu error, el problema es que estás pasando un std::string como argumento a algún método que requiere un const char*. std::string no tiene definido el operador const char*, por lo que tienes que llamar al método c_str (i.e. cadena.c_str()).

Como brevario cultural, la razón por la que no se definió un operador const char* (a diferencia, por ejemplo, de CString de MFC) es porque códigos como:

std::string cadema = "hola mundo";
delete cadena;

serían válidos, pero ocasionarían un comportamiento indefinido.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:control errores c++

Publicado por Cristi (9 intervenciones) el 22/05/2006 14:45:13
no entendi lo que quisiste decir, como puedo solucionar mi problema?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:control errores c++

Publicado por fernando.gomez (1603 intervenciones) el 22/05/2006 17:08:35
Un ejemplo.

void foo(int i) { ... }

int main()
{
foo("Hola mundo");
return EXIT_SUCCESS;
}

¿Estás de acuerdo en el código anterior no va a compilar? Por supuesto, foo pide un parámetro de tipo "int" y yo le estoy pasando una cadena de texto, que sería un const char*. Para que compilase, o bien cambio el tipo de dato del parámetro, o bien el valor del parámetro. Por ejemplo:

void foo(const char* sz) { ... }

int main()
{
foo("Hola mundo");
return EXIT_SUCCESS;
}

El código anterior sí compila. ¿Hasta aquí de acuerdo?

Lo que está pasando en tu código es algo similar. En alguna función, se pide que pases como parámetro un "const char*", y le estás pasando una clase std::string. Evidentemente hay incompatibilidad en el tipo de datos, porque std::string no es un const char*, ni está definida para que simule que lo es (esto último se logra sobrecargando el operador de conversión de tipos de datos a const char*).

Ahora bien, std::string ofrece un método para representar el valor de la clase como una cadena de texto de C (const char*) que se llama c_str. Así, donde te marque el error, en lugar de

string cadena = ...;
foo(cadena);

debes hacer algo como

string cadena = ...;
foo(cadena.c_str());

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:control errores c++

Publicado por Cristi (9 intervenciones) el 22/05/2006 18:32:50
te paso la funcion entera, si necesitas mas informacion te paso el proyecto entero. Que librerias de c++ se pueden utilizar? tengo q hacer otra aparte de: (iomanip tambien esta).
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

void marquee::pedir_marquee (string a, int b)
{
string velo;
string com;
string alternate;
string scroll;
int i;
int velo1;
do{
try
{

switch (b)
{
case 1:
cout <<"introduce "<<a <<" nueva"<<endl;
cin>>velo;
velo1=0;
for (i=0;i<velo.size();i++)
{
velo1=velo1+(velo.at(i)-48)*(pow(10, velo.size()-i-1));
}
for(i=0; i<velo.size();i++)
{
if (velo.at(i)<48 || velo.at(i)>57)
{
b=1;
throw LETRAS_EN_NUMEROS;
}
if (velo1<0 || velo1>500)
{
throw RANGO;
}
}

velocidad=velo;
b=0;
break;

case 2:
cout <<"introduce "<<a<<" nueva"<<endl;
cin>>com;
if (com!=alternate || com!= scroll)
{b=2;
throw ERROR_EN_MOVIMIENTO;
}/*
if ((strcmp(com, alternate)<0) || (strcmp(com, alternate)>0) || (strcmp(com, scroll)!=0) || (strcmp(com, scroll)!=0))
{
b=2;
throw ERROR_EN_MOVIMIENTO;
}
*/
movimiento=com;
b=0;
break;
}
}
catch(error e)
{
switch(e)
{
case ERROR_EN_MOVIMIENTO:
cerr<<"Ese movimiento no existe"<<endl;
break;
case RANGO:
cerr<<"El numero introducido esta fuera del rango"<<endl;
break;
}
}
}while(b!=0);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar