User forums > Help
Beginner - pb with my program - C langage
jpapot:
Hello everybody !!
I used tu work with Code::Blocks under windows.
I try now to use it under linux.
I've got a problem; It seems that the compilation is OK (I have installed the g++ ) but after this ... nothing.
It's probably a problem of setting, but how ?
Here is my program :
--- Code: ---#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define tailleMax 100000
double PGCD(double nb1,double nb2);
double PPCM(double nb1, double nb2);
int main()
{
double nb1, nb2;
int nb3;
int l,choix;
double encore =0;
int tab[tailleMax] = {0};
int tab2[tailleMax] = {0};
printf("Ce programme permet de :\n\n");
do
{
printf("1-calculer le PGCD de deux nombres.\n");
printf("2-calculer le PPCM de deux nombres .\n");
printf("3-trouver tous les diviseurs d'un nombre (jusqu'a 2.147.483.647).\n");
printf("4-decomposer un nombre en produit de facteurs premiers (jusqu'a 2.147.483.647).\n");
printf("5-rechercher les nombres premiers entre 2 valeurs (jusqu'a 2*10^6 en gros).\n\n");
printf("Votre choix : ");
for (l=0; l<=tailleMax; l++)
{
tab[l]=0;
tab2[l]=0;
}
scanf("%d",&choix);
switch (choix)
{
case 1 :
{
printf("\nEntrez le 1er nombre : ");
scanf("%lf",&nb1);
printf("Entrez le 2e nombre : ");
scanf("%lf",&nb2);
printf("\nLe PGCD de %.0lf et %.0lf est %.0lf\n", nb1,nb2,PGCD(nb1,nb2));
if (PGCD(nb1,nb2)==1)
printf("%.0lf et %.0lf sont premiers entre eux.",nb1,nb2);
break;
}
case 2 :
{
printf("\nEntrez le 1er nombre : ");
scanf("%lf",&nb1);
printf("Entrez le 2e nombre : ");
scanf("%lf",&nb2);
printf("\nLe PPCM de %.0lf et %.0lf est %.0lf", nb1,nb2,PPCM(nb1,nb2));
break;
}
case 3 :
{
int i,k;
printf("\nEntrez le nombre : ");
scanf("%d",&nb3);
printf("\nLes diviseurs de %d sont ",nb3);
for ( i=1 ; i<= sqrt(nb3); i++)
{
if ((nb3%i)==0)
{
tab[i-1]=i;
if (i*i != nb3)
tab[tailleMax-i]=nb3/i;
}
}
k=0;
printf("%d",tab[0]);
for (i=1; i<tailleMax; i++)
if(tab[i]!=0)
{
tab2[k]=tab[i];
printf(" - %d",tab[i]);
k++;
}
printf("\nIl y a %d diviseurs",k+1);
if (k==1)
printf(" : -----> %d est un nombre premier.",nb3);
break;
}
case 4 :
{
int i,j,k,x;
printf("\nEntrez le nombre : ");
scanf("%d",&nb3);
for ( i=1 ; i<= sqrt(nb3); i++)
{
if ((nb3%i)==0)
{
tab[i-1]=i;
if (i*i != nb3)
tab[tailleMax-i]=nb3/i;
}
}
k=0;
for (i=1; i<tailleMax; i++)
if(tab[i]!=0)
{
tab2[k]=tab[i];
k++;
}
printf("\n");
if (k==1)
printf("-----> %d est un nombre premier.",nb3);
else
{
j=0;
printf("%d = %d",nb3, tab2[0]);
x=nb3/tab2[0];
for (j=0; j<k; j++)
while ((x%tab2[j])==0)
{
printf(" x %d",tab2[j]);
x=x/tab2[j];
}
}
break;
}
case 5 :
{
int i,k,max,min,x;
int *entier=NULL;
printf("\nEntrez le plus petit nombre : ");
scanf("%d",&min);
do
{
printf("Entrez le plus grand nombre (il doit etre superieur ou egal a %d) : " ,min+2);
scanf("%d",&max);
}
while (max<=min+1);
entier = malloc(max*sizeof(int)); // allocation dynamique d'un tableau ; il aura max cases de int.
if (entier==NULL)
exit(0);
for (i=0; i<max; i++)
entier[i]=i;
i=1;
do
{
i++;
if (entier[i]!=0)
{
k=2;
while (k*i<=max-max%entier[i])
{
entier[k*i]=0;
k++;
}
}
}
while (i*i<max);
printf("\nLes nombres premiers compris entre %d et %d sont : ",min,max);
k=0;
for (i=min; i<=max; i++)
if ((entier[i]!=0)&&(i>1))
{
printf("%d ",entier[i]);
k++;
}
if (k==0)
printf("\n\nIl n'y a aucun nombre premier.\n");
else
printf("\n\nIl y a %d nombre(s) premier(s).\n",k);
if (min<=0)
min=2;
FILE *fichier=NULL;
fichier=fopen("nombrespremiers.txt","w+");
if(fichier!=NULL)
{
for(i=min; i<max; i++)
if (entier[i]!=0)
fprintf(fichier,"%d ",entier[i]);
rewind(fichier);
for(i=0; i<10; i++)
{
fscanf(fichier,"%d",&x);
printf("%d ",x);
}
}
else
printf("Impossible d'ouvrir le fichier Nombres.txt");
free(entier);
break;
}
default :
exit (0);
}
printf("\n\nVoulez-vous recommencer ? (oui = 1 , non = autre touche) : ");
scanf("%d",&choix);
if (choix==1)
encore = 1;
else
encore = 0;
printf("\n--------------------------------------------------------------------------------\n");
printf("--------------------------------------------------------------------------------\n");
printf("\n");
}
while (encore==1);
return 0;
}
double PGCD(double nb1,double nb2)
{
double dividende, diviseur, reste;
dividende = nb1;
diviseur = nb2;
do
{
reste = dividende - diviseur*floor(dividende/diviseur);
dividende = diviseur ;
diviseur = reste;
}
while (reste != 0);
return dividende;
}
double PPCM(double nb1, double nb2)
{
return nb1*nb2/PGCD(nb1,nb2);
}
--- End code ---
And the log :
--- Code: ---||=== Générer: Release in Diviseurs (compiler: GNU GCC Compiler) ===|
obj/Release/main.o:main.c|| référence indéfinie vers « _floor »|
obj/Release/main.o:main.c|| référence indéfinie vers « ___chkstk »|
obj/Release/main.o:main.c|| référence indéfinie vers « ___main »|
obj/Release/main.o:main.c|| référence indéfinie vers « _puts »|
obj/Release/main.o:main.c|| référence indéfinie vers « _puts »|
obj/Release/main.o:main.c|| référence indéfinie vers « _puts »|
obj/Release/main.o:main.c|| référence indéfinie vers « _puts »|
obj/Release/main.o:main.c|| référence indéfinie vers « _puts »|
obj/Release/main.o:main.c|| encore plus de références indéfinies suivent vers « _puts »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _scanf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _scanf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _scanf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _malloc »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _fopen »|
obj/Release/main.o:main.c|| référence indéfinie vers « _fprintf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _rewind »|
obj/Release/main.o:main.c|| référence indéfinie vers « _fscanf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _free »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _scanf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _sqrt »|
obj/Release/main.o:main.c|| référence indéfinie vers « _putchar »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _scanf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _sqrt »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _scanf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _scanf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _scanf »|
obj/Release/main.o:main.c|| référence indéfinie vers « _puts »|
obj/Release/main.o:main.c|| référence indéfinie vers « _puts »|
obj/Release/main.o:main.c|| référence indéfinie vers « _putchar »|
obj/Release/main.o:main.c|| référence indéfinie vers « _printf »|
||Plus d'erreurs suivent mais ne sont pas montrées.|
||Editer la limite maximale du nombre d'erreurs dans les options du compilateur ...|
||=== Build échoué: 50 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
--- End code ---
Sorry it's in french but maybe you can guess what it means.
A problem of path ? How to configure it ?
Thank you for your help and sorry for my english ;)
JP
jpapot:
Sorry a mistake : here is the log report :
--- Code: ----------------- Générer: Release in Diviseurs (compiler: GNU GCC Compiler)---------------
g++ -o bin/Release/Diviseurs obj/Release/main.o -s
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: dans la fonction « _start »:
(.text+0x18): référence indéfinie vers « main »
obj/Release/main.o:main.c:(.text+0x22): référence indéfinie vers « _floor »
obj/Release/main.o:main.c:(.text+0x8b): référence indéfinie vers « ___chkstk »
obj/Release/main.o:main.c:(.text+0x90): référence indéfinie vers « ___main »
obj/Release/main.o:main.c:(.text+0xbf): référence indéfinie vers « _puts »
obj/Release/main.o:main.c:(.text+0xcb): référence indéfinie vers « _puts »
obj/Release/main.o:main.c:(.text+0xd7): référence indéfinie vers « _puts »
obj/Release/main.o:main.c:(.text+0xe3): référence indéfinie vers « _puts »
obj/Release/main.o:main.c:(.text+0xef): référence indéfinie vers « _puts »
obj/Release/main.o:main.c:(.text+0xfb): encore plus de références indéfinies suivent vers « _puts »
obj/Release/main.o:main.c:(.text+0x107): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x13a): référence indéfinie vers « _scanf »
obj/Release/main.o:main.c:(.text+0x16a): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x181): référence indéfinie vers « _scanf »
obj/Release/main.o:main.c:(.text+0x19b): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x1b2): référence indéfinie vers « _scanf »
obj/Release/main.o:main.c:(.text+0x1d2): référence indéfinie vers « _malloc »
obj/Release/main.o:main.c:(.text+0x28c): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x2cb): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x2f9): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x31c): référence indéfinie vers « _fopen »
obj/Release/main.o:main.c:(.text+0x36e): référence indéfinie vers « _fprintf »
obj/Release/main.o:main.c:(.text+0x38b): référence indéfinie vers « _rewind »
obj/Release/main.o:main.c:(.text+0x3b3): référence indéfinie vers « _fscanf »
obj/Release/main.o:main.c:(.text+0x3ca): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x3dc): référence indéfinie vers « _free »
obj/Release/main.o:main.c:(.text+0x3ed): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x404): référence indéfinie vers « _scanf »
obj/Release/main.o:main.c:(.text+0x465): référence indéfinie vers « _sqrt »
obj/Release/main.o:main.c:(.text+0x4b0): référence indéfinie vers « _putchar »
obj/Release/main.o:main.c:(.text+0x4da): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x518): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x54e): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x565): référence indéfinie vers « _scanf »
obj/Release/main.o:main.c:(.text+0x57c): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x5dd): référence indéfinie vers « _sqrt »
obj/Release/main.o:main.c:(.text+0x60c): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x63c): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x659): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x677): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x688): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x69f): référence indéfinie vers « _scanf »
obj/Release/main.o:main.c:(.text+0x6ab): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x6c2): référence indéfinie vers « _scanf »
obj/Release/main.o:main.c:(.text+0x72e): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x73a): référence indéfinie vers « _printf »
obj/Release/main.o:main.c:(.text+0x751): référence indéfinie vers « _scanf »
obj/Release/main.o:main.c:(.text+0x76b): référence indéfinie vers « _puts »
obj/Release/main.o:main.c:(.text+0x777): référence indéfinie vers « _puts »
obj/Release/main.o:main.c:(.text+0x783): référence indéfinie vers « _putchar »
obj/Release/main.o:main.c:(.text+0x79c): référence indéfinie vers « _printf »
Process terminated with status 1 (0 minute(s), 0 second(s))
50 error(s), 0 warning(s) (0 minute(s), 0 second(s))
--- End code ---
BlueHazzard:
Hello,
thank you for your detailed report. I don't speak french (or whatever your language is) but i think the error message you get is "undefined reference to floor" *)
you have to add the math library to the linker. ( http://stackoverflow.com/questions/14743023/c-undefined-reference-to-floor )
You can do this in c::b by adding "-lm" (without quotes) under Project->Build options->Linker settings -> Other linker options
*) I personally hate the localized error output of the new gcc versions. For beginners it is nearly impossible to find the errors by googeling it, because all forums are (luckily) in english. To set the output language (only output of gcc, not the output of your program) of the gcc you can follow this instruction http://wiki.codeblocks.org/index.php?title=FAQ-Compiling_%28errors%29#Q:_How_can_I_change_the_language_of_the_compiler_.28gcc.29_output_to_english.3F So if you get other errors they can for 90% fixed by c&p the error in google...
greetings
jpapot:
Thank you BlueHazzard.
I speak french, but here I can also try another language ! ;)
Looking more carefully, I see this information from the log report :
--- Code: --- référence indéfinie vers « main »
--- End code ---
wich means undefined reference to "main" !!! It's the main that it's trying to compile, or what ?
Don't you think here is a problem ? :o
I tried to add the math library, without any success ... ???
I tried also to add the -lm as a link ... not better.
But as a beginner all of this is not so simple and maybe I made an error somewhere ?
Thanks for your help and have a good day (4 pm in France)
JP
BlueHazzard:
can you make a clean rebuild (the blue arrows, or Build -> Rebuild) and post the build log? (with the inserted -lm options in the linker settings. Make sure on the left site (of the linker options dialog) is selected your project, not a sub target)
greetings from a country near french ;)
Navigation
[0] Message Index
[#] Next page
Go to full version