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

Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Dernière intervention
30 juin 2013
- - Dernière réponse : cs_ghuysmans99
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
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;
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
1
3
Merci
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;

++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 115 internautes nous ont dit merci ce mois-ci

Commenter la réponse de florenth
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Dernière intervention
30 juin 2013
21
3
Merci
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é !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 115 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_ghuysmans99
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
1
0
Merci
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.
++
Commenter la réponse de florenth
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
2 janvier 2019
33
0
Merci
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)
Commenter la réponse de f0xi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.