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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-02-2010
Ledian_Fdez Ledian_Fdez is offline
Miembro
 
Registrado: jun 2006
Ubicación: Ciudad Habana, Cuba
Posts: 242
Poder: 18
Ledian_Fdez Va por buen camino
Lightbulb Delphi a C++

Hola amigos de este foro:
Tengo esta linea de código en delphi por favor alguien podría pasármelo a Borland C++

Código Delphi [-]
Result := Result + Chr(Ord(S[i]) + 215)

Gracias de antemano.
Responder Con Cita
  #2  
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
Poder: 17
rgstuamigo Va por buen camino
Arrow

Bueno habria que ver que tiene en realidad el puntero Result , lo que pasa es que en C++ para retornar el valor de una funcion se utiliza return que cuando el compilador de c++ lo encuentra de inmediato termina la Funcion, cosa que en Delphi result puedes utilizarla como una variable y el compilador de delphi seguirá ejecutando las lineas de mas abajo si las hay.
Un ejemplo
en Delphi->
Código Delphi [-]
function TForm1.Longitud(S:String): Integer;
begin
  Result:=Length(s);//aqui ya se sabe el resultado pero no se termina la ejecucion
  ShowMessage('Hola');//esta linea en delphi se va ejecutar
end;
pero si hacemos el mismo ejemplo en C++Builder
Cita:
int TForm1::Longitud(String S)
{
return S.Length();//<--aqui se termina todo
ShowMessage("Hola");//esta linea no se va ejecutar en C++
}
Eso significa que para poder pasar la linea que tú mencionas, no queda de otra que usar una variable auxiliar (aux) que tenga el contenido para poder asignarlo al return, algo asi:
Cita:
String aux='Algo';
return(aux+char(Byte(S[i])+255));
Aunque veo que parece que ese código esta dentro de un ciclo, si asi estonces sería asi:
Cita:
//inicio del ciclo
...
aux=aux+char(Byte(S[i])+255);
...
//fin del ciclo
return aux;
.
Espero que se entienda.
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 18:18:25.
Responder Con Cita
  #3  
Antiguo 05-02-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
rgstuamigo ha explicado bastante bien el problema pero hace falta añadir algo. 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.
Responder Con Cita
  #4  
Antiguo 05-02-2010
Ledian_Fdez Ledian_Fdez is offline
Miembro
 
Registrado: jun 2006
Ubicación: Ciudad Habana, Cuba
Posts: 242
Poder: 18
Ledian_Fdez Va por buen camino
Post ayuda con esta funcion !!!

Tengo esta funcion en C++

Código:
String Encrypt(String texto)
{
 String Result="";
 int tamano = texto.Length();
 for (int i=0;i<tamano-1;i++)
 {
  Result = Result + char(Byte(texto[i]) + 255);
 }
 return Result;
}
El error es en tiempo de ejecución.
Por favor alguien podrá corregirmelo.

Error apunta a esta linea:
Código:
Result = Result + char(Byte(texto[i]) + 255);
Cita:
"Project encripty.exe raised exception class EAccessVionlation with message 'Access violation at address 40009739 in module 'rtl60bpl'. read of address 0000000. Process stopped. Use step or Run to continue."
También acepto una función donde pueda encriptar un texto, en este caso lo utilizo para la contraseña.

Salu2
Ledian

Última edición por Ledian_Fdez fecha: 05-02-2010 a las 21:21:14.
Responder Con Cita
  #5  
Antiguo 05-02-2010
Ledian_Fdez Ledian_Fdez is offline
Miembro
 
Registrado: jun 2006
Ubicación: Ciudad Habana, Cuba
Posts: 242
Poder: 18
Ledian_Fdez Va por buen camino
Post Convertir a C++

Amigos esta función la usaba para encriptar texto en Delphi. Ahora no hallo como traducirla al equivalente en C++. Alguien podría ayudarme?

Código:
Function TDM.Encrypt;
Var
 I : byte;
begin
 {Proceso de Encriptación o Desencriptación de la contraseña}

   Result := '';
   case Dir of
     Protect : For I := 1 To Length(S) Do Result := Result + Chr(Ord(S[i]) + 215);
     UnProtect : For I := 1 To Length(S) Do Result := Result + Chr(Ord(S[i]) - 215);
   end;
end;
salu2
Ledian
Responder Con Cita
  #6  
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
Poder: 17
rgstuamigo Va por buen camino
Arrow

Amigo(a) Ledian_Fdez trata en lo posible no habrir tantos hilos para la misma cosa , tranquilamente en este hilo pudiste continuar con tus dudas. por lo tanto voy a unir ambos hilos. Y si no lo has hecho te invito a leer la guia de estilo.
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #7  
Antiguo 05-02-2010
Ledian_Fdez Ledian_Fdez is offline
Miembro
 
Registrado: jun 2006
Ubicación: Ciudad Habana, Cuba
Posts: 242
Poder: 18
Ledian_Fdez Va por buen camino
Escuseme

Ok, es que estoy tan atormentado que no me di cuenta, le ruego que me discupen.
Responder Con Cita
  #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
Poder: 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
  #9  
Antiguo 06-02-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Por su puesto que se te entiende, rgstuamigo. AnsiString, como bien dices está diseñada para "emular" las cadenas de delphi desde Builder en el que también se puede trabajar con String. Ambos tipos son en realidad clases en Builder C++. El tema es que no son AnsiC. Es por eso la razón de mi comentario anterior acerca de los índices.

En realidad todo depende de que tipo se usará en la función de Ledian_Fdez, String, AnsiString o char*, cosa que en ningún momento hemos sabido. Yo particularmente prefiero escribir mi código al estilo C/C++ mas puro y en ese sentido prácticamente siempre uso las cadenas como char* (PCHAR), por compatibilidad con otros compiladores y con la API de WIN32 así como por la facilidad intrínseca de recorrerlas.

Saludos.
Responder Con Cita
Respuesta



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
Consulta Delphi 6, Delphi 2005 y Delphi 2006 Leviatan Varios 6 18-08-2007 16:02:08


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


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