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

[Résolu]
Signaler
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
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

Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
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;

++
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
14
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é !
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
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.
++
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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)