Pb de realloc et warning lors de la compilation

Pb de realloc et warning lors de la compilation - C - Programmation

Marsh Posté le 09-10-2005 à 00:24:25    

Bonsoir tt le monde je suis sur un projet de polynome en ce moment et g kk soucis qui m'empeche de progresser; voila ce qui se passe lors de la compilation :
gcc -c -g -ansi  polynome.c -o polynome.o
polynome.c: In function ‘setCoefficient’:
polynome.c:54: attention : ignoring return value of ‘realloc’, declared with attribute warn_unused_result
polynome.c: In function ‘nettoyerPolynome’:
polynome.c:90: attention : ignoring return value of ‘realloc’, declared with attribute warn_unused_result
polynome.c: In function ‘ProduitPolynomes’:
polynome.c:235: attention : ignoring return value of ‘realloc’, declared with attribute warn_unused_result
gcc -lm -g -ansi  principale.c polynome.o -o  principale
principale.c: In function ‘main’:
principale.c:19: attention : incompatible implicit declaration of built-in function ‘printf’
 
mon code realloc :  
realloc(produit.coefficient, (produit.degre+1)*sizeof(double));
produit.coefficient est un tableau de double
 
 
de plus quand je cree 2 polynomes et ke j eles passe en argument dans une fonction, 1 sur 2 a été modifié dans al fct alors qu'aucunes ligne de code "modifiante" n'ont été ajouté
 
Merci !

Reply

Marsh Posté le 09-10-2005 à 00:24:25   

Reply

Marsh Posté le 09-10-2005 à 00:39:02    

merci de poster plus de code stp, c'est pas du tout parlant là


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 09-10-2005 à 00:58:22    

struct POLYNOME
{
  int degre;
  double* coefficient;
};
typedef struct POLYNOME polynome;
..................
polynome newPolynome()
{
  polynome p;
  p.degre=0;
  p.coefficient=(double*)malloc(sizeof(double));
  p.coefficient[0]=0;
  return p;
}
......................
void setCoefficient(polynome* p,int degre1,double coeff)
{
  int i=0;
 
  if (degre1<=((*p).degre))
    {
      ((*p).coefficient[degre1])=coeff;
    }
 
  if (degre1>((*p).degre))
    {
      (*p).degre=degre1;  
      realloc((*p).coefficient , ((*p).degre+1)*sizeof(double));
 
      for(i=((*p).degre+1);i<degre1;i++)
        {      
   (*p).coefficient[i]=0;  
 }
     
      (*p).coefficient[degre1]=coeff;            
    }
}

Reply

Marsh Posté le 09-10-2005 à 00:59:46    

donc la, je vous ai mis la definition de la structure polynome, le constructeur d'un polynome(oups, on fait pas du java lol), et la fonction permettant de mettre un coef au poly en fct du degré

Reply

Marsh Posté le 09-10-2005 à 01:01:42    

Citation :


polynome newPolynome()
{
  polynome p;
  p.degre=0;
  p.coefficient=(double*)malloc(sizeof(double));
  p.coefficient[0]=0;
  return p;
}


omfg, c'est quoi cette atrocité ? [:mlc]
 
edit: mais y'en a partout en plus [:wam]


Message édité par Harkonnen le 09-10-2005 à 01:02:38

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 09-10-2005 à 01:16:23    

ba quoi ??? on initialise avec un polynome nul

Reply

Marsh Posté le 09-10-2005 à 01:16:49    

c le prof qui m'a dit de mettre ca..... :-)

Reply

Marsh Posté le 09-10-2005 à 01:17:21    

enfin le truc c'est que j'aimerais bien resoudre ces pb de realloc.....

Reply

Marsh Posté le 09-10-2005 à 09:48:12    

alohaAH a écrit :

struct POLYNOME
{
  int degre;
  double* coefficient;
};
typedef struct POLYNOME polynome;


 
Y a plus simple :
 

typedef struct polynome  
{
   int degre;
   double *coefficient;
} polynome;


 
 

Citation :

polynome newPolynome()
{
  polynome p;
  p.degre=0;
  p.coefficient=(double*)malloc(sizeof(double));
  p.coefficient[0]=0;
  return p;
}


 
My god.
Ta variable "p" n'existe que dans la fonction newPolynome(), donc ce que tu renvoies c'est n'importe quoi.
Faut l'allouer avec un malloc() aussi.
 
Par ailleurs, utiliser malloc() == tester s'il n'a pas renvoyé NULL, histoire de ne pas poursuivre si l'allocation mémoire a échoué.
 
Et le cast sur le malloc() est inutile, tu peux l'enlever.
 
 

Citation :

void setCoefficient(polynome* p,int degre1,double coeff)
{
  int i=0;
 
  if (degre1<=((*p).degre))
    {
      ((*p).coefficient[degre1])=coeff;
    }
 
  if (degre1>((*p).degre))
    {
      (*p).degre=degre1;  
      realloc((*p).coefficient , ((*p).degre+1)*sizeof(double));
 
      for(i=((*p).degre+1);i<degre1;i++)
        {      
   (*p).coefficient[i]=0;  
 }
     
      (*p).coefficient[degre1]=coeff;            
    }
}


 
 
realloc() ne s'utilise pas ainsi.  
http://mapage.noos.fr/emdel/notes.htm#realloc
 
 
Et j'espère que tu as prévu les free() qui vont avec toutes tes allocations mémoire.

Message cité 1 fois
Message édité par Elmoricq le 09-10-2005 à 09:48:54
Reply

Marsh Posté le 09-10-2005 à 11:20:14    


Pas mal d'erreurs et de mauvaises pratiques...
 
http://mapage.noos.fr/emdel/notes.htm#malloc
http://mapage.noos.fr/emdel/notes.htm#realloc
 
Ceci à l'air de fonctionner (pas validé). Pose des questions si tu ne comprends pas.


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
struct POLYNOME
{
    int degre;
    double* coefficient;
};
typedef struct POLYNOME polynome;
 
void deletePolynome(polynome *p)
{
    if (p != NULL)
    {
        free (p->coefficient),p->coefficient=NULL;
         
        assert(p->coefficient==NULL);
    }
     
    free(p),p=NULL;
     
    assert(p==NULL);
}
 
polynome *newPolynome(void)
{
    polynome *p = malloc(sizeof *p);
     
    if (p != NULL)
    {
        p->degre=0;
        p->coefficient=malloc(sizeof *p->coefficient * 1);
         
        if (p->coefficient!=NULL)
        {
            p->coefficient[0]=0;
        }
        else
        {
            deletePolynome(p),p=NULL;
        }
    }
    return p;
}
 
int setCoefficient(polynome* p,int degre1,double coeff)
{
    int err=0;
    int i=0;
     
    if (degre1<=p->degre)
    {
        p->coefficient[degre1]=coeff;
    }
    else
    {
        p->degre=degre1;
         
        void *tmp = realloc(p->coefficient , (p->degre + 1) * sizeof*p->coefficient);
         
        if (tmp != NULL)
        {
            p->coefficient=tmp;
            for(i=p->degre+1;i<degre1;i++)
            {
                p->coefficient[i]=0;
            }
             
            p->coefficient[degre1]=coeff;
        }
        else
        {
            deletePolynome(p);
            err=1;
        }
    }
    return err;
}
 
int main (void)
{
    polynome *p = newPolynome();
     
    if (p!=NULL)
    {
     
        int err = setCoefficient(p,2,2);
        if (!err)
        {
            err = setCoefficient(p,1,3);
        }
        deletePolynome(p),p=NULL;
    }
     
    assert(p==NULL);
    return 0;
}


Message édité par Emmanuel Delahaye le 09-10-2005 à 11:22:40

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-10-2005 à 11:20:14   

Reply

Marsh Posté le 10-10-2005 à 13:29:38    

Elmoricq a écrit :

Citation :

polynome newPolynome()
{
  polynome p;
  p.degre=0;
  p.coefficient=(double*)malloc(sizeof(double));
  p.coefficient[0]=0;
  return p;
}


 
My god.
Ta variable "p" n'existe que dans la fonction newPolynome(), donc ce que tu renvoies c'est n'importe quoi.
Faut l'allouer avec un malloc() aussi.


 
Me semblait que la variable etait copiée. En tout cas sur le compilo que j'ai sous la main (vc++7.1) ca passe sans pb. Que dit la norme à ce sujet ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 10-10-2005 à 13:36:28    

blackgoddess a écrit :

Me semblait que la variable etait copiée. En tout cas sur le compilo que j'ai sous la main (vc++7.1) ca passe sans pb. Que dit la norme à ce sujet ?


Elle est copiée. Mais ensuite, tu en fais quoi ? Si c'est une variable locale, sa durée de vie risque d'être insuffisante... de plus, ce n'est pas efficace de faire une copie, et ce n'est pas homogène (moitié définie localement, moitié allouée... que faut-il libérer ?)...
 
Si tu passes son adresse, à une fonction, ça marchera peut être... C'est à voir au cas par cas. Mais si tu change de thread, ça risque de foirer... Autant de questions qui ne se posent pas avec des blocs alloués... Bref, c'est pas de la très bonne conception...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 12-10-2005 à 10:06:11    

je suis tout a faire d'accord quand a l'homogénéité, et a l'inefficacité d'une copie.
 
pour le changement de thread, l'erreur serait lors de la création du thread, de passer en paramètre une variable locale en pointeur :

Code :
  1. polynome p = newPolynome();
  2. ...pthread_create(..... &p ...);


 
mais son code de newPolynome en lui-même est juste non ?


Message édité par blackgoddess le 12-10-2005 à 10:07:03

---------------
-( BlackGoddess )-
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed