[C] Pointeur int comme paramètre dans une function qui ne marche pas

Résolu
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 - 7 sept. 2005 à 14:13
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 8 sept. 2005 à 00:42
Bonjour à tous,

J'ai retourné les pointeurs dans tous les sens mais rien n'y fait.
J'aimerais modifier la valeur d'une variable int à l'interieur d'une fonction.
Selon tout ce que j'ai lu, ça devrait être ça:

void gererOuiNon(int* val) {
if (*val==0) { // Non
*val = 1;
}
if (*val==1) { // Oui
*val = 0;
}
printf("%d",val); // Affiche un grand nombre (normal, c'est le pointeur)
printf("%d",*val); // Affiche un grand nombre à la place de 0 ou 1
}

void main() {
int entete = 0;
...
gererOuiNon(& entete,11,4);
...
}

Comment ça marche ???

Merci d'avance.

David, à VERSAILLES

13 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 sept. 2005 à 00:42
Pour résoudre, tu lances la phase débuggage bourrin. Tu rajoutes
printf("%d",entete); quasiment partout, et tu regardes quand la valeur
change alors qu'elle ne devrait pas :) Cad, avant l'appel a ta
fonction, des le début de ta fonction et apres c'est toi qui choisit :)
3
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
7 sept. 2005 à 14:25
ta fonction attend une adresse de variable! Or toi, tu lui passe une constante :)

int truc=11;
...
gererOuiNon(&truc);

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
7 sept. 2005 à 14:28
Heuuuu, en fait non, c'est une variable puisque je la change directement dans une autre fonction (en fait, c'est une variable globale).

Mais même dans ton cas, il devrais au moins rentrer dans le if, chose qu'il ne fait même pas.

David, à VERSAILLES
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 sept. 2005 à 14:30
Ca compile ca ?

La fonction gererOuiNon est declaré avec 1param et toi tu lui en passes 3.

Voici de quoi faire:

#include <stdio.h>

void gererOuiNon(int *a)
{
if( *a==0 )
{
*a=1;
}
else if( *a == 1 )
{
*a=0;
}

}


int main()
{
int entete = 0;

gererOuiNon(&entete);

printf("Voici le resultat : %d\n\n", entete);
return 0;
}


Sinon voile
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
7 sept. 2005 à 14:34
ui, j'ai recopié le code pour ne mettre que l'essentiel,
Excuse pour le mauvais recopiage...

Voici le code corrigé:

int entete = 0; // Variable globale

void gererOuiNon(int* val) {
if (*val==0) { // Non
*val = 1;
}
if (*val==1) { // Oui
*val = 0;
}
printf("%d",val); // Affiche un grand nombre (normal, c'est le pointeur)
printf("%d",*val); // Affiche un grand nombre à la place de 0 ou 1
}

void main() {
gererOuiNon(& entete);
...
}

David, à VERSAILLES
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
7 sept. 2005 à 14:41
"La fonction gererOuiNon est declaré avec 1param et toi tu lui en passes 3."
--> Je n'avais même pas relevé :( je vais aller me prendre un café moi.

ça marche maintenant?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 sept. 2005 à 14:46
Tu le fait exeuprès ou quoi ???

Tu mets if( *val == 0 ) donc la ca rentre dans ta condition
Après tu mets if( *val == 1 ) et la ca rentre aussi vu que précédement t'as modifier la valeur de val a 1.

Ecris donc :

if (*val==0)
{ // Non
*val = 1;
}
else if (*val==1)
{ // Oui
*val = 0;
}

Shell
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
7 sept. 2005 à 14:47
Bin, nan, c'était une erreur de recopiage...

David, à VERSAILLES
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 sept. 2005 à 15:01
Prend mon code il marche très bien.
Si tu s'est pas recopier on est pas sorti de l'auberge.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
7 sept. 2005 à 15:04
Bah voilà! nitrique a fâché DeAtHCrAsH...
Toujours relire son code et le tester avant de le poster et de demander de l'aide

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
7 sept. 2005 à 15:10
Voici le code (plus lourd):

int entete = 0; // Binaire pour savoir si l'on met l'entête ou non

int gererOuiNon(int* val, int x, int y) {
int sortir=0,touche=0;
// *** procedure clavier ***
if (kbhit()) {
printf("\r%d ",*val); pause(2,0); // Renvoye 128
touche=getchar();
switch(touche) {
case ESC:
on_beeper(bip_sortie);
sortir = 1;
break;
case ENTER:
sortir = 2;
break;
case DOWN:
if (*val==0) { // Non
gotoxy(x,y);
printf("Oui ^");
*val = 1;
}
break;
case UP:
if (*val==1) { // Oui
gotoxy(x,y);
printf("Non v");
*val = 0;
}
break;
default:
on_beeper(bip_long);
} // Fin switch
gotoxy(x+4,y);
} // Fin if
return sortir;
}

int parametres() {
int sortir=0,lMaxNom=13;
char touche,temp[1];
int lgScr=20; // Longueur de la zone de saisie

...
do {
sortir = gererOuiNon(& entete,11,4);
} while(sortir<1); // on boucle tant que la touche n'est pas Esc */
...
}

Mais je ne voulais pas vous torturer les méninges car c'est un c propriétaire.

David, à VERSAILLES
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 sept. 2005 à 15:13
buno> LoOl meuh non p
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
7 sept. 2005 à 15:26
En fait je crois que le recopiage n'était pas une bonne idée.
Voici plus d'infos pour ceux que j'ai perturbé (et je m'en excuse):

C'est un logiciel pour portable lecteur de code à barres.
C'est la page de paramètres et ici, je récupère la touche saisie par l'utlisateur pour modifier les options (oui ou non).

Et comme la fonction doit me retourner 2 valeurs, je passe un paramètre par référence (Cette fonction sert aussi à d'autres options, je ne peux donc pas modifier directement la variable: entete à l'interieur).

Ouf, je croit que je suis arrivé à me faire comprendre, c'est déjà ça.

David, à VERSAILLES
0
Rejoignez-nous