Soyez le premier à donner votre avis sur cette source.
Snippet vu 5 469 fois - Téléchargée 32 fois
function TForm1.SuppChar(var Ref: String; Ch: Char):String; type PReference = ^TReference; TReference = record Valeur : Char; Svt : PReference; end; var i: Integer; Tete,Ptr,P: PReference; begin Tete:=nil; P:=nil; for i:=1 to Length(Ref) do begin if Ref[i]<>Ch then begin Ptr:=P; New(P); P^.Valeur:=Ref[i]; P^.Svt:= nil; if Tete = nil then Tete:=P else begin Ptr^.Svt:=P; P^.Svt:=nil; end; end; end; Ref:=''; Ptr:=Tete; while Ptr<>nil do begin Ref:=Ref + Ptr^.Valeur; Ptr:=Ptr^.Svt; end; Dispose(P); Result:=Ref; end;
En mettant le caractère #0 au milieu d'une chaîne, fOxi, tu ne changes pas sa longueur. Exemple:
const s=#1#2#0#3#4;
Avec cet exemple de chaîne qui fait 5 caractères, le compilateur te dira que Length(s)=5 (la convention qu'un chaîne se termine au premier caractère #0 est vraie - et en partie seulement - pour le C mais pas en Delphi). De plus, même en C le fait qu'un char* contienne un \0 à un endroit ne signifie pas qu'il n'y a pas encore des données après, c'est juste une convention commode qu'utilisent ceux qui écrivent les API pour s'y retrouver.
Pour Delphi, une chaîne de type string est implémentée par une sorte d'interface sous-jacente (pour le ref-counting) avec un champ Length. C'est aussi le cas des tableaux dynamiques. C'est par exemple pour ça que si tu as:
var s:string;
@s ne pointe pas vers le premier caractère de la chaîne, mais vers cette fameuse interface de gestion des chaînes (idem pour les tableaux dynamiques). Tu peux calculer la taille en mémoire occupée par ce que Borland rajoutte (en plus des caractères) à une chaîne en calculant:
Integer(@s[1])-Integer(@s)
Je crois (mais ça demanderait à être revérifié) que ça fait 8 octets (tout simplement un entier integer contenant la longueur de la chaîne + un autre contenant le nombre de références à celle-ci).
Une version encore plus compacte de la fonction de Fred serait:
function SuppChar(const S : string; const C : char) : string;
var pS, pR : PChar; l : Integer;
begin
l := length(S)
SetLength(Result, l);
pS := PChar(S);
pR := PChar(Result);
While pS^ <> #0 do begin
if pS[0] <> C then begin
pR[0] := pS[0];
Inc(pR);
end else
Dec(l);
Inc(pS);
end;
SetLength(Result, l);
end;
Je ne pense pas que le Dec(l) soit trop gourmand en resources ^^
Dernière remarque, tu peux t'affranchir de faire Result:='' au début de la fonction car Delphi par défaut le fait pour toi (comme il le fait pour toutes les variables qui contiennent des interfaces "ref-counted").
alors tout simplement le rajout de :
function SuppChar(const S : string; const C : char) : string;
var pS, pR : PChar;
begin
Result := '';
SetLength(Result, length(S));
pS := PChar(S);
pR := PChar(Result);
While pS^ <> #0 do begin
if pS[0] <> C then begin
pR[0] := pS[0];
Inc(pR);
end;
Inc(pS);
end;
pR[0] := #0;
end;
et hop la chaine est finie...
C'était juste pour faire un peu d'ironie sur le temps passé à écrire ou à utiliser du code, et la possibilité qu'on puisse toujours avoir des bugs dedans ou qu'il existe une meilleure façon de l'écrire.
FRED
@+
jlen
@+
jlen
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.