[TP7] Concaténér une chaîne

Résolu
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 25 févr. 2007 à 10:35
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 26 févr. 2007 à 16:55
Bonjour à tous.
Je suis en train de faire une fonction de cryptage xor en Turbo Pascal 7.
Seul petit problème : il ne veut pas ajouter le caractère crypter dams tmp...
J'ai essayé 2 fois, rien ne fonctionne ! (C'est une erreur type missmatch)

function Crypto(S:String;Key:String) : String;



         var lS : Integer;
         var lK : Integer;



         var pS : Integer;
         var pK : Integer;



         var cS : Byte;
         var cK : Byte;



         var cTmp : Char;
         var Tmp : String;



         begin





              lS := Length(S);
              lK := Length(Key);



              pS := 1;
              pK := 1;



              for pS := 1 to lS do;
                  begin
                       inc(pK,1);
                       if pK > lK then;
                          begin
                               pk := 1;
                          end;



                       cS := ord(S[pS]);
                       cK := ord(Key[pK]);
                       cTmp := cS xor cK




                       Tmp := concat(Tmp,Chr(cTmp));  { <- Cette ligne ne fonctionne pas ...}
                       Tmp := Tmp + Chr(cTmp); { <- Et celle-là non plus !}

                  end;
              Crypto := Tmp
         end;

4 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
25 févr. 2007 à 20:43
Evidemment qu'il est possible d'optimiser cette fonction !
Cependant, ne connaissant pas les limites de Turbo Pascal, je me suis contenté de lui donner sa réponse.
Par contre, à quoi sert la variable Tmp, autant utiliser directement Result (ou alors Crypto puisque TP ne permet peut être pas cette méthode).

Et sinon, ut peux aussi éviter l'affectation en appelant SetLength() puisque la valeur affectée à Tmp (Tmp := S) n'est jamais utilisée.

D'où : (pas testé mais ça doit être OK)

function Crypto(const S, Key : String) : String;
var
nS, nK: Integer;
begin
SetLength(Crypto, Length(S));
nK := 1;
for nS := 1 to lS do
begin
Crypto[nS] := Chr(Ord(S[nS]) xor Ord(Key[nK]));
Inc(nK,1);
if nK > lK then
nK := 1;
end;
end;

++
3
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
26 févr. 2007 à 16:55
ta réponse est tout a fait bonne sauf que certaines var n'étaient pas déclarées ni utilisées ...
voici la version corrigée (un soupcon) :

function Crypto(const S, Key : String) : String;
 var
                lS, lK: Integer;
                nS, nK: Integer;
 begin
                lS:=Length(S);
                lK:=Length(Key);
                SetLength(Crypto, lS);
    nK  := 1;
                for nS := 1 to lS do
     begin
        Crypto[nS] := Chr(Ord(S[nS]) xor Ord(Key[nK]));
        Inc(nK,1);
        if nK > lK then
            nK := 1;
     end;
 end;

Merci à tous de m'avoir aidé !
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
25 févr. 2007 à 11:05
Salut,

Puisque cTmp est un Char et Tmp un string, il ne faut pas appeler Chr() mais directement concaténer.
Ce qui donne :

Tmp := Concat(Tmp, cTmp)

ou bien :

Tmp := Tmp + cTmp.

Personnellement, je préfère la deuxième solution, plus rapide et plus simple à relire.
++
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
25 févr. 2007 à 16:10
function Crypto(const S, Key : String) : String;
var lS,lK, nS, nK : Integer;
    tmp           : string;
begin
  lS  := Length(S);
  lK  := Length(Key);

  tmp := S;
  nK  := 1;

  for nS := 1 to lS do
  begin
    Tmp[nS] := ord(S[nS]) xor ord(Key[nK]);
    inc(nK,1);
    if nK > lK then
       nK := 1;
  end;
  Crypto := Tmp;
end;



tout simplement ...

<hr size="2" width="100%" />Croc (click me)
0
Rejoignez-nous