plantage à l'execution [C] - Programmation
Marsh Posté le 24-04-2001 à 23:15:46
bah c'est dur de repondre comme ca ... mais j' suis pret à parier que ca vient d'un pointeur
non initialisation
violation de partage memoire ...
bref, un bug imputable au programmeur
c'est un mode console / API / MFC .. ??
montre nous ton code.
Marsh Posté le 24-04-2001 à 23:16:58
>Compil et link passe nickel, pas même 1 warning
T'as essaye avec les warning en niveau 4??
A+,
Marsh Posté le 24-04-2001 à 23:27:57
C'est en console et en niveau 3
mes pointeurs sont bien initialisés :
OBJ * objet1;
objet1=NULL;
Pour ce qui est de mon code j'ai 2 sources :
1 -> fonctions avec son header
1 -> main
vous les balancer m'est difficile car bien que ce soit un projet des + modestes y'en + de 100 lignes
Marsh Posté le 24-04-2001 à 23:41:04
Bon en niveau 4 ça passe
Je vous détaille un peu le code
Voici mon type :
typedef struct {
int noDossard;
char numTel[10];
float vitesse;
char nom[25];
} OBJ;
OBJ * objet1;
objet1=NULL;
objet1->noDossard=1; !! PLANTAGE !!
Je crois qui doit manquer un malloc quelque part ? NON ?
Marsh Posté le 24-04-2001 à 23:54:12
OK
Je suis vert, ça fait un moment que je galère
En fait c'est un code que j'ai récupéré de TurboC avec lequel il ne plantait pas malgré ma grosse bourde ?
Faisait il l'allocation à ma place ?
Bizarre
Enfin bref c'est solutionné
Merci
Marsh Posté le 25-04-2001 à 00:22:05
heu moi j'm'y serais pris autrement.
bon admettons.
typedef struct {
int noDossard;
char numTel[10];
float vitesse;
char nom[25];
} OBJ;
OBJ ma_structure_et_non_ma_classe;
OBJ* ptr_struct = &ma_structure_et_non_ma_classe;
là tu as initialisé une variable et initialisé un pointeur qui "pointe" sur cette dite variable.
A ce moment et seulement à ce moment, tu as des tableaux qui sont "crées" dans ta mémoire.
avec ta méthode .. tu "pointais" vers une structure qui n'etait pas 'initialisée' donc ses zones memoire n'existait pas encore.
enfin j'coirs vu l'heure et sur un mal entendu j'peux me tromper.
Marsh Posté le 25-04-2001 à 00:24:22
pour revenir à ta question
NON, le compilo ne fait pas d'allocation mémoire à ta place. (ce serait trop beau .. mais ce ne serait pas rigoureux)
tu as du faire un ...
OBJ* ptr = (OBJ*)malloc(sizeof(OBJ));
c'est ca ?
Marsh Posté le 25-04-2001 à 00:35:17
Non mon code sous TurboC est texto celui la :
typedef struct {
int noDossard;
char numTel[10];
float vitesse;
char nom[25];
} OBJ;
OBJ * objet1;
objet1=NULL;
objet1->noDossard=1
Et ça marche, je viens juste de le tester de nouveau
Marsh Posté le 25-04-2001 à 09:49:04
bon ben tu n'as plus de probleme alors !
il faut tout de meme faire attention à ces allocations de memoire.
en fait, ici ton typedef remplace tous tes OBJ qui se trouve dans ton code par struct{...}
hors suivant les compilo, je sais pas s'ils acceptent tous de creer directement un pointeur desss. deux cas existe .. soit le compilo comprend OBJ comme une variable et donc il es possible de faire un pointeur dessus, soit il comprend OBJ comme une declaration et là normalement ca devrait pas fonctionner.
en fait, à ce niveau là et avec ce code tu es tout de meme tributaire du bon vouloir du compilo ... moi je te conseille d'ecrire du code un peu plus explicite .. dans tous les cas tu y gagnes, tu comprends mieux ton code et tu sais mieux comment le compilo va reagir..
Marsh Posté le 25-04-2001 à 10:06:04
Pschitt a écrit a écrit : Non mon code sous TurboC est texto celui la : typedef struct { int noDossard; char numTel[10]; float vitesse; char nom[25]; } OBJ; OBJ * objet1; objet1=NULL; objet1->noDossard=1 Et ça marche, je viens juste de le tester de nouveau |
Ca marche peut etre, mais pour une mauvaise raison, car ce code est errone: objet1 n'a pas ete alloue, ert donc tu ne peux pas en utiliser ses membres.
A+,
Marsh Posté le 25-04-2001 à 10:32:01
Turbo C++ c'est du Dos, il ne voit pas toutes les erreurs sur la memoire...
VC++ en mode console c'est du Windows et la y + de protections.
Certains programmes marchent avec des bugs enormes...
Marsh Posté le 25-04-2001 à 10:37:49
la viper a écrit a écrit : bon ben tu n'as plus de probleme alors ! il faut tout de meme faire attention à ces allocations de memoire. en fait, ici ton typedef remplace tous tes OBJ qui se trouve dans ton code par struct{...} hors suivant les compilo, je sais pas s'ils acceptent tous de creer directement un pointeur desss. deux cas existe .. soit le compilo comprend OBJ comme une variable et donc il es possible de faire un pointeur dessus, soit il comprend OBJ comme une declaration et là normalement ca devrait pas fonctionner. en fait, à ce niveau là et avec ce code tu es tout de meme tributaire du bon vouloir du compilo ... moi je te conseille d'ecrire du code un peu plus explicite .. dans tous les cas tu y gagnes, tu comprends mieux ton code et tu sais mieux comment le compilo va reagir.. |
? ? ?
typedef defini un type. donc OBJ est un type
ca ne concerne pas le preprocesseur il n'y a pas de remplacement c'est un synonyme qui est genere.
en C on fait en general
typedef struct Sobj {
...
} obj;
et obj = struct Sobj
evidement en C++ il suffit de faire struct OBJ pour definir OBJ...
Marsh Posté le 25-04-2001 à 12:52:58
[citation]
Certains programmes marchent avec des bugs enormes...
[/citation]
Mon prof il appelait ca les programmes qui "marchent par erreur"
.
Evidemment au bout d'un moment il finit par planter et le programmeur debutant il comprend pas: "ben ca marchait avant.."
A+
Legreg
Marsh Posté le 24-04-2001 à 22:51:48
Mon projet(sous VC++6) me génère un exe qui plante à chaque fois que j'utilise un type défini dans un fichier en tête lui même inclu dans mon main correctement.
Compil et link passe nickel, pas même 1 warning
N'y comprends rien
Alors si une âme charitable aurait un tuyau ?
Merci