Forum Clubic

Problème avec projet code blocks

Bonjour, j’ai un problème avec code blocks, j’ai un projet qui fonctionne parfaitement avec Microsofst visual mais pas avec code blocks, je ne comprend rien aux erreurs trouvée. Dans mon projet j’ai ajouter un fichier bibl.o (c’est la bibli que j’avais sous le programme MS compiler avec code blocks) et un fichier bibl.h, les deux fonctionne parfaitement (essayé avec un autre programme sous code blocks).

Mais avec ce qui suit rien ne va :

#include <stdio.h>
#include <math.h>
#include "C:\Users\gary\Documents\bibl\bibl.h"

int nb_elements,position,i,j,k;
double tableau[1000],valeur,R_para;

void inserer()
{
	printf("Possition d'insertion : "); scanf("%d",&position);
	printf("Valeur a inserer : "); scanf("%lf",&valeur);
    inserer(tableau,&nb_elements,&position,&valeur);
}

void supprimer()

{
    printf("Possition de suppression : "); scanf("%d",&position);
    supprimer (tableau,&nb_elements,&position);


}

void modifier()
{
    printf("Possition de modification : "); scanf("%d",&position);
	printf("Nouvelle valeur : "); scanf("%lf",&valeur);
    modification(tableau,&position,&valeur);
}

void moyenne ()
{
    printf("moyenne = %lf \n",moyenne(tableau,nb_elements));

}

void max()
{
    printf("Max = %lf\n",maximum (tableau,nb_elements));

}


void tri ()
{
    tri(tableau,nb_elements);
}

void afficher ()
{
 affichage (tableau,nb_elements);
}
void abaque ()
{

	for(i=0;i<nb_elements;i+=1)
	{
		printf("      R%d  ",i);
	}
	printf("\n");
	for(i=0;i<nb_elements;i+=1)
	{
		printf("R%d   ",i);
		for(j=0;j<=i;j+=1)
		{
			printf("%5lf ",R_para=tableau[i]*tableau[j]/(tableau[i]+tableau[j]));
		}
		printf("\n");

	}
}

void afficher_menu()
{
    printf("Menu : \n___________________\n0.quitter 1.Inserer 2.Supprimer 3.Modifier \n4.Afficher moyenne 5.Afficher max 6.Trier\n7.Afficher le tableau 8.afficher abaque des resistance en parallele\n");

}

int main()
{
int choix;
lire (tableau,&nb_elements);
affichage (tableau,nb_elements);
do
{
afficher_menu();
printf(“choix = “); scanf(”%d”,&choix);
switch (choix)
{
case 0:
printf(“Au revoir \n”);
break;
case 1:
inserer();
break;
case 2:
supprimer();
break;
case 3:
modifier();
break;
case 4:
moyenne ();
break;
case 5:
max();
break;
case 6:
tri();
break;
case 7:
afficher();
break;
case 8:
abaque();
break;
default:
printf(“Mauvais choix \n”);
}
}
while(choix!=0);
return 0;
}

le bibl.h :

void affichage (const double tab[], int nb_elem);
void lire (double tab[], int * p_nb_elem);
void inserer (double tab[], int * p_nb_elem, int *pos, double *val_ins);
void supprimer (double tab[], int *p_nb_elem, int *pos );
void modification (double tab[], int *pos, double *p_new_val);
double moyenne (const double tab[], int nb_elem);
double maximum (double tab[], int nb_elem);
void tri (double tab[], int nb_elem);

Désolé pour la mise en page, quand je veux éditer tout ce met bien mais le message sur le forum ne s’affiche pas bien
Edité le 25/06/2011 à 14:18

Pour la mise en forme, passe par pastebin

Pour le reste, c’est quoi ton erreur ?

pastebin.com…
Voici les erreurs:

in function “inserer”
ERROR : prototype declaration (ligne 3 du bibl.h)
error : number of arguments doesn’t match prototype (ligne 9 du prog)

in function “supprimer”
error : number of arguments doesn’t match prototype (l17 du prog)
error : prototype declaration (ligne 4 du bibl.h)

error : conflicting types for “moyenne” (ligne 32 du prog)
error : previous declaration of “moyenne” was here (ligne 6 du bibl.h)
error : conflicting types for “moyenne” (ligne 32 du prog)
error : previous declaration of “moyenne” was here (ligne 6 du bibl.h)

infunction ‘moyenne’:
error : invalid use of void expression (ligne 33)

infunction ‘tri’:
error: number of arguments doesn’t match prototype (ligne 45)
error : prototype declaration (ligne 8 du bibl.h)

in function ‘main’
error : too few arguments to function ‘inserer’ (ligne 93)
error : too few arguments to function ‘supprimer’ (ligne 96)
error : too few arguments to function ‘tri’ (ligne 108)
Le problème vient de la syntaxe je présume (vu que le programme marchait avec microsoft visual que je n’ai malheureusement pas chez moi)
Edité le 25/06/2011 à 16:03

Ah ben oui. Tu déclares une fonction A avec n paramètres (dans ton fichier H), et ensuite, tu l’as définis dans ton fichier C en omettant les N paramètres, ça ne lui va pas tout ça, et il te le dit.

IL a raison, Visual Studio t’a en revanche clairement induit en erreur

Je comprend pas ce que tu veux dire

h
void inserer (double tab[], int * p_nb_elem, int *pos, double *val_ins);
Prog principal
inserer(tableau,&nb_elements,&position,&valeur)

Les paramètres sont utilisé.

C’est comme ça qu’on m’apprend à faire en cour.
Edité le 25/06/2011 à 23:35

Si je met le contenu des fonctions du programme principal à la place de leurs appels dans les cases du switch le programme fonctionne. Donc le problème vient de la manière dont code blocks traite les fonctions qui en appellent d’autres qui n’est pas la même que celle de visual, comment dois-je écrire une fonction qui en appel une autre avec code blocks?

J’ai pensé à un moment que cela venait des noms, les fonctions du prog principal ayant le même nom que celles qu’elles appellent mais en les changeant ça ne fonctionne pas.

Non.

Déjà pour commencer, dans l’entête, pas d’include sur un chemin absolu (“C:/…/bibi.h”).
Ensuite, ligne 8 du fichier C tu fais :

void inserer()

Mais plus haut (dans le H) tu déclare la fonction comme tel :

void inserer (double tab[], int * p_nb_elem, int *pos, double *val_ins);

Ce n’est pas bon : il faut que tu ai la même chose que dans l’entête, à savoir la ligne du dessus :

void inserer (double tab[], int * p_nb_elem, int *pos, double *val_ins)
{
	printf("Possition d'insertion : "); scanf("%d",&position);
        printf("Valeur a inserer : "); scanf("%lf",&valeur);
        inserer(tableau,&nb_elements,&position,&valeur);
}

J’espère avoir été clair, et ta fonction inserer risque de te péter à la gueule car elle est récursive mais sans contrainte de fin.

La fonction insérer dans le programme principal n’est pas la même que celle dans bibl.h, celle dans le programme principal appelle celle de bibl.h. Je vais essayé ce que tu m’a dit.

Je sais pas pourquoi ici j’ai à nouveau juste changé le nom des fonctions dans le programme et là plus de problème. Par contre si j’enlève le include include “C:\Users\gary\Documents\bibl\bibl.h” par ce que tu indiques ça ne va plus.

Merci, en tout cas
Edité le 26/06/2011 à 17:22

Tu comprends que #include fait référence à un chemin depuis le fichier C dans lequel c’est écrit ? Donc si tu veux que dans ton cas l’include fonctionne sans avoir un chemin absolu, il faut mettre un chemin de telle sorte à ce que le compilateur puisse le résoudre. Donc si bibl.h et bibl.c sont au même endroit, fait juste #include “bibl.h”.

Et au final, je viens de comprendre ton vrai problème. VisualStudio te fait un programme en C++ mais CodeBlocks, tel que tu l’as paramétré, te fait un programme en C. Une des différences majeures est le fait que le C n’autorise pas la surcharge des fonctions : tu ne peux pas avoir deux fonctions ayant le même nom mais pas le même nombre de paramètres.

Au choix :

  1. Soit tu configures CodeBlock pour faire du C++ - et ne l’utilisant pas, ça sera RTFM et Google :wink: néanmoins, je suppose que ça traîne dans les propriétés du projet, onglet/page/etc Compilateur et il te faut choisir g++ (ou mingw-g++, etc)
  2. Soit tu renommes tes fonctions inserer() (sans paramètres) en quelque chose d’autres de telle sorte que tu n’ai qu’une seule fois cette fonction.

Je travail bien en c avec visual et le bibl.h n’est pas au même endroit que le programme c’est pour cela que j’écris tout le chemin. Je crois que visual corrige le problème des fonctions ayant le même nom mais pas les mêmes paramètres ou que la logique du programme est différente et que c’est pour cela que je n’avais pas de problème avec visual.
Edité le 26/06/2011 à 18:24

Nope. Ton Visual fait du C++. La surcharge de fonction c’est pas du C :slight_smile:

Désolé mais tu te trompes c’est bien du c, ça fait des mois que j’écris des programmes en cour en sélectionnant à chaque fois cette option.

Moi je ne dirais rien de plus que ça : locklessinc.com…

Je ne te jette pas la pierre, mais si ça fonctionne sous Visual et pas sous Code Block, et vu l’erreur, c’est probablement que Microsoft compile en C avec des extensions C++ et génère peut-être aussi des fichiers *.o “C++” et non C.

Maintenant, le C évolue encore, et peut-être que tu dois juste passer du C89 au C99 voir au C2009 si ça existe… Mais personnellement, je ne jouerai pas là dessus, et je renommerai mes fonctions…

A toi de voir.

J’ai déjà renommé mes fonctions comme je l’ai écrit plus haut et tout fonctionne maintenant.
J’avais pas fait attention aux extensions des fichiers mais tu as raison visual génère des fichiers c++ :etonne: