je fait un programme qui divise 2 paramètres est stock le résultat dans un int ainsi que le reste de la division dans un second int
mon programme compile et s'éxécute mais j'ai des warning
ft_div_mod.c:45:20: warning: incompatible pointer types passing 'int **' to parameter of type 'int *'; remove & [-Wincompatible-pointer-types]
ft_div_mod(a,b,&div,&mod);
^~~~
ft_div_mod.c:27:39: note: passing argument to parameter 'div' here
void ft_div_mod(int a, int b, int *div, int *mod)
^
ft_div_mod.c:45:25: warning: incompatible pointer types passing 'int **' to parameter of type 'int *'; remove & [-Wincompatible-pointer-types]
ft_div_mod(a,b,&div,&mod);
^~~~
ft_div_mod.c:27:49: note: passing argument to parameter 'mod' here
void ft_div_mod(int a, int b, int *div, int *mod)
^
2 warnings generated.
J'essaye de les comprendre mais la j'ai du mal, si quelqu'un veut bien m'expliquer pour que je puisse les prévoir a l'avenir
merci !
Voici mon code
#include <unistd.h>
void ft_putchar(char c)
{
write(1, &c, 1);
}
void ft_putnbr(int nb)
{
if (nb < 0)
{
ft_putchar('-');
nb = -nb;
}
if (nb >= 0 && nb <= 9)
{
ft_putchar(nb + '0');
}
if (nb >= 10)
{
ft_putnbr(nb / 10);
ft_putnbr(nb % 10);
}
}
void ft_div_mod(int a, int b, int *div, int *mod)
{
*div = a / b;
*mod = a % b;
ft_putnbr(*div);
ft_putchar(',');
ft_putnbr(*mod);
}
int main()
{
int a;
int b;
int *div;
int *mod;
a = 789;
b = 32;
ft_div_mod(a,b,&div,&mod);
}
Edit : c'est bon en faite j'ai trouvé dans mon main je re demander a pointer sur div et mod alors que c'est préciser dans mes paramètres
- Edité par leprincefou 5 mars 2022 à 17:12:17
Notre mesure du possible rend possible l'impossible
Comme la fonction est mal engagé on pourrait se le demander.
Il faudrait plutôt qu'elle n'affiche rien et quel ce servent des pointeurs pour retourner les deux valeurs (le résultat de la division et le modulo).
Tout dépend du pourquoi le PO fait ça ? Moi, je le vois comme des exercices, ce n'est donc pas vraiment fait pour servir à quelque chose. Tout dépend du point de vue qu'on a sur la chose !
Umfred il l'était pas assez pour moi faut croire, deuxièmement en t'écoutant je fait carrément crash le programme, si je les enlève dans l'appel comment ma fonction main fait le liens avec les valeur de ma fonction Div ?
Michel c'est l'exo c'est comme ça pour l'instant je pisse du code tout en essayant de comprendre. (dans le sens contraire ca marche pas)
Ensuite si une âme charitable peut m'expliquer (Tranquillement) lors de mon appel ainsi tout fonctionne
j'appel ma fonctions ensuite je print heure est minute mais avant j'avais déclarer grace au & que j'allais justement chercher leur adresse, la fonctions fait sa fonction ensuite j'affiche avec les modification, faite par l'appel de la fonction dans le main, juste avant ok.
et la sa m'affiche "more '%' conversions than data arguments" qui me dit que j'ai plus de % que d'argument pourtant j'ai deux % % pour deux arguments qui sont &heure, &minutes.
- Edité par leprincefou 7 mars 2022 à 18:51:58
Notre mesure du possible rend possible l'impossible
Il va falloir que tu révises le cours sur les fonctions !
Ta fonction renvoie un int (qui vaut zéro) (elle ne pourrait d'ailleurs pas renvoyer plus d'une valeur). heures et minutes ne sont que des arguments. D'accord, ta fonction les modifie, donc se sont eux qu'il faut afficher.
- Edité par edgarjacobs 7 mars 2022 à 19:53:45
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Tout dépend du pourquoi le PO fait ça ? Moi, je le vois comme des exercices, ce n'est donc pas vraiment fait pour servir à quelque chose. Tout dépend du point de vue qu'on a sur la chose !
Et bien normalement, les exercices ne consistent pas à écrire du code au pif, et ils ont
un objectif
une logique
Là, visiblement, on devine que l'objectif, c'est de faire utiliser les pointeurs comme moyen de simuler un passage de paramètre "en sortie". Et pour ça on force en demandant d'écrire une fonction qui a deux paramètres de sortie. Comme ça le débutant ne peut pas utiliser le mécanisme normal de retour de la fonction.
En fait si, il pourrait parfaitement, en utilisant une structure pour retourner les résultats
struct resultat {
int quotient;
int reste;
};
struct resultat resultat_division(int a, int b)
{
struct resultat r = {
.quotient = a / b,
.reste = a % b
};
return r;
}
mais bon niveau idées sur la programmation, les cours de C en sont restés au style "C préhistorique" (B) des années 70 où les gens n'avaient pas l'habitude d'employer des structures.
---
Partant de là, l'exercice heures minutes est mal posé. Pourquoi tient-on compte des minutes en entrée, mais pas des heures ? C'est absurde.
Il s'agit de décomposer un temps donné en nombre de minutes en heures et minutes, et c'est juste :
int temps_en_minutes = ....;
struct resultat r = resultat_division(temps_en_minutes, 60);
printf("%d minutes, ça fait %d heures et %d minutes\n",
r.quotient,
r.reste);
---
pour le code de l'OP, question de logique du découpage en fonctions
void ft_div_mod(int a, int b, int *div, int *mod)
{
*div = a / b;
*mod = a % b;
ft_putnbr(*div);
ft_putchar(',');
ft_putnbr(*mod);
}
qu'est-ce que le putchar vient faire là dedans ? Un bon principe de programmation c'est le "separation of concern". La fonction est chargée de faire des divisions entières - et c'est ce que dit son nom - et dans ce cas son job, c'est pas d'afficher. C'est au main de le faire
int main()
{
int a = 789, b = 32;
int quotient, reste;
ft_div_mod(a, b, "ient, &reste);
// affichages de quotient et reste ici.
// ...
return 0;
}
et la sa m'affiche "more '%' conversions than data arguments" qui me dit que j'ai plus de % que d'argument pourtant j'ai deux % % pour deux arguments qui sont &heure, &minutes.
Non, il y a un seul argument dans le 'printf' :
decoupeMinutes(&heures, &minutes) // 1 argument : le retour de l'appel à 'decopeMinutes'
&heures et &minutes ne sont pas les arguments de 'printf', ce sont les arguments de 'decoupeMinutes' (et je suis sûr que tu le sais ! )
Notre mesure du possible rend possible l'impossible
Warning lors de la compilation
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent