Tema: Delphi a C++
Ver Mensaje Individual
  #8  
Antiguo 05-02-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Reputación: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por escafandra Ver Mensaje
.... En delphi las cadenas (String) no son como en C. En C el primer elemento de una cadena es el 0 mientras que en delphi es el 1 (el 0 está reservado para el tamaño) Cas cadenas en terminan con un char 0

De esta forma, tenemos que considerar el índice i al traducir y bien usar i-1 o cambiar los límites del bucle...
Código:
return aux+S[i-1]+215;
Saludos.
Es una buena explicacion amigo escafandra y es muy válida para C/C++, sinembargo para poder referenciar un caracter en una clase String (AnsiString en C++Builder) lo tienes que hacer tal como haces en Delphi, es decir el primer caracter esta en la posicion uno (1), aunque internamente si esta en la posicion cero(0),¿Pero como es posible esto? te preguntaras, lo que pasa es que la clase AnsiString de c++Builder al sobrecargar el operador [] lo que hace es verificar si el indice es valido osea este entre 1 y la longitud de la cadena y si cumple tal condicion pues lo que hace es decrementar el indice para obtener el caracter valido.Supongo que los de Borland vieron que sea asi para que si algun programador se pasara de Delphi a C++Builder no notara la diferencia..
Pero para mas comprension te pongo el codigo de sobrecarga del operador [] de la clase
AnsiString de c++Builder:
Cita:
char& __fastcall operator [](const int idx)
{
ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??
Unique(); // Ensure we're not ref-counted
return Data[idx-1];//<--aqui es donde esta el truco osea que debemos mandar 1 en el indice si queremos obtener el primer caracter de la cadena
}
Es por eso que la siguiente funcion sale error:
Cita:
String Encrypt(String texto)
{
String Result="";
int tamano = texto.Length();
for (int i=0;i<tamano-1;i++)
{
Result=Result+texto[i]+215;
}
return Result;
}
Segun lo anteriormente explicado la funcion anterior deberia ser asi:
Cita:
String Encrypt(String texto)
{
String Result="";
int tamano = texto.Length();
for (int i=1;i<=tamano;i++)//Empiezo en uno y termino en el tamaño de la cadena
{
Result=Result+texto[i]+215;
}
return Result;
}
Espero que se haya entendido..
Nota: Probado en C++Builder 6
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 05-02-2010 a las 23:05:14.
Responder Con Cita