erreur de compilation( cygwin) - C - Programmation
Marsh Posté le 04-02-2011 à 14:04:07
C'est un problème de pile corrompu.
Cela peut venir, par exemple :
- un tableau qui est déclaré avec une taille trop petite par rapport à ce que l'on veut y mettre,
- une chaîne de caractères qui n'est pas terminée par un caractère nul,
- un indice qui est négatif (toto[-1]),
- une mauvaise libération des ressources (par exemple un oubli d'un free; par exemple un free() en trop (if (toto != NULL) free(toto);, mais toto n'a pas été initialisé, et contient autre chose que NULL par hasard); par exemple, un mélange entre delete du C++ et free du C; etc).
Marsh Posté le 04-02-2011 à 14:13:40
Voici mon programme principal:
Code :
|
RQ: si maxEval = 100000 le programme s'exécute normalement.
Marsh Posté le 04-02-2011 à 14:37:48
unsigned maxEval = 1000000; |
Avec quelle valeur de maxEval est-ce que cela ne va plus ?
Par ailleurs, il serait plus lisible d'écrire unsigned int ou unsigned long int ou unsigned char.
Si c'est un projet pour DOS, il me semble que unsigned int est sur 16 bit donc que sa valeur maximale est 65535.
double *R; |
R est alloué avec malloc, mais n'est pas libéré.
D'ailleurs, il serait plus facile et plus performant de remplacer cette allocation, par une simple déclaration.
double R; |
Marsh Posté le 04-02-2011 à 14:46:35
Juste un point de détail:
Citation : Par ailleurs, il serait plus lisible d'écrire unsigned int ou unsigned long int ou unsigned char. |
En C, si ça ne tient pas dans un int, le compilateur doit automatiquement le mettre dans un long. Donc à priori, ça devrait tenir.
EDIT: C'était en K&R C, mais apparemment, l'ANSI C impose unsigned = unsigned int en ce cas.
Si le pb est avec la taille de maxEval, comme on ne sait pas comment la valeur est utilisée dans adapt_integrate(bivar_cdf, 0, dim, xmin, xmax, maxEval, 0, tol, &val, &err); on ne peut pas dire grand chose.
A+,
Marsh Posté le 04-02-2011 à 15:27:04
voici la fonction adapt-integrate:
Code :
|
Marsh Posté le 04-02-2011 à 15:32:39
C'est son proto, mais ça ne nous dit toujours pas ce qu'elle fait de maxEval
Par contre effectivement, quand tu passes ça en paramètre de fonction, le unsigned est probablement casté en unsigned int, et la ta valeur 100000 pourrait ne pas passer.
A+,
Marsh Posté le 04-02-2011 à 15:56:26
OK gilou, je vais essayer
voici le programme cubature.c
Code :
|
Marsh Posté le 04-02-2011 à 16:29:48
Bon au fait, ça plante pour quelle type de valeur.
Parce que comme dans le code on a du static heap heap_alloc(unsigned nalloc)
Peut être qu'à un moment la pile va bouffer trop de mémoire, et je vois pas trop de tests de plus au niveau de l'alloc pour verifier que tout s'est bien passé
A+,
Marsh Posté le 04-02-2011 à 16:52:43
En fait, comme j'ai mentionné je suis pas un connaisseur en informatique et en programmation. Déjà, les deux derniers codes (cubature.c et cubature.h) c'est pas mon oeuvre. j'ai trouvé c'est deux codes sur le net.
Commet je fais des tests au niveau de l'allocation ?
Marsh Posté le 04-02-2011 à 19:20:48
Heap_alloc fait en fait appel à heap_realloc qui fait appel à realloc:
Code :
|
Si realloc échoue, ça va renvoyer NULL, et ça, ça devrait être testé, ce qui n'est pas le cas ici.
A+,
Marsh Posté le 04-02-2011 à 11:09:20
Je suis un doctorant en finance et j’ai appris tout seul à programmer avec le langage C. Certes, je sais quelques notions dans la programmation mais je suis toujours débutant dans ce domaine. Je compile les programmes avec cygwin. De plus, j’utilise, lors de cette compilation, la librairie GSL (GNU scientific Librairy).
Bref, lors de l’exécution d’un programme (qui permet de calculer une intégration numérique et que j’ai nommé cdf_mdim), j’ai eu le message suivant (avec le débuggeur gdb) :
9 [main] cdf_Mdim 3816 _cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
1637 [main] cdf_Mdim 3816 open_stackdumpfile: Dumping stack trace to cdf_Mdim.exe.stackdump
521872 [main] cdf_Mdim 3816 _cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
578746 [main] cdf_Mdim 3816 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
Program received signal SIGSEGV, Segmentation fault.
0x61016525 in stack_info::walk () from /usr/bin/cygwin1.dll
Est que quelqu'un peut m’aider à résoudre ce problème (je peux vous envoyer mon code par mail dans ce cas). Est-ce que c’est un problème de mémoire de mon ordinateur (processeur centrino duo 1.73 ghz et une RAM de 2 Go) ?
Merci d’avance