GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: vardanega le 24 Avril 2011, 10:24:14
-
Bonjour, j'ai plusieurs variable (new VarVote[7];) qui au fils du temps prennent des valeurs différentes, je voudrais simplement récupérer la plus grande valeurs entre toute, j'imagine qu'il faut utiliser un while / des if pour comparez une a une, mais je n'est aucune idée de comment m'y prendre.
Si un peux aide pouvait mettre fournie !
Cordialement Vince.
-
Utilise la fonction strlen de la librairie string.inc.
native strlen(const string[]);
-
Mes variable sont numérique.
Il en a 6 maximum:
VarMap[1] //valeur de 10
VarMap[2] // valeur de 32
VarMap[3]
VarMap[4]
VarMap[5] ect ...
Merci
-
Tu peut faire un truc de ce genre
GetBiggestValue( const array[], size )
{
new value = 0; // On déclare une variable qui va stocker la valeur la plus grand qu'on ai pu trouver
for( new i = 0; i < size; i++ )
{
if( array[i] > value ) value = array[i]; // ici on test si la valeur du tableau est plus grande que la dernière plus grande valeur trouvée, alors on lui assigne cette valeur la
}
return value; // ici on retourne la valeur la plus grande qu'on ai trouvé ^^
}
-
Salut,
d'après le nom de sa variable, je dirais que c'est un vote, il voudra probablement donc avoir la position de la valeur.
De plus, dans ce genre de cas comment gère t'on deux choix ayant le même nombre de votes?...enfin, reposte si tu as des problèmes avec cette partie.
enfin, pour avoir la position en plus, tu peut faire dans ce genre:
GetBiggestValue( const array[], size, &pos )//on passe la position par référence
{
new value = 0; // On déclare une variable qui va stocker la valeur la plus grand qu'on ai pu trouver
pos = -1;//on met une valeur par défaut (habitude)
for( new i = 0; i < size; i++ )
{
if( array[i] > value )
{
value = array[i]; // ici on test si la valeur du tableau est plus grande que la dernière plus grande valeur trouvée, alors on lui assigne cette valeur la
pos = i;
}
}
return value; // ici on retourne la valeur la plus grande qu'on ai trouvé ^^
}
Comme ça cette fonction retourne le nombre de vote du max et la position où cette valeur a été trouvée.
Bonne chance
++Sim++
-
Bonsoir, oui c'est une variable pour un vote donc il ce peux que deux variable est la même valeur, une petite question que signifie "&pos" dans le code fournie plus haut ?.
Merci beaucoup pour l'aide apporté.
Vince
-
Salut,
lorsque tu vois qu'un paramètre d'une fonction comporte le symbole '&' devant le nom du paramètre, cela signifie que ce paramètre est passé par référence.
De cette façon, au lieu de créer une nouvelle variable dans la mémoire de l'ordinateur, le programme travaille avec la variable originale.
Ceci permet donc de modifier la valeur de la variable, même si elle se trouve dans un autre endroit du code. Ceci permet d'y avoir accès en écriture et non seulement en lecture.
Dans cet exemple, pos correspond à la position dans le tableau de la variable la plus haute. Si tu veut savoir qui a gagné, il te faut cette information (à moins de faire une boucle dans ton code en cherchant la valeur retournée par la fonction...) Ce qui t’intéresse, ce n'est pas «combien vaut» la valeur la plus grande, mais bien «laquelle es-ce».
Essaie de penser à comment faire pour gérer les cas où il y a égalité et reviens nous avec l'idée. On verra ce que tu pourras faire pour l'appliquer.
++Sim++
-
@Sim: On peut donc dire que l'on utilise les pointeurs :P.
-
Salut,
@Sim: On peut donc dire que l'on utilise les pointeurs :P.
attention, il s'agit de références, pas de pointeurs!
Il s'agit de deux notions distinctes, bien que fortement reliées.
Le pointeur est une variable qui indique l'élément que l'on travaille, il contient l'adresse.
La référence EST cet élément.
Enfin, c'est ce que j'ai cru comprendre, je n'ai que très peu étudié ces notions. Les deux sont très faciles à confondre.
De plus, les pointeurs n'existent pas en PAWN (pas directement, pas comme en C++ par exemple) comme la gestion de la mémoire est très ... statique.
Il y a peu de manipulation de mémoire possible en PAWN.
Nous sortons du sujet je crois (bien que ce soit une conversation intéressante).
++Sim++
-
@GZsume : La fonction de Ssk est exactement la même que celle dont tu donnes le lien (ce qui est normal, c'est à peu près la seule façon simple de trouver la plus grande valeur dans un ensemble).
@Sim : En C++ (car ça n'existe pas en C), le passage par référence est une fait un passage par pointeur mais où la variable peut être utilisée dans le code comme si elle avait été passée par valeur.
Exemple :
/* Passage par valeur */
void MaFonction (struct Machin Chose )
{
if (Chose.Bidule == 2)
{
printf ("Bidule vaut 2\n");
/* Ici on ne peut pas modifier la valeur des champs de la structure,
si on le fait, ils ne seront modifiés que localement */
}
}
/* Passage par pointeur */
void MaFonction (struct Machin *Chose )
{
if (Chose->Bidule == 2)
{
printf ("Bidule vaut 2\n");
Chose->Bidule = 6;
}
}
/* Passage par référence */
void MaFonction (struct Machin &Chose )
{
if (Chose.Bidule == 2)
{
printf ("Bidule vaut 2\n");
// Même notation que le passage par valeur mais la variable peut être modifiée
Chose.Bidule = 6;
}
}
++
Syg
-
Salut,
merci grand Syg.
J'étais pratiquement certains que c'était implanté via des pointeurs (y a pas 10 000 façons de faire, ça prend l'adresse mémoire...), mais je pensais que la distinction était plus grande entre les deux.
++Sim++
-
En fait, c'est juste une façon commode d'utiliser les pointeurs.
Mais ça a un autre avantage : on est forcé d'utiliser le paramètre correctement.
Exemple :
void MaFonction (int *MonEntier)
{
/* Le C/C++ permet de faire ça :*/
MonEntier[10] = 25;
}Si on appelle la fonction précédente en passant un pointeur sur un entier, tout va se compiler et linker comme il faut, sans erreur mais lors de l'exécution, on va aller écraser une partie de la mémoire où on n'aurait pas dû aller, ce qui conduira à un comportement erratique du programme.
Par contre, si le paramètre était passé par référence, on aura une erreur de compilation lors de son utilisation :
void MaFonction (int &MonEntier)
{
/* La ligne suivante provoque une erreur de compilation */
MonEntier[10] = 25;
}
++
Syg
-
Je suis tombé sur ça (http://forum.sa-mp.com/showthread.php?t=251108) sur le forum de SA-MP pour ceux que ça intéresse.
Merci pour cette fonction c'est ce que je recherchais, mais impossible de récupérez le nom de la variable qui a la plus grande valeur.
Merci Sim & Syg pour vos explications tres éclairées !
Vince
-
Salut,
c'est pour cette raison que j'avais ajouté un paramètre pos. (savoir qui a gagné)
Mais comme je te disais, il faudrait encore modifier un peu cette fonction afin de gérer les cas d'égalité (à toi de voir comment tu veut le faire (genre choisir le premier, choisir tous les égaux etc...)
++Sim++
-
Salut,
d'après le nom de sa variable, je dirais que c'est un vote, il voudra probablement donc avoir la position de la valeur.
De plus, dans ce genre de cas comment gère t'on deux choix ayant le même nombre de votes?...enfin, reposte si tu as des problèmes avec cette partie.
enfin, pour avoir la position en plus, tu peut faire dans ce genre:
GetBiggestValue( const array[], size, &pos )//on passe la position par référence
{
new value = 0; // On déclare une variable qui va stocker la valeur la plus grand qu'on ai pu trouver
pos = -1;//on met une valeur par défaut (habitude)
for( new i = 0; i < size; i++ )
{
if( array[i] > value )
{
value = array[i]; // ici on test si la valeur du tableau est plus grande que la dernière plus grande valeur trouvée, alors on lui assigne cette valeur la
pos = i;
}
}
return value; // ici on retourne la valeur la plus grande qu'on ai trouvé ^^
}
Comme ça cette fonction retourne le nombre de vote du max et la position où cette valeur a été trouvée.
Bonne chance
++Sim++
Bonjour, merci pour ce code mais comment doit je utiliser cette fonction, ou placez mes VarVote ?
Merci,
Vince.
-
Salut,
disons que tu as ceci:
new varvote[7] = {1, 2, 3, 4, 5, 6, 2};//résultat des votes
Si tu veut connaitre le résultat, tu fais ainsi:
new maxVote, voteGagnant;
maxVote = GetBiggestValue(varvote, 7, voteGagnant);
printf("Le %de choix à gagné avec %d votes!", voteGagnant, maxVote);
Le print c'est pour te montrer clairement à quoi correspond chaque variable.
bonne chance
++Sim++
-
Bien ! j'ai compris ! merci beaucoup pour votre aide et votre travail !
Vince.