Bonjour,
je voudrais savoir s'il y a moyen de faire passer une chaîne par adresse dans les paramètres d'une fonction afin d'éviter les recopies.
Merci
Bonjour,
je voudrais savoir s'il y a moyen de faire passer une chaîne par adresse dans les paramètres d'une fonction afin d'éviter les recopies.
Merci
En Delphi, il y a un mécanismes de compteur de référence qui réduit les copies ... mais j'ai quelques difficultés pour savoir sur quelle type de variable (locale, membre objet, globale ...)
sinon, tu as les mots clés var et const
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
pour une methode, la plupart du temps c'est plus rapide d'utiliser "const" :
methode la plus courrante qui permet de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part function untruc(const S: string): quelquechose;
unTruc('bonjour');
unTruc(S);
unTruc(Edit1.Text);
aprés tout depend de ce qu'il se passe dans la fonction.
on peu egalement la passer par pointeur, ce qui est bien aussi quand on crée une DLL :
unTruc(PChar(S))
Code : Sélectionner tout - Visualiser dans une fenêtre à part function untruc(const pS : PChar): quelquechose;
unTruc('bonjour');
unTruc(Edit1.GetText);
la methode la moins performante etant de faire ceci :
unTruc(S);
Code : Sélectionner tout - Visualiser dans une fenêtre à part function untruc(s : string): quelquechose;
unTruc('bonjour); // erreur
unTruc(Edit1.Text); // erreur
on utilisera var dans ce cas, S doit etre lue puis peut être assignée, force l'utilisation d'une variable pour S :
et on utilisera out dans ce cas, S n'est jamais lues mais peut être assignée, force l'utilisation d'une variable pour S :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure unTruc(var S: string); begin if S = 'quelquechose' then S := 'untruc'; end;
et bien sur, S peut être lue mais ne sera jamais assignée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure unTruc(out S: string); begin S := DateToStr(Now); // S = 28/10/2009 15h30 end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 procedure unTruc(const S: string); begin if S = 'quelquechose' then halt(0); end;
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
Ma messagerie n'est pas la succursale du forum... merci!
Modérateur Delphi
Le guide du bon forumeur :
- Les règles du forum tu liras
- La FAQ et les tutoriels tu consulteras
- La fonction Recherche tu utiliseras
- Google tu vénèreras
__________
Rayek World : Youtube Facebook
Idem que pour Rayek, cela fonctionne très bien chez moi aussi !
Sinon, non const n'est pas le mode par défaut, qui lui duplique les valeurs, car l'on peut modifier la valeur du paramètre localement à la fonction sans modifier la valeur d'origine, ... cela duplique vraiement (je parle pas du compteur de référence qui optimise cela)
Sinon, idem, j'utilise const à 90% par ce qu'en Delphi 3, tu voyais vraiement la différence, même rapport au compteur de ref, ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Merci pour vos réponses. Avec const c'est parfait
Par contre en retour de fonction comment ça se passe ?
Avec un code du genre :
Combien y a t il de recopie de chaine ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 function Toto: String; begin Result := 'la chaine de retour'; end; ... var MaChaine: String; begin MaChaine := Toto; end;
sous Delphi 2009, portable HP pavilion zv6000, 1.25Go ram, AMD Athlon 64 3200+ 1.99Ghz :
code de test :
uStr : 13.179 / 13.689 / 10.664 / 13.088 / 12.140 / 12.044 / 13.054
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 function uStr(SA, SB, SC : string): string; begin result := SA + SB + SC; { push dword ptr [ebp-$04] push dword ptr [ebp-$08] push dword ptr [ebp-$0c] mov eax,[ebp+$08] mov edx,$00000003 call @UStrCatN } end; function cStr(const SA, SB, SC: string): string; begin result := SA + SB + SC; { push ebx push esi push edi mov eax,[ebp+$08] mov edx,$00000003 call @UStrCatN } end; const cA = '0123456789001234567890012345678900123456789001234567890'; cB = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'; cC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'; procedure TFrmMain.Button2Click(Sender: TObject); var PS, PE, P1, P2 : int64; N : integer; SA : string; begin P1 := 0; P2 := 0; for N := 0 to 99999 do begin QueryPerformanceCounter(PS); SA := uStr(cA, cB, cC); { lea eax,[ebp-$04] push eax mov ecx,$0046bacc mov edx,$0046bb78 mov eax,$0046bc24 call uStr } QueryPerformanceCounter(PE); P1 := P1 + (PE-PS); QueryPerformanceCounter(PS); SA := cStr(cA, cB, cC); { lea eax,[ebp-$04] push eax push $0046bc24 mov edx,$0046bb78 mov ecx,$0046bacc pop eax call cStr } QueryPerformanceCounter(PE); P2 := P2 + (PE-PS); end; RichEdit1.Lines.BeginUpdate; try RichEdit1.Lines.Clear; RichEdit1.Lines.Add(format('uStr : %.3n',[P1*0.00001])); RichEdit1.Lines.Add(format('cStr : %.3n',[P2*0.00001])); finally RichEdit1.Lines.EndUpdate; end; end;
cStr : 9.473 / 10.720 / 11.978 / 10.761 / 11.474 / 12.787 / 10.274
à vous d'interpréter.
et comme j'ai dis dans mes précédentes réponses, tout dépend de ce qu'il y a dans la fonction, comment la chaine doit être utilisée.
pour ce qui est de l'erreur sur les propriétés bizarrement ça fonctionne en effet... peut être une options de compilation que j'avais désactivée sur D7...
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
Ma messagerie n'est pas la succursale du forum... merci!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager