Partage
  • Partager sur Facebook
  • Partager sur Twitter

passing arg of from incompatible pointer type

Sujet résolu
31 mars 2018 à 20:16:17

Bonjour :ange:

J’essaye de coder un programme qui revoit la somme des termes de la suite de Fibonacci petit qu'une certain limite.

--voila ce que j'ai fait :

#include<stdio.h>
void fibo (long int limite,long int fibo1,long int fibo2,long int *somme)
{
	long int test;
	if (fibo2<=limite)
		{
		test=fibo1;
		fibo1=fibo2;
		fibo2=fibo1+test;
		(*somme)+=fibo2;
		fibo(limite,fibo1,fibo2,&somme);
		}
}
int main()
{
	long int somme=3;
	long int fibo1=1;
	long int fibo2=2;
	long int limite=100;
	fibo (limite,fibo1,fibo2,&somme);
	printf("%ld",somme);
	getchar();
	return 0;
}

--et voila les erreurs :

[Warning] passing argument 4 of 'fibo' from incompatible pointer type

[Note] expected 'long int *' but argument is of type 'long int **'

Merci de m'expliquer les erreurs et pourquoi ça marche pas.



-
Edité par Hich@m 31 mars 2018 à 20:18:57

  • Partager sur Facebook
  • Partager sur Twitter
31 mars 2018 à 20:53:02

Ligne 11 il ne faut pas l'opérateur adresse de & au paramètre somme.
  • Partager sur Facebook
  • Partager sur Twitter
31 mars 2018 à 21:03:10

Moi qui ne suis pas du tout un as des pointeurs, j'ai une petite astuce sans doute un peu ridicule mais efficace pour éviter ce genre d'erreur : je fais commencer par un 'p' mes noms de pointeurs. Ainsi, j'aurais défini la fonction ainsi :

void fibo (long int limite,long int fibo1,long int fibo2,long int *psomme)
{
    /* ... ... ... */
    *psomme+=fibo2;
    fibo(limite,fibo1,fibo2,psomme);
}

Grâce à cette lettre 'p', je vois que psomme est déjà un pointeur, donc qu'il ne faut pas mettre un & devant.

-
Edité par robun 31 mars 2018 à 21:03:36

  • Partager sur Facebook
  • Partager sur Twitter
31 mars 2018 à 21:04:11

rouloude a écrit:

Ligne 11 il ne faut pas l'opérateur adresse de & au paramètre somme.

Ça résout les bugs(même ci ça donne pas le résultat souhaité).

Pourriez-vous m'expliquer pourquoi (normalement pour changer la valeur de la variable somme il faut passer par un passage par valeur c'est a dire utiliser & pour passer l'adresse).



  • Partager sur Facebook
  • Partager sur Twitter
31 mars 2018 à 21:17:25

C'est parce que le paramètre somme de la fonction est un pointeur et il contient l'adresse de somme de la fonction main.

Quand tu es dans la fonction main tu mets l'opérateur & car tu envois l'adresse de la variable somme de la fonction main.

Quand tu es dans la fonction fibo, le paramètre somme est une variable local à la fonction qui a reçu l'adresse de la variable somme. 

  • Partager sur Facebook
  • Partager sur Twitter
31 mars 2018 à 21:50:12

En utilisant vos conseils :

#include<stdio.h>
void fibo (long int limite,long int fibo1,long int fibo2,long int *psomme)
{
	long int test;
	test=fibo2;
	fibo2=fibo1+fibo2;
	fibo1=test;
	if (fibo2<=limite)
	{
		(*psomme)+=fibo2;
		fibo(limite,fibo1,fibo2,psomme);
	}
}
int main()
{
	long int somme=3;
	long int fibo1=1;
	long int fibo2=2;
	long int limite=100;
	fibo (limite,fibo1,fibo2,&somme);
	printf("%ld\n",somme);
	system("pause");
	return 0;
}

et ça marche.

Merci robun et rouloude.

(les pointeurs sont assez...difficiles) 

  • Partager sur Facebook
  • Partager sur Twitter
31 mars 2018 à 22:13:21

Supprimé suite à la aux deux posts suivants. Merci.

-
Edité par edgarjacobs 31 mars 2018 à 23:14:45

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

31 mars 2018 à 22:27:18

edgarjacobs a écrit:

Tu n'aurais pas dû modifier le code de ton premier post: la remarque de rouloude ne veut plus rien dire, et j'avoue m'être demandé pourquoi il l'avait faite....

Son premier code comporte toujours l'erreur, il ne me semble pas qu'il l'ai modifié (ligne 11).

  • Partager sur Facebook
  • Partager sur Twitter
31 mars 2018 à 22:29:45

edgarjacobs : je crois qu'il a rectifié, du coup c'est ta remarque qui ne veut plus rien dire... ;)

Hich@m : tu n'es pas le seul à trouver ça difficile, on est au moins deux ! (et probablement un petit peu plus). Je pense qu'il faut être très rigoureux et attentif avec ces machins là, en particulier il vaut mieux que lorsqu'une variable est un pointeur, ça se voie comme le nez au milieu de la figure. Les pros nous conseillent toujours de faire attention avec les noms de variables, et je pense que nommer 'somme' un pointeur était une grave erreur puisque ça cachait sa qualité de pointeur.

-
Edité par robun 31 mars 2018 à 22:30:31

  • Partager sur Facebook
  • Partager sur Twitter
23 septembre 2021 à 10:11:40 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


23 septembre 2021 à 10:31:08

@AnasRadoui Bonjour, merci de ne pas déterrer d'ancien sujet résolu. Créer le votre dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (un bonjour ou des salutations à la communauté et se termine par des remerciements par avance pour les futures réponses), un description de votre problématique et le code que vous avez écrit inséré sur le forum à l'aide du bouton code </>.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter