Tableau de variables dans une fonction afin de les schtroumpfer sans pointeurs .
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
14 déc. 2005 à 09:42
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
14 déc. 2005 à 14:45
Salut a tous!
aller autant faire le boulet jusqu'au bout en postant dans la tristement celebre rubrique "BORDELAYARGLAFOUK".
j'ai recement rencontrer un probleme dans l'elaboration d'une fonction.
cette fonction permet de schtroumpfer plusieurs booleans en meme temps a une valeur donnée par un parametre.
vous avez bien lus, cette fonction schtroumpf les booleans.
j'ai appeler cette methode la methode Schtroumpf, car il est plus facile de la definir en langage Schtroumpf qu'en français.
et a la question que vous poserez : "elle fait quoi ?"
je repondrais : "ele schtroumpf les booleans..."
1er cas :
function Schtroumpfise(Bool : array of boolean; const value : boolmode = bmTrue);
j'injecte des variables globale ou meme locale dans ma fonction qu'elle soit boolean ou type array of boolean
Schtroumpfise([b1,b2,b3]);
pouf ... rien n'est modifier. sUx!
ma solution :
type
PasGlop : ^boolean;
function Schtroumpfise(const bool : array of PasGlop; const value : boolmode = bmtrue);
probleme :
je doit forcement injecter avec cette syntaxe ... logique...
Schtroumpfise([@b1,@b2,@b3]);
cette fonction, fonctionne c'est le cas de le dire, et mes booleans sont bien schtroumpfés ...
mais j'aimerais savoir pourquoi je suis obligé de passé par des pointeurs.
j'aimerais ne pas utiliser de pointeurs pour eviter que delphiprog ou d'autre viennent me dire "oui mais .net ceci cela",
si quelqu'un a la solution ...
je cherche mais je provoque que des erreurs de compil.
je n'y arrive tout simplement paaaaas.
la ma signature colle parfaitement a mon probleme...
vus qu'en pratique il est possible de passer une variable dans une fonction et que cette fonction modifie cette variable.
vus qu'en theorie il doit etre possible de passer des variables en tableau dans une fonction et que cette fonction puisse modifier les variables contenue dans le tableau.
vus qu'en pratique la theorie sus-citée ne fonctionne pas avec ma methode qui pourtant en theorie devrait fonctionnée ce qui me resoud a utiliser des pointeurs ce qui n'est pas forcement pratique dans la pratique.
La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 14 déc. 2005 à 10:09
salut f0xi
1er tu déclare une fonction mais tu ne renvoie pas de resultat dans ce cas passe par une procedure ce sera plus logique
2e tu passes bool en constante comme argument ---> les valeurs sont
copiées dans l'espace de travail mais pas retrounées si tu veux
qu'elles soient retournées passent les en variables:
procedure Schtroumpfise( var Bool : array of boolean; const value : boolmode = bmTrue);
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 14 déc. 2005 à 11:20
au fait en passant tes paramatres par pointeurs DELPHI copie ces
parametres en espace de travail et les uitilise comme pointeurs il va
donc modifier les variables à l'adresse contenue dans le pointeur il
est donc logique dans ce cas que les variables soient modifiée.
Maintenant tant on passe des parametres par variable DELPHI ne transmet
que l'adresse de la variable et affecte directement les résultats à ces
variables ce qui revient exactement à ce que tu fais en passant les
pointeurs.
cs_Kenavo
Messages postés702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 14 déc. 2005 à 11:43
C'est là d'ailleurs tout l'intérêt du mot clé var qui permet de dissimuler le mécanisme du passage des variables (par valeur ou par adresse) tel qu'on peut le connaître en C.
L'inconvénient de cette facilité est que nombreux sont les programateurs Pascal qui ignorent les pointeurs !
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 14 déc. 2005 à 11:56
Salut f0xi,
L'abus de stroumpf est dangereux pour la santé
pour la réponse jlen100 à mis le doigt dessus remplace le mot réservé Const par Var et le tour est joué
Ex:
Var XX : Integer = 20;
Procedure Stroumpf (Const x : Integer);
Begin X : 50 * 2 ; // 100
End ;
si tu fais Stroumpf ( XX);
XX restera à 20.
Par contre
Var XX : Integer = 20;
Procedure Stroumpf (Var x : Integer);
Begin X :50 * 2 ; // 100
End;
là si tu fais Stroumpf ( XX);
XX aura comme valeur 100.
@+
Cirec
Vous n’avez pas trouvé la réponse que vous recherchez ?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 14 déc. 2005 à 12:45
hola en effet, j'ai bugé a la restranscription memorielle.
c'est une procedure et non une fonction ... plop
ensuite :
VAR BOOL : ARRAY OF BOOLEAN
voila ce qu'il me renvois le bougre : Un objet constante ne peut etre passé comme parametre Var ...
no comment.
apparement Array n'accepte que des constantes et pas de variable donc
impossible de passer une variable dans un tableau en pensant que celle
ci pourrat etre modifiée sans utiliser les pointeurs.
faut savoir si quand je declare :
VAR
VAR1 : boolean;
VAR1 est une constante ou une variable ... pfff... la c'est trop nul ...
c'est logique ... quand on declare VAR c'est forcement une constante ... on se demande meme a quoi ça sert la declaration CONST a ce moment...
j'ai essayer :
VAR BOOL
CONST BOOL
BOOL tout court
et meme :
var bool : array of var boolean < pffff lol
const bool : array of var < re lol
bool : array of TuMeCasseLesBool < marche pas, type inconnus
bool : array of CoupDBool < pareil...
donc seule soluce, array of pointeur
j'ai meme essayer (bool[x] as Boolean) := value ... pouf ça marche pas non plus.
bon aller, je laisse ma methode en pointeur et au diable .Net.
alors aprés quelque reflexion :
quand j'ecris :
SetBooleans([var1,var2,var3]);
reviens a ecrire
SetBooleans([true,false,true]); // par exemple
donc on ne peu pas modifier les variables ... donc pointeurs. PAAAAAR contre, si j'utilise une variable Array of boolean (grace a un type array of boolean), elle serat bien modifiée car elle passe en parametre VAR.
en faitje geule mais c'est trés logique.
c'est juste qu'il n'existe pas de Array of Var.
La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 14 déc. 2005 à 12:58
et pour finir, que j'ai oublier en fait :
quand j'ecris :
procedure SetBooleans(var Bool : Array of boolean ....);
et que j'apel comme ça :
setbooleans([var1,var2,var3]);
Bool correspond bien a [var1,var2,var3] mais ne pointe pas sur les variables var1, var2 et var3
vus que les valeurs de ces variables sont affectée au tableau Bool. (vous me suivez ?)
donc point de vue adresse memoire, quand j'assigne une valeur a Bool[x], il envois cette valeur partout sauf dans Var1, var2 ou var3 vus qu'il ne pointe pas dessus mais sur Bool lui meme.
si j'utilise des pointeurs par contre, l'adresse memoire des valeurs de Bool devient l'adresse memoire de mes variables et donc la modification devient possible.
par contre comme j'ai dit tout a l'heure, si je passe une variable de type array of boolean en arguments, var bool pointeras bien sur cette variable et donc l'affectation a Bool[x] reviendras a affecter directement a Varb[x]
donc c'est bien ce que je disais tout a l'heure, il manque un "Array of var" dans delphi ...
pourtant "array of const" existe alors pourquoi pas ça!?
et cela n'est pas seulement specifique au type boolean mais egalement aux autre.
alors il faudrait trouver une solution pour pouvoir avoir un equivalent pratique du theorique "array of var type"
sans pointeur ... ça risque de pas etre possible.
La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 14 déc. 2005 à 13:35
alors oui JLen, no probleme quand tu utilise un tableau ça c'est bon.
le probleme c'est quand tu fait :
var
var1, var2, var3 : boolean;
init des boolean
et
SetBooleans([var1,var2,var3]);
et pouf ça marche pas.
donc obliger de travailler avec des pointeurs... c'est presque normal en fait plus j'y pense.
par contre, obligé de créer un type TArBoolean = array of boolean pour eviter les apels ambigus a SetBooleans que j'ai overloader sur une version pour les tableau type TArBoolean et une autre pour les Pointeurs.
car je rapel que SetBooleans permet d'assigner en une seule declaration la meme valeur booléene a plusieurs variable boolean.
trés utile quand on a beaucoup de variable de control de ce type par exemple a initialisé a False ou True ce qui me fait gagner du temps.
procedure declinée egalement pour pouvoir travailler sur les propriétés Enabled, Visible, Checked des objet de type TControl, TCheckBox, TRadioButton, TCheckListBox ect... ect...
(procedure qui elles fonctionne parfaitement sans pointeurs et sans "var")
@cirec : je pense pasque le code soit vraiment utile, mais si tu y tiens :
interface
type
BoolMode = (bmTrue,bmFalse,bmSwap);
pBool = ^boolean;
TArBoolean = array of boolean;
implementation
procedure SetBooleans(const bool: array of pBool; const Value: BoolMode= bmTrue);
var x : integer;
begin
for x := 0 to length(bool)-1 do
case value of
bmTrue : bool[x]^ := true;
bmFalse: bool[x]^ := false;
bmSwap : bool[x]^ := NOT bool[x]^;
end;
end;
procedure SetBooleans(var bool: TArBoolean; const Value: BoolMode= bmTrue);
var x : integer;
begin
for x := 0 to length(bool)-1 do
case value of
bmTrue : bool[x] := true;
bmFalse: bool[x] := false;
bmSwap : bool[x] := NOT bool[x];
end;
end;
La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 14 déc. 2005 à 13:43
ton probleme si j'ai tout compris c'est que var1, var2, var3 sont des
variables independantes et possedent donc des adresses qui ne sont pas
forcément contigues. Or DELPHi (comme tout autre langage d'ailleurs) à
besoin que les adresses des variables soient contigues pour pouvoir
gérer les index de tableau (en fait des pointeurs) ce qui rend
impossible les structures du type array of var ce qui oblige à passer
par les addresses des variables Une façon de passer une liste de
variables indépendantes serait de créer une Tlist (qui est un tableau
de pointeurs)et de la passer en paramètres mais là aussi on repasse par
les pointeurs.
cs_Kenavo
Messages postés702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 14 déc. 2005 à 13:55
f0xi
Ton truc, c'est comme si avec une procédure :
procedure Double(var a : integer);
begin
a:= a*2;
end ;
//on appelle :
Double(5);
... Un objet constante ne peut etre passé comme parametre Var ...
Dans ton cas, le tableau [b1,b2,b3] est une constante (même si ses éléments sont des variables).
et taper :
SetLength(UnBool,3); // UnBool = array of boolean
UnBool[0] := b1;
UnBool[1] := b2;
UnBool[2] := b3;
Schtroumpfise(UnBool); // procedure Schtroumpfise(var Bool : array of boolean);
b1 := UnBool[0];
b2 := UnBool[1];
b3 := UnBool[2];
ne simplifie pas l'écriture
Ta solution (table de pointeurs sur boolean) me semble la plus légère
(qu'en pensera Delphiprog ?). J'y retrouve mes quelques souvenirs du C
où var n'existant pas, il faut toujours passer le pointeur lors
du passage de paramètres que l'on désire variables (on ne passe que des
valeurs en C)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 14 déc. 2005 à 14:27
oui, d'ailleur ce serait pas difficile je pense de programmer cela dans le compilateur pour qu'il ajuste correctement un array of var en array of pointeur...
mais bon ... aprés tout ce qui me derange c'est juste les @ a ajouter devant les variables ... c'est tout.
La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 14 déc. 2005 à 14:45
J'ai fait les testes de mon coté effectivement il faut passer des pointeurs, en fait j'avais pas saisis la petite nuance (d'ou ma demande de code) entre Schtroumpfise( un_Array_Of_Bool) et Schtroumpfise([Bool1, Bool2, Bool3]) qui je le reconfirme ne fonctionne pas
si non pour changer une où plusieurs propriétées d'un où plusieurs composant tu peux utiliser cette Procédure très pratique
Procedure SetPropertys(ClassName: String; SomeProperty: ArrayOfString; Value:
Array Of Variant);
Var
i, j : integer;
PropInfo : PPropInfo;
Component : TComponent;
Prop_and_Value : Boolean;
Begin Prop_And_Value :High(SomeProperty) High(Value);
With AOwner Do // aOwner est la Form contenant les composants
Begin For i : = 0 To ComponentCount - 1 Do Begin Component := Components[i]; // n'est pas absolument indispensable
If (Component Is TControl) And ((Component.ClassName = ClassName)
Or (ClassName = 'AllComponents')) Then
Begin
For j : = 0 To High(SomeProperty) Do Begin
PropInfo := GetPropInfo(Component.ClassInfo, SomeProperty[j]);
If Assigned(PropInfo) Then If Prop_And_Value Then
SetPropValue(Component, PropInfo, Value[j])
Else
SetPropValue(Component, PropInfo, Value[0]);
End;
End;
End;
End;
End;