Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-04-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 521
Poder: 11
Angel.Matilla Va por buen camino
Error en evaluación

Me está ocurriendo con relativa frecuencia este error. Trato de dar valor a una variable con una expresión de este estilo:
Código:
AnsiString Nombre, Prueba = "SISTEMA";
Nombre = Usuario->Text == Prueba ? "sysdba" : Usuario->Text;
En principio la estructura es correcta pero como digo con relativa frecuencia al compilar me da este error:
Cita:
E2354 Two operands must evaluate to the same type
Y hasta donde entiendo ambos lados de la comparación son del mismo tipo. ¿Alguna idea?
Responder Con Cita
  #2  
Antiguo 19-04-2017
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 5.573
Poder: 17
Ñuño Martínez Va camino a la famaÑuño Martínez Va camino a la fama
Tiene pinta de ser un error por precedencia de operadores, o posiblemente por la sobrecarga de operadores (¿== quizá?). Prueba a usar paréntesis:
Código:
Nombre = ((Usuario->Text == Prueba) ? "sysdba" : Usuario->Text);
También puede ser porque la propiedad Text no sea AnsiString sino otra cosa (¿char*?) y no sea capaz de hacer la conversión. O vice versa, que sí lo sean y que sea la constante "sysdba" la que da problemas:

Código:
// Asegurándose de que TODO sea AnsiString...
Nombre = (((AnsiString)(Usuario->Text)) == Prueba) ? (AnsiString)"sysdba" : (AnsiString)(Usuario->Text));
Sé que uso muchos paréntesis pero me fío de la precedencia de operadores de C++ menos que de un camión de bombas conducido por un ciego. No sería la primera vez que C++ me cambia el orden cuando hay conversión de tipos con sobrecarga de operadores de por medio. Por ejemplo, que me lo evalúe como:
Código:
(Nombre = (Usuario->Text == Prueba)) ? "sysdba" : Usuario->Text;
__________________
Proyectos actuales --> Burdjia Components|http://gesbit.sf.net/

Última edición por Ñuño Martínez fecha: 19-04-2017 a las 14:54:20. Razón: Usé ANSISTRING en vez de AnsiString... Y me di cuenta de otra cosa.
Responder Con Cita
  #3  
Antiguo 19-04-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 521
Poder: 11
Angel.Matilla Va por buen camino
Gracias por tu contestación. Lo cierto es que no se me ocurrió probar las sugerencias que me haces, pero me llamó la atención que si en vez de poner el literal "sysdba" metía ese valor en una variable, así:
Código:
AnsiString cUser = "sysdba", cClave = "masterkey";

NombreUser = Usuario->Text == Date().FormatString("yymmdd") ? cUser : Usuario->Text.Trim();
ClaveUser  = Usuario->Text == Date().FormatString("yymmdd") ? cClave : Clave->Text.Trim();
¡no da error de compilación! lo cual me deja totalmente perplejo. Como alternativa, que no he probado, se me ocurre hacer la comparación así:
Código:
NombreUser = Usuario->Text == Date().FormatString("yymmdd") ? AnsiString("sysdba") : Usuario->Text.Trim();
ClaveUser  = Usuario->Text == Date().FormatString("yymmdd") ? AnsiString("masterkey") : Clave->Text.Trim();
Responder Con Cita
  #4  
Antiguo 19-04-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 1.878
Poder: 12
escafandra Va camino a la famaescafandra Va camino a la fama
Cita:
Empezado por Angel.Matilla Ver Mensaje
...me llamó la atención que si en vez de poner el literal "sysdba" metía ese valor en una variable, así:
Código:
AnsiString cUser = "sysdba", cClave = "masterkey";

NombreUser = Usuario->Text == Date().FormatString("yymmdd") ? cUser : Usuario->Text.Trim();
ClaveUser  = Usuario->Text == Date().FormatString("yymmdd") ? cClave : Clave->Text.Trim();
¡no da error de compilación! lo cual me deja totalmente perplejo.
Al colocar el literal "sysdba" el compilador puede tratarlo como un char[], como un AnsiString o como un String. Lo suyo es declarar la variable del tipo apropiado o forzar el cast en la expresión.
Código:
AnsiString Nombre, Prueba = "SISTEMA"; Nombre = Usuario->Text == Prueba ? AnsiString("sysdba") : Usuario->Text;
Responder Con Cita
  #5  
Antiguo 20-04-2017
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 5.573
Poder: 17
Ñuño Martínez Va camino a la famaÑuño Martínez Va camino a la fama
Justo como dice escafandra, el compilador debe elegir entre tres tipos diferentes (como mínimo). Supongo (nunca he usado Borland C++, me quedé con Turbo C/C++ 2.0) que tanto AnsiString como String son clases que definen operadores diversos, entre ellos alguno para combinarlos con char[], y ahí es donde creo que el compilador se hace el lío y no sabe qué hacer.

Yo dejé de usar C++ precisamente por eso: porque muchas veces se daba un caso similar a este (sobre todo si se usaba la vieja de la STL, no sé si con la nueva habrán arreglado algo) y lo mejor que podría pasarte es que no compilara y devolviera un error, porque si compilaba entonces funcionaba pero mal y era complicadísimo encontrar dónde estaba realmente el error.
__________________
Proyectos actuales --> Burdjia Components|http://gesbit.sf.net/
Responder Con Cita
  #6  
Antiguo 20-04-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 521
Poder: 11
Angel.Matilla Va por buen camino
Debe ser algo así. Lo cierto es que poniendolo así:
Código:
NombreUser = Usuario->Text == Date().FormatString("yymmdd") ? AnsiString("sysdba") : Usuario->Text.Trim();
compila bien. ¡Cada día se descubre algo!
Responder Con Cita
  #7  
Antiguo 20-04-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.670
Poder: 27
ecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todos
Hola.
Cita:
Empezado por Angel.Matilla Ver Mensaje
Debe ser algo así. Lo cierto es que poniendolo así:
Código:
NombreUser = Usuario->Text == Date().FormatString("yymmdd") ? AnsiString("sysdba") : Usuario->Text.Trim();
compila bien.
Si, por que cuando escribes
Código PHP:
   ... ? AnsiString("sysdba") : ... 
estas construyendo una instancia de la clase AnsiString desde la constante literal.

Y del mismo modo funciona si aplicas un moldeo:
Código PHP:
  ... ? (AnsiString)"sysdba" : ... 
Vale aclarar que la constante de cadena es interpretada por el compilador C++ Builder como un arreglo de caracteres terminado en nulo.

Para ejemplificar, la constante "sysdba" es interpretada como char[7], cosa que podes comprobar fácilmente:
Código PHP:
#include <typeinfo>
...
{
  
AnsiString User  "sysdba";
  
TVarRec vr[3];

  
vr[0] = typeid(User).name();
  
vr[1] = '\n';
  
vr[2] = typeid("sysdba").name();

  
ShowMessage(Format("User es tipo: %s %s""sysdba"" es tipo: %s"vr3));

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 20-04-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 521
Poder: 11
Angel.Matilla Va por buen camino
¡Más claro, agua!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TMS Data Modeler Evaluacion ASAPLTDA Debates 0 15-06-2014 19:11:49
Test de Evaluacion Elite237 OOP 65 04-11-2008 10:37:39
Sistema de Evaluacion Psicometrica Elite237 OOP 4 24-09-2008 18:31:58
Intraweb de D2007 es evaluación?? xander Varios 5 24-10-2007 20:04:40
Migracion BDE a SQLDIRECT evaluacion ASAPLTDA Conexión con bases de datos 0 27-11-2004 22:08:12


La franja horaria es GMT +2. Ahora son las 03:53:17.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi