Leger soucis en C

Bonjour a tous!

Dans le cadre d’un projet pour l’ecole, mon binome et moi meme devons réaliser un programme en C permettant plusieures fonctionnalitée autour d’un polynômes que l’utilisateur aurais entré.
Le programme est créé (toutes les fonctionnalitées n’y sont pas, mais ce n’est pas le plus important), le compilateur compile parfaitement, mais, le programme plante lors du calcul du resultat (‘r’) (dans la fonction “calcul_pol”), et je n’arrive, bien evidemment, pas a trouver pourquoi ^^

voici le programme:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct polynome{
    int degre;
    float *coeff;
};

void saisie_pol()
{
int i;
struct polynome p1;
    printf ("Entrez le degre du polynome: ");
    scanf ("%d",&p1.degre);
    p1.coeff=malloc((p1.degre+1)*sizeof(float));

	for(i=p1.degre;i>=0;i--){
        printf("Entrez le coefficient du terme de degre %d: ",i);
        scanf("%f",&p1.coeff[i]);
	}
}


int calcul_pol()
{
float r=0,x;
int i;
struct polynome p1;
    printf("Saisir x");
    scanf("%f",&x);

    for(i=p1.degre;i>=0;i--){
        r=r+((p1.coeff[i])*pow(x,i));
	}
return r;
}

void aff_pol(float re)
{
int i;
struct polynome p1;
    for (i=p1.degre;i>=0;i--,p1.degre--){
    printf("%g ",p1.coeff[i]);
    if(i!=0){
             printf("X^%d",p1.degre);
             printf(" + ");
             }
    }

printf("= %f",re);
}

int main(void){
    float r;
    struct polynome;
    printf("Saisir un polynome\n");
    saisie_pol();
    calcul_pol();
    aff_pol(r);
    system("PAUSE");
    return 0;
}

voila, j’espère que vous pourrez m’aider, n’étant pas très doué en C, le programme est loind 'etre parfais, donc si vous avez une astuce ou deux pour l’optimiser, je ne suis pas contre^^.
Merci de votre aide :slight_smile:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct polynome{
 int degre;
 float *coeff;
};

void saisie_pol(struct polynome * p1)
{
int i;

 printf ("Entrez le degre du polynome: ");
 scanf ("%d",&p1->degre);
 p1->coeff=(float*)malloc((p1->degre+1)*sizeof(float));

	for(i=p1->degre;i>=0;i--){
 printf("Entrez le coefficient du terme de degre %d: ",i);
 scanf("%f",&p1->coeff[i]);
	}
}


float calcul_pol(struct polynome * p1)
{
float r=0,x;
int i;

 printf("Saisir x");
 scanf("%f",&x);

 for(i=p1->degre;i>=0;i--){
    r=r+((p1->coeff[i])*pow(x,i));
	}

return r;
}

void aff_pol(struct polynome * p1, float re)
{
int i;

 for (i=p1->degre;i>=0;i--,p1->degre--){
 printf("%g ",p1->coeff[i]);
 if(i!=0){
 printf("X^%d",p1->degre);
 printf(" + ");
 }
 }

printf("= %f",re);
}

int main(void){
 float r;
 struct polynome p;
 printf("Saisir un polynome\n");
 saisie_pol(&p);
 r = calcul_pol(&p);
 aff_pol(&p, r);
 system("PAUSE");
 return 0;
}

Merci a toi c’est parfais!

J’aurais juste une ou deux question (oui je suis un noob en C^^),
A la ligne ou il y a le malloc, tu a ecrit [quote=""]
(float*)
[/quote]
, ca sert a quoi?
Ensuite, pourquoi avoir mis un pointeur au debut de chaque fonction?
Et enfin, a quoi sert deja le “&” avant le “p” a chaque appel de fonction ? (petit trou de memoire^^)

encore merci a toi !

rapidement et succinctement : les pointeurs permettent de passer les variables par adresse et non par valeur, avantage : réutilisabilité des variables et simplification du code.

non. avantage = ne pas copier les valeurs des objets “lourds” lors du passage des valeurs par fonction et surtout répercuter les changements sur l’objet à la fonction appelante.

Les pointeurs ne simplifient rien, ni ne permettent la réutilisabilité :slight_smile: quand même^^

Le & avant le p sert juste à dérérencer une valeur, ie: prendre l’adresse de cette valeur.

Okay merci a vous je pense avoir compris pour le pointeur et le & !
Manque plus que la presence du (float*) qui m’intrigue et ce sera parfais :slight_smile:

Edit: J’en ai egalement profité pour continuer le programme en l’améliorant, avec l’ajout d’un menu comme demandé pour le cours:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct polynome{
 int degre;
 float *coeff;
};

void saisie_pol(struct polynome * p1)
{
 int i;
    printf ("Entrez le degre du polynome: ");
    scanf ("%d",&p1->degre);

    p1->coeff=(float*)malloc((p1->degre+1)*sizeof(float));

    for(i=p1->degre;i>=0;i--){
        printf("Entrez le coefficient du terme de degre %d: ",i);
        scanf("%f",&p1->coeff[i]);
	}
}


float calcul_pol(struct polynome * p1)
{
 float r=0,x;
 int i;
    printf("Saisir x");
    scanf("%f",&x);

    for(i=p1->degre;i>=0;i--){
    r=r+((p1->coeff[i])*pow(x,i));
	}

 return r;
}

void aff_pol(struct polynome * p1, float re)
{
 int i;

    for (i=p1->degre;i>=0;i--,p1->degre--){
        printf("%g ",p1->coeff[i]);
            if(i!=0){
                printf("X^%d",p1->degre);
                printf(" + ");
            }
    }

    printf("= %f",re);
}

void menu()
{
    printf("\n*** Menu ***");
    printf("\n1:Afficher");
    printf("\n2:Saisir");
    printf("\n3:Charger");
    printf("\n4:Sauvegarder");
    printf("\n5:Evaluer");
    printf("\n6:Exporter");
    printf("\n7:Quitter");
}



int main(void){
 float r;
 int choix;
 struct polynome p;
    printf("*** Manipulation de polynomes ***");
    printf("\n*** N.******-C.********       ***");
    menu();
    do{
        printf("\nquel est votre choix : \n");
        scanf("%d",&choix);
        switch(choix){
            case 1: {aff_pol(&p,r);}break;
            case 2: {saisie_pol(&p);}break;
            case 3: {}break;
            case 4: {}break;
            case 5: {r=calcul_pol(&p);}break;
            case 6: {}break;
            case 7: {}break;
            default: printf("ce choix n'existe pas !\n");
        }
    } while (choix!=7);
 system("PAUSE");
 return 0;
}

Manque plus que les fonction sauvegarde et chargement avec fscanf et fprintf je crois, puis ce sera presque terminé je pense (enfin ca va il me reste 5h de cours pour faire ces deux fonctions^^)
Edité le 21/01/2009 à 11:30

Un malloc() retourne un void* (pointeur générique), la l-value (ici coeff) est un pointeur vers des float, il faut donc transtyper (caster) le pointeur générique vers le pointeur de floats.
Ca peut passer sans erreur ni warning selon les cflags de ton compilateur mais il faut (à mon avis) toujours garder l’habitude de transtyper avec un malloc (et en général d’ailleur).
Edité le 21/01/2009 à 14:04