 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
rockman2003 Master

Registrado: 27 Ene 2004Mensajes: 202Ubicación: Madrid
|
Publicado: Dom 02 May, 2010 7:46 pm Asunto: Otra corrupción de cadenas en Builder2010 (Maldito unicode) |
|
|
Buenas de nuevo,
Vengo con otro caso que no comprendo.
Tengo la siguiente funcion que ajusta una cadena de caracteres a una longitud determinada y rellena por la izquierda o por la derecha con el caracter que aparece en sRelleno.
| Código: |
String Tfrm_principal::Ajusta(String sCampo, String sOrientacion,int iLongitud, wchar_t sRelleno)
{
String Result="";
Result=sCampo.Trim();
if (Result.Length() > iLongitud)
{
Result = Result.SubString(1,iLongitud);
}
else
{
if (sOrientacion=="I") //Relleno por la izquierda
{
Result = String::StringOfChar(sRelleno,iLongitud - sCampo.Length())+sCampo;
}
else
{
Result = sCampo+String::StringOfChar(sRelleno,iLongitud - sCampo.Length());
}
}
return Result;
}
|
Bien, pues ¿alguien me puede explicar porque cuando se hace Trim(), me corrompe la cadena Result?
Y si comento esta función, cuando llega al StringOfChar también me lo corrompe, y en Embarcadero dicen que esta función se ha portado.
Un ejemplo de llamada que realizo es:
| Código: |
linea+=Ajusta(query_cms->FieldByName("num_poliza_k")->AsString,"D",20,' ');
|
Por favor, se trata de un marrón que tengo que solucionar hoy.
Muchas gracias a todos |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 02 May, 2010 10:07 pm Asunto: |
|
|
Haz una prueba, cambia la siguiente línea:
linea+=Ajusta(query_cms->FieldByName("num_poliza_k")->AsString,"D",20,' ');
por:
linea+=Ajusta(query_cms->FieldByName("num_poliza_k")->AsString.c_str(),"D",20,' ');
Si, ya se que parece que no tiene mucho sentido, pero pruébalo y dime si notas alguna diferencia. Tampoco has dicho si estas pruebas te generan alguna excepción ? o las estas ignorando ? |
|
| Volver arriba |
|
 |
rockman2003 Master

Registrado: 27 Ene 2004Mensajes: 202Ubicación: Madrid
|
Publicado: Dom 02 May, 2010 11:41 pm Asunto: |
|
|
Gracias _Leo, funciona sin problemas.
¿Tiene una explicación razonable?, porqué me estoy volviendo loco.
Si el parametro es una cadena String y estoy pasando por valor, ¿porque ocurre esto?
Es más, he probado con _TCHAR maps a char y a wchar_t, y ocurría lo mismo.
¿Me aconsejas algo para que evite estos errores, o es inevitable? |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 03 May, 2010 12:01 am Asunto: |
|
|
Es un error de la versión 2010, en las anteriores no ocurre.. el problema esta en que parece que llama al destructor antes de tiempo.
Una forma de reproducir el problema, ponemos el siguiente código en el OnClick de un botón: | Código: | struct TSomeField
{
String GetAsString() { return "CORRECTO"; };
__property String AsString = { read = GetAsString };
String SomeField;
};
struct LOCAL {
static void SomeFunction(String str, void*)
{
String wrongVersion = "INCORRECTO";
ShowMessage(str);
}
};
LOCAL::SomeFunction(TSomeField().AsString, 0); |
Al pulsar debería mostrar la cadena: "CORRECTO", pero no lo hace.
Tienes más detalles sobre este problema en los siguientes posts del foro de Embarcadero:
https://forums.embarcadero.com/thread.jspa?threadID=31033
https://forums.embarcadero.com/thread.jspa?threadID=29072
Y en los siguientes partes de errores:
http://qc.embarcadero.com/wc/qcmain.aspx?d=78772
http://qc.embarcadero.com/wc/qcmain.aspx?d=80204
http://qc.embarcadero.com/wc/qcmain.aspx?d=81101
http://qc.embarcadero.com/wc/qcmain.aspx?d=82558
---
Y la razón por la que funciona haciendo ese cambio en la respuesta anterior, es porque de esta manera le obligamos a crear una variable temporal que será la que pasara a la función. Otras formas de evitarlo en tu código anterior podrían ser:
- Creando una variable temporal (similar al anterior):
linea+=Ajusta(String(query_cms->FieldByName("num_poliza_k")->AsString),"D",20,' ');
o:
String temporal = query_cms->FieldByName("num_poliza_k")->AsString;
linea+=Ajusta(temporal,"D",20,' ');
- Otra forma que funciona es pasando la variable por referencia:
String Tfrm_principal::Ajusta(const String& sCampo, String sOrientacion,int iLongitud, wchar_t sRelleno) |
|
| Volver arriba |
|
 |
rockman2003 Master

Registrado: 27 Ene 2004Mensajes: 202Ubicación: Madrid
|
Publicado: Lun 03 May, 2010 7:10 am Asunto: |
|
|
Bueno, pues por un lado, me tranquiliza pensar que no estoy paranoico, y que supongo se solucione este error en algún Update.
Por otro, pues bueno, me toca revisarme quintillones lineas de código
Gracias _Leo por la informacion |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|