Pb de realloc et warning lors de la compilation - C - Programmation
Marsh Posté le 09-10-2005 à 00:39:02
merci de poster plus de code stp, c'est pas du tout parlant là
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;
}
}
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é
Marsh Posté le 09-10-2005 à 01:01:42
Citation : |
omfg, c'est quoi cette atrocité ?
edit: mais y'en a partout en plus
Marsh Posté le 09-10-2005 à 01:17:21
enfin le truc c'est que j'aimerais bien resoudre ces pb de realloc.....
Marsh Posté le 09-10-2005 à 09:48:12
alohaAH a écrit : struct POLYNOME |
Y a plus simple :
typedef struct polynome |
Citation : polynome newPolynome() |
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) |
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.
Marsh Posté le 09-10-2005 à 11:20:14
alohaAH a écrit : <...> |
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.
|
Marsh Posté le 10-10-2005 à 13:29:38
Elmoricq 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 ?
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...
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 :
|
mais son code de newPolynome en lui-même est juste non ?
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 !