Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1435 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Pb de realloc et warning lors de la compilation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb de realloc et warning lors de la compilation

n°1218567
alohaAH
Posté le 09-10-2005 à 00:24:25  profilanswer
 

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 !

mood
Publicité
Posté le 09-10-2005 à 00:24:25  profilanswer
 

n°1218571
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 09-10-2005 à 00:39:02  profilanswer
 

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


---------------
J'ai un string dans l'array (Paris Hilton)
n°1218574
alohaAH
Posté le 09-10-2005 à 00:58:22  profilanswer
 

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;            
    }
}

n°1218575
alohaAH
Posté le 09-10-2005 à 00:59:46  profilanswer
 

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é

n°1218576
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 09-10-2005 à 01:01:42  profilanswer
 

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)
n°1218585
alohaAH
Posté le 09-10-2005 à 01:16:23  profilanswer
 

ba quoi ??? on initialise avec un polynome nul

n°1218587
alohaAH
Posté le 09-10-2005 à 01:16:49  profilanswer
 

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

n°1218588
alohaAH
Posté le 09-10-2005 à 01:17:21  profilanswer
 

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

n°1218612
Elmoricq
Modérateur
Posté le 09-10-2005 à 09:48:12  profilanswer
 

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
n°1218633
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-10-2005 à 11:20:14  profilanswer
 


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/
mood
Publicité
Posté le 09-10-2005 à 11:20:14  profilanswer
 

n°1219456
blackgodde​ss
vive le troll !
Posté le 10-10-2005 à 13:29:38  profilanswer
 

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 )-
n°1219469
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-10-2005 à 13:36:28  profilanswer
 

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/
n°1220995
blackgodde​ss
vive le troll !
Posté le 12-10-2005 à 10:06:11  profilanswer
 

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 )-

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Pb de realloc et warning lors de la compilation

 

Sujets relatifs
probleme compilation utilisation de sdlerreur de compilation en c++(Devcpp):no such file or directory
question sur realloc ..[VB] Compilation et version de la MSJETxx.DLL
warning a l apel de file_get_contentsProbleme de compilation C
1ere compilation en javaquestion sur la compilation
Warning avec ftp_loginProbleme de compilation
Plus de sujets relatifs à : Pb de realloc et warning lors de la compilation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR