Aller au menu - Aller au contenu

La programmation modulaire


Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2  3  4  5  6  Suivante
Pseudo Commentaire
Page Précédente  1  2  3  4  5  6  Suivante
Hors ligne Jonyboss # Posté le 30/04/2009 à 22:15:26
Avatar

Salut à tous!

Déjà merci pour ces bons tutos toujours aussi clairs! ^^
Mais, j'ai comme qui dirait un léger bug qui me chagrine et je ne sait même pas pourquoi il me dit ça :( :'(

Mon bug en fait c'est que Code::Block me dit que la fonction a déjà été définie ailleurs...

J'ai donc fait un nouveau programme pour trouver mon erreur (pour pouvoir réutiliser la solution ailleurs). Je vous montre mes différents fichiers :

Tout d'abord : ma page main.c :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include "tests.h"
#include "tests.c"

int main(int argc, char *argv[])
{

    printf("test de fonctions pour comprendre une erreure.\n\n");

    long Nombre1 = 6;
    long Nombre2 = 8;

    long resultat = addition(Nombre1, Nombre2);
    printf("Le résultat de l'addition des nombres %ld et %ld est %ld", Nombre1, Nombre2, resultat);


    return 0;
}


Ensuite : ma page tests.h

Code : C
1
long addition(long nombre1, long nombre2);

(elle reste certe très simple :-° )

et enfin : ma page tests.c :

Code : C
1
2
3
4
5
6
7
#include <stdio.h>
#include <stdlib.h>
long addition(long nombre1, long nombre2)
    {
        long resultat = nombre1 + nombre2;
        return resultat;
    }


et l'erreur se situe au niveau de la première accolade du fichier test.c où Code::Block me dit "multiple definition of '_addition'" et sur la ligne suivante il me dit fièrement "first defined here" en m'indiquant l'accolade... Et donc? où est l'erreur? Quand je regroupe tout ces fichier dans le main.c, ça passe impec... qu'est-ce qu'il se passe? :o o_O

Je suis un peut dans le floue à vrai dire, quelqun peut m'aider? :'(

Image utilisateur
 
Hors ligne CO2 # Posté le 04/05/2009 à 22:20:31
Avatar

enlève les directives de prépocesseur de ton "test.c" ;)

Urban terror  playerFedora loverImage utilisateur
 
Hors ligne Jonyboss # Posté le 05/05/2009 à 17:15:33
Avatar

Nop :( ça me donne toujours la même erreur :(

Toujour ce "multiple definition of '_addition'" avec un petit "first defined here" montrant la premiere accolade :'(

Image utilisateur
 
Hors ligne CeB68 # Posté le 05/05/2009 à 23:44:12
Avatar

Bonjour M@teo, je te passe les compliments mais je n'en pense pas moins...Une chose me turlupine =D...C'est pas plus logique de déclarer les fonctions dans le fichier.h, et de mettre les prototypes dans le main.c après les directives du préprocesseur ? Ca allège le code source et ça marche ^^...Quelles problèmes ca peut causer ? Est-ce qu'il est important de déclarer dans le .h ? Est-ce qu'on peut créer "Fonctions.c" et l'inclure après avoir déclarer les fonctions dedans ? Merci d'avance :p
Hors ligne CeB68 # Posté le 05/05/2009 à 23:48:06
Avatar

Même erreur que Jony lorsque j'ajoute une fichier source fonctions.c et que je déclare les fonctions dedans...
Hors ligne buz13 # Posté le 09/05/2009 à 13:55:27
time is money

voila moi j'ai un problème, voila mes deux fichier codes sources

j'ai un fichier avec des fonction dedans mais lorsque je met #include "fonction.c"
dans la main ca me met erreur plusieur valeur definies un truc dans le genre et quand je met pas #include "fonction.c" tout fonctionne tres bien... c'est normal?
Hors ligne Jonyboss # Posté le 10/05/2009 à 14:50:19
Avatar

o_O

Je croi que j'ai comprit :s

En faite, tout comme Code::Blocks ajoute le system("PAUSE"); automatiquement à la fin du main.c, je pense qu'il fait ça aussi pour les includes!

En faite à chaque fichier que code::blocks voit lors de la compilation il ajoute à chaque fois un include du fichier! ce qui fait que si on le fait nous même (de l'inclure dans le main.c) il va y avoir deux fois le même fichier d'inclu! (le notre avec la directive qu'on fait nous, et celui que code::blocks a include automatiquement!)

Résultat, la fonction est définie deux fois (puisqu'elle est incluse deux fois).

C'est pour cela que quand on enlève les directives d'include notre programme marche...

Bref, j'èspere vous avoir aider :p (moi oui :p )

@++ ;)

PS : Je vous dirait si je trouve un truc pour enlever cet automatisme ;)

Image utilisateur
 
Hors ligne Keyes # Posté le 10/05/2009 à 16:06:36
Avatar

Bonjour,

Je suis assez réticent sur le fait qu'il faille obligatoirement
mettre les fonctions utilisées par main avant celle-ci. Ceci
n'est pas logique car lorsque l'on compile, l'ordre
n'a aucune importance. Moi-même, je programme en mettant
toujours la fonction principale (main) avant toutes les
autres, et cela ne me pose aucun problème.
Hors ligne Keyes # Posté le 10/05/2009 à 16:56:00
Avatar

Excusez-moi. Faites comme si je n'avais rien dit.
Hors ligne Nico007 # Posté le 21/05/2009 à 11:42:40

Bonjour à vous, maîtres de la programmation !!!

Jusque là, je comprenais tous, mais là, je dois avouer que je n'ai...rien compris :p
Je voudrais savoir s'il était possible de faire #include"viveLeSiteDuZero.c"; dans lequel on aurait écrit toutes les fonctions nécessaires, au lieu de créer un fichier.h (dont je ne comprend pas l'utilité).

En espérant recevoir une réponse sans que l'on recopie tout le tuto :D , merci !!!
Hors ligne musician-rider # Posté le 24/06/2009 à 11:58:10
..............................
Avatar

Tout d'abord bravo pour ce tuto magnifique, je n'ai pas remercié depuis le début, donc je profite pour le faire ^^
Bref j'ai eu besoin de la programmation modulaire pour les petits exos sur les tableaux, et j'ai bloqué au moment d'afficher mes différentes fonctions qui étaient dans un fichier .c séparé.
Mais j'ai enfin trouvé mon erreur :D C'est juste que je n'avais pas compris que la programmation modulaire marche comme ça :
Dans tableaux.h (contenant les prototypes de mes fonctions):
Code : C
1
2
void possibilites();//les prototypes de mes fonctions...
//etc...


Ensuite dans tableaux.c(contenant mes fonctions) :
Code : C
1
2
3
4
5
6
7
#include <stdio.h>
#include <stdlib.h>
#include "tableaux.h"
void possibilites()
{//ma fonction
}
//etc...


Jusque là j'avais tout bon, mais c'était pour utiliser mes fonctions dans main.c que je ne trouvais pas :(
Mais après plusieurs tests acharnés, j'ai enfin trouvé :p

Voici donc mon main.c :
Code : C
1
2
3
4
#include <stdio.h>
#include <stdlib.h>
#include "tableaux.c" // Ce qui permet d'utiliser les fonctions de tableaux.c
//etc...


Et voilà ce que je ne trouvais pas! comment inclure les fonctions d'un autre .c dans le main!
Mais enfin j'ai trouvé, et je suis bien content ^^
Bref tout ça pour féliciter m@teo, et pour peut-être en débloquer certains (euh... je suis le seul à avoir bloqué sur ceci? :-° )




Un petit 20 car tu le mérites amplement ;)

if(programmeur_sadique){moi=1;}
Musicien, poète, gamer, programmeur, presque webmaster, écrivain, et lycéen à ses heures perdues :p
 
Hors ligne Vauclerc # Posté le 24/06/2009 à 16:13:05

sauf erreur de ma part les enfants, on n'inclut pas de fichier .c dans les instructions de pré-processeur, seulement les fichiers prototype relatifs au fonctions susceptibles d'être appelées.
Je ne sais pas si le fait d'appeler un fichier .c est pris en compte, mais il ne faut pas vous étonner de rencontrer une erreur de définitions multiples si vous incluez plusieurs fois la même chose.
Hors ligne musician-rider # Posté le 24/06/2009 à 21:00:40
..............................
Avatar

Moi personnellement (je suis sous code::blocks) sans cette directive de préprocesseur #include"tableaux.c", mon programme plante.
En effet il m'a paru bizarre d'inclure le .c mais je n'ai pas le choix, je ne vais pas laisser mon programme planter juste pour ça :p

if(programmeur_sadique){moi=1;}
Musicien, poète, gamer, programmeur, presque webmaster, écrivain, et lycéen à ses heures perdues :p
 
Hors ligne shadorak # Posté le 27/06/2009 à 15:48:59

Ville : Chatou
Pays : France métropolitaine

Bonjour,
Je suis également sous code:blocks et il me faut inclure le fichier en .c au lieu du header correspondant afin d'avoir un programme fonctionnel.
Est-ce normal ? Cela va-t-il être génant pour la suite du tutoriel ?
Peut-être que code:blocks s'adapte ensuite et remplace par le header ... ?
Voilà en tout cas les deux erreurs affichées par code:blocks lors du debug (si j'inblus le header et non le fichier en .c) :
ligne de la première accolade qui indique le début du "contenu" de la fonction main : "erreur: expected '=' , ',' , ';' , 'asm' or '__attribute__' before '' token"
ligne de l'accolade indiquant la fin de la fonction main (après le return0) : "erreur: expected '{' at end of input"
Quelqu'un sait ce qu'il faudrait faire ? S'il faut bien mettre le .c plutôt que le .h (je ne veux pas juste avoir un programme qui marche mais plutôt un programme bien écrit afin de bien poursuivre le cours ...)? S'il faut faire une autre manipulation ?
Voici le détail du programme :
fichier main.c
#include <stdio.h>
#include <stdlib.h>
#include "fonctions.h"

int main()
{
long nombre = 2000;
long continuerprogramme = 1;
printf("Programme 1\n\n");

do
{
fonctionchoisie(nombre);
nombre = fonctionchoisie(nombre);
printf("%ld\n\n", nombre);
printf("continuer (O pour non, autre nombre pour oui) ?\n");
scanf("%ld", &continuerprogramme);
}while (continuerprogramme!= 0);
printf("Fin du programme");
return 0;
}

fichier fonctions.c :
#include <stdio.h>
#include <stdlib.h>

long fonctionchoisie (long nombre)
{
nombre = nombre + 1;
return nombre;
}

fichier fonctions.h :
#ifndef FONCTIONS_H_INCLUDED
#define FONCTIONS_H_INCLUDED

long fonctionchoisie (long nombre1)

#endif // FONCTIONS_H_INCLUDED

Bonne journée,
Hors ligne shadorak # Posté le 27/06/2009 à 15:51:06

Ville : Chatou
Pays : France métropolitaine

Je précise que j'utilise code:clocks sous ubuntu (ce qui explique l'absence se system pause)
Hors ligne shadorak # Posté le 27/06/2009 à 16:02:03

Ville : Chatou
Pays : France métropolitaine

En cherchant un peu, je me suis apperçu que j'avais oublié un ";" à la fin du prototype dans le header ... (*honteux*)
Cependant, maintenant que j'ai corrigé ce problème, (j'ai également enlevé la première ligne à l'intérieur de "do" dans la fonction main qui était de trop), il me signale une autre erreur : undefined reference to fonctionchoisie ... je ne comprends pas : j'ai pourtant bien mis le prototype dans le header ...
Hors ligne shadorak # Posté le 27/06/2009 à 16:06:54

Ville : Chatou
Pays : France métropolitaine

j'ai lu sur un forum que faire #include "le_nom_d_un_fichier" revenait à copier le contenu de ce fichier à l'emplacement du include ...
Je comprends l'intérêt d'avoir des fonctions réparties dans plusieurs fichiers pour conserver un minimum d'ordre mais si ce que j'ai lu est vrai, pourquoi utiliser des headers ? Quelle utilité ont-ils ?
Hors ligne shadorak # Posté le 27/06/2009 à 16:18:12

Ville : Chatou
Pays : France métropolitaine

En cherchant sur les forums concernant le C++, je viens de me rendre compte que je n'avais pas coché les cases "Debug" et "Release" en créant le fichier fonctions.c avec code:blocks.
J'ai donc recréé le fichier en cochant bien et là tout marche nickel.
Pour ceux qui avaient le même problème que moi :plusieurs points à vérifier :
ayez bien un ; à la fin du prototype dans le header
incluez bien le header dans le fichier.c correspondant et celui qui appelle une fonction du fichier.c
cochez debug et release lorsque vous créez vos fichiers sous Code:Blocks.
Bonne journée,
Hors ligne Mi@maths # Posté le 04/07/2009 à 14:18:34
Avatar

Salut ! Une question .... J'ai jamais compris pourquoi on devait mettre un " return " a la fin de chaque programme o_O je sais, je sais.... vous allez me dire "Ta qu'a regarder le tuto il te le dira idiot" mais j'ai regarder plusieurs fois et... je n'ai vu que la raison avec le "return 0" :euh:

PS: Cette question et vraiment essentielle pour moi car a cause de celle ci j'ai arrêter d'apprendre le Java et me C :(
Hors ligne kayma # Posté le 06/07/2009 à 14:04:39
Avatar

Bonjour,
j'ai testé le programme de matéo sur les pointeurs (celui qui renvoie les heures et les minutes), mais en testant les variables globales.
Mais, je n'arrive pas à faire marcher le programme, bizarrement les variables globales ne sont pas modifiées....

Voici mon programme, j'espère avoir quelques suggestions:
#include <stdio.h>
#include <stdlib.h>

long hour = 0, min = 90;

void decoupeMinutes(long heures, long minutes);

int main(int argc, char *argv[])
{


decoupeMinutes(hour, min);
printf("%ld heures et %ld minutes\n", hour, min);
return 0;
}

void decoupeMinutes(long heures, long minutes)
{
heures = minutes / 60; // 90 / 60 = 1
minutes = minutes % 60; // 90 % 60 = 30 (rappelez-vous : modulo = reste de la division, "90 divisés par 60 font 1, et il reste 30")
}

En même temps, je voudrai attirer votre attention au fait que le même programme sans arguments marche bien? Pourquoi?

Le programme est le suivant :



#include <stdio.h>
#include <stdlib.h>
long heures = 0, minutes = 90;
void decoupeMinutes();

int main(int argc, char *argv[])
{
decoupeMinutes();
printf("%ld heures et %ld minutes\n", heures, minutes);
return 0;
}

void decoupeMinutes()
{
heures = minutes / 60;
minutes = minutes % 60;
}
Hors ligne Swodinw # Posté le 16/07/2009 à 01:21:16
Have Fun :D
Avatar

Relis le chapitre sur les Pointeurs ... x)

Have Fun
 
Hors ligne Kiron # Posté le 17/07/2009 à 20:05:14
Tout est relatif, c'est absolu
Avatar
Flux RSS

Ville : Phalsbourg
Pays : France métropolitaine

Salut les Zér0s! :p
J'ai essayé d'améliorer mon "Plus ou Moins" en me servant de la programmation modulaire mais quand j'inclus une fonction "void" dans "main.c" il bugge systématiquement à la compil en me disant que je dois réctifier mes paramètres. Pourtant j'ai vérifié, j'ai bien mis "#incluse..." et tout et tout... :o

Quelqu'un pourrait-il m'aider? o_O

Voici la ligne de code en quesion :

...
void compareNombre(nombreMystere, nombreEntre, MIN, MAX, pointeurNombreCoups);
...

Pité! :'( Aidez-moi! Sinon je fraasse mon ordi contre le mur!!! :colere:


Merci d'avance!
Kiron ^^

Image utilisateur
 
Hors ligne Kiron # Posté le 18/07/2009 à 10:58:34
Tout est relatif, c'est absolu
Avatar
Flux RSS

Ville : Phalsbourg
Pays : France métropolitaine

Salut Mi@maths! ^^
La réponse à ta question est simple :
comme tu as dû le voir dans le chapitre sur la programmation modulaire, quand tu envoies une valeur (par exemple 3) à une fonction (mettons la fonction "triple") cette fonction doit te renvoyer un résultat (ici c'est 9 car le triple de 3 c'est 9).

En gros on a ça : ^^

3 ===> triple ===> 9

Mais une fonction ne renvoie pas une valeur toute seule. :-°
Il faut que tu lui demande de renvoyer le résultat (ici 9)...

Et c'es à ca que sert le return! :)

Voilà donc ta fonction :

int triple(int nombre) //Nombre = 3
{
int resultat = 0;
resultat = nombre*3;
return resultat;
}


Mais à quoi sert le return 0 de main.c? o_O


C'est tout bête!
La fonction main.c n'a rien n'a renvoyer (vu que c'est à elle qu'on renvoye des valeurs avec des "return" :D ) mais pour que ton ordinateur sache que le programme soit fini tu dois lui renvoyer une valeur.
Main.c renvoye donc 0 (Pourquoi 0? Ca je n'en sais rien :euh: mais ca n'a pas d'importance ^^ ) !!!


J'éspère avoir répondu à ta question.

Amicalement,
Kiron ^^

Image utilisateur
 
Hors ligne 21did21 # Posté le 22/07/2009 à 12:21:51

j'ai un gros probleme avec un programme de programmation modulaire:
voici mes fichiers, j'ai essayer de ne pas utiliser plusieurs fichiers et ca fonctionne, c'est lorsque je fait un fichiers .h et
.c que ca ne fonctionne plus.


-------------main.c---------------------------------

#include <stdio.h>
#include <stdlib.h>
#include "fichier.h"


int main()
{
double nb1 = 0, nb2 = 0, resultat = 0;
int condition = 0;



while (condition > 1 || condition < 1)
{
printf("salut mec!\n rentre un nombre\n\n");
scanf("%lf", &nb1);
printf("un deuxieme\n\n");
scanf("%lf", &nb2);
resultat = addition (nb1, nb2);
condition = resultat >= 50;
}
printf(" %f est bien superieur à 50 donc OK \n\n", resultat);
return 0;

}

----------------------fichier.c-----------------------------
#include <stdio.h>
#include <stdlib.h>
#include "fichier.h"

double addition (double aaa, double bbb)
{
double ccc = 0;

ccc = aaa + bbb;
return ccc;

}

---------------------------------fichier.h---------------------
#include <stdio.h>
#include <stdlib.h>


double addition (double aaa, double bbb);
Hors ligne 21did21 # Posté le 22/07/2009 à 12:23:13

o_O o_O VOILA L'ERREUR AFFICHEE PAR LE DEBUGGER: o_O o_O

- pour la ligne: resultat = addition(nb1, nb2);
- il me dit: undefined reference to ' _addition '

<attention>
Hors ligne MrWaloo # Posté le 27/07/2009 à 09:46:09

Dans la partie II, Programmation modulaire, dans la partie des headers.
Code : Autre
1
En faisant cela, vous n'aurez ainsi pas à vous soucier de l'ordre dans lesquelles les fonctions se trouvent dans vos fichiers .c

Une petite faute
Code : Autre
1
... de l'ordre dans lequel les fonctions se trouvent dans vos fichiers .c
Hors ligne rdcf # Posté le 28/07/2009 à 16:01:46

svp est-ceque quelqu' un pourrait me reexpliquer à quoi sa sert les prototypes(j'ai compris qu'on pouvait entrer les valeur des variables à l'exterieur de la fonction main) merci d'avance
Hors ligne thejjb # Posté le 29/07/2009 à 01:37:33

21did21
j'ai enlevé #include "fichier.h" qui était dans fichiers.h (j'ai aucune idéé pourquoi t'a apelé ton .header dans ton header o_O )
j'ai simplifié ta fonction je la trouve plus jolie comme ça mais elle marchait tres bien comme toi tu l'avais tapée.
désolé si j'ai changé certains noms et fais gaffe a ne pas confondre fonctions2.c et fonctions.h.


-----main.c-----
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
#include "fonctions.h"


int main()
{
double nb1 = 0, nb2 = 0, resultat = 0;
int condition = 0;



while (condition > 1 || condition < 1)
{
printf("salut mec!\n rentre un nombre\n\n");
scanf("%lf", &nb1);
printf("un deuxieme\n\n");
scanf("%lf", &nb2);
resultat = addition (nb1, nb2);
condition = resultat >= 50;
}
printf(" %f est bien superieur à 50 donc OK \n\n", resultat);
return 0;

}


-----fonctions2.c-----
Code : C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>

double addition (double aaa, double bbb)
{
/*la je t'ai simplifié ta fonction mais sa revient au meme dapres moi le probleme n'etai pa la mais c'est plus joli ainsi*/
return aaa + bbb;

}


----fonctions.h----- :D le fameux header
Code : C
1
2
3
4
5
6
7
8
9
#ifndef FONCTIONS_H_INCLUDED
#define FONCTIONS_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
//la j'ai enlevé #include "fonctions.h"
double addition (double aaa, double bbb);

#endif // FONCTIONS_H_INCLUDED


De rien thejjb
Hors ligne Arrows # Posté le 12/08/2009 à 16:02:44

@ kayma,

Salut, alors en premier, dans ton exemples sans arguments, c'est normal que tout fonctionne même si c'est pas un code très "beau", le fait de déclarer tes variables en globales te permet d'y accéder de n'importe où, ta fonction peut y avoir accès, mais comprends bien que elle ne les connais pas parce-que tu lui a dit lesquelles il devais utiliser, juste parce qu'il les connais d'avant.

sinon, le problème que viennent résoudre les pointeurs est tout autre, si tu déclare tes variables dans une fonction (main, ou autre... ), seule cette fonction sais qu'elles existent, donc tu est obligé de transmettre leurs valeurs à la fonction qui va faire le calcul, celle-ci, au lieu d'utiliser les variables existantes en fait des copies, donc toutes modifications dessus se perd à la fin de la fonction, l'ordinateur comprenant, "c'est la fin de la fonction, ces variables sont déclarés pour n'être connue que dans cette fonction, donc je n'en ai plus besoin.", il les effaces.

@21did21 && thjjb :

Juste comme ça, il me semblais que certaines de vos expressions étaient un peu "a rallonge" et comme on est là pour apprendre je me permet de vous simplifier cette ligne (^^)

il me semble que l'on peut remplacer : (condition > 1 || condition < 1)
par (condition != 1)

Sinon il y a autre chose qui me chagrine c'est l'utilisation même de la variable booléenne "condition", ta boucle pourrais tester directement (resultat < 50) non ?
Hors ligne royeur # Posté le 17/08/2009 à 12:36:07

Bonjour. Je ne savais pas où l'écrire alors je le poste ici:
Ce site est géniale et ce tuto sur le C et C++ est excellent
Pour accéder à cette section
Connectez-vous !
connexion_rpx