nollyflip
Messages postés9Date d'inscriptionlundi 10 octobre 2005StatutMembreDernière intervention 2 juin 2007
-
2 juin 2007 à 01:45
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
3 juin 2007 à 00:43
Bonjour,
J'ai un comportement étrange (et pour le moins énervant) de dev cpp, je me dis que ce bug est peut-être connu et résolu. J'ai la 4.9.9.2 (dernière en vie)
Je vais faire simple :
Voici mon code, et voici les symptomes :
1 - Je déclare la structure test *ptest; et je metptest->valeur=10;, qui pointe dans la structure. Ca compile mais plante à l'exécution.(ca n'arrive pas au system(pause)).
2 - Si ensuite j'enlève ptest->valeur=10; et que je ne conserve que test *ptest; même réaction, plante.
3 - Si ensuite encore, après avoir enlevé les deux, je compile, ca marche jusqu'au system(pause).
4 - Je me remet dans la même config que 2, ca marche. Si je repasse ensuite à la 1, ca replante...
#include <stdio.h>
#include <stdlib.h>
struct _test
{
int valeur;
};
typedef struct _test test;
int main(int argc, char *argv[])
{
test *ptest;
ptest->valeur=10;
printf("Valeur : %d\n",ptest->valeur);
system("PAUSE");
return 0;
}
En aucun cas la compil ne plante. Le code me parait parfaitement juste.
Autre symptomes étranges :
Je suis actuellement sur une appli GTK temps réel (450 lignes), je fonctionne beaucoup avec des pointeurs sur des structures. Je déclare ces pointeurs en local à main ou en global selon que j'ai besoin de récupérer les adresses dans des threads ou pas.
Bref ca fonctionne parfaitement bien, jusqu'a ce que j'ai créé (rajouté !) une nouvelle structure (identique aux autres !) en global pour passer des paramètres, et que j'y affecte une valeur dans main.
Ce coup ci, une autre blague :
compil OK, mais ne lance rien. Il me créee un fichier projet1.3 au lieu d'un projet1.3.exe, et si je renomme le projet1.3 en projet1.3.exe, ca marche (les valeurs dans les structures sont bien appliquées, ca plante pas ni rien).
J'ai bien essayé entre chaque compile de virer tous les fichiers sauf le *.dev et le *.c (vaut mieux !)
deck_bsd
Messages postés1242Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 2 juin 2007 à 10:07
Yop,
test *ptest;
ptest->valeur=10;
ici ptest ne pointe sur rien. Tu doit allouer la mémoire nécessaire à ta structure et faire pointé ptest sur celle-ci. Exemple :
if((ptest (test*)malloc(sizeof(test))) NULL)return 1;
The_Guardian
Messages postés317Date d'inscriptionvendredi 25 mai 2007StatutMembreDernière intervention19 octobre 20071 2 juin 2007 à 06:51
Le DevC++ étant devenu quasi obsoléte, sans mise a jour, tu devrais penser à changer de compilateur, et de prendre code::block qui est vraiment extra, c'est mon avis perso.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 2 juin 2007 à 10:05
aardman > je ferai un de ces jours le compte par semaine sur les questions de pointeurs fantomes.
nollyflip > Le compilateur c'est important mais l'étude du C dans un bon bouquin est indispensable. Si on peut y aller par tatonnement en interprété, c'est hors de question en C.
ciao...
BruNews, MVP VC++
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 2 juin 2007 à 12:56
Ne pas oublier que DevC++ est un IDE qui utilise par défaut GCC (minGW).
Donc parler du compilo de DevC++, c'est parler de GCC et prendre en défaut GCC n'est pas évident, surtout en compilation C et si on veut profiter du C99 car Visual Studio ne supporte pas et ne supportera surement jamais le C99 !
Sinon BruNews a raison, DevC++ est obsolète et a connu son heure de gloire par sa gratuité... Masi depuis de Tonton Bill a sortie VS en version Express gratuite, sous Windows, autant utiliser VS Express... Surtout que les compilateurs VC7 (VS2003) et VC8 (VS2005) sont maintenant beaucoup plus respectueux des normes (pour le C++ du moins) et sont ceux qui , sous Windows, fourniront le meilleur code machine (sauf peut être encore pour les templates qui ont tout de même été entierement revisités...).
Donc un peu d'humilité !! Avant que dire que ca marche par et que c'est la faute aux autres ou aux outils, vaut mieux examiner son code car dans 100% des cas c'est la faute au code... surtout si on manipule des pointeurs en C sans savoir ce quoi il s'agit...
Car déclarer un pointeur sur une structure sans initialisation et à la ligne suivante accèder à des membres de la structure référencée par le pointeur, c'est d'une part suicidaire mais cela dénote que l'on rien compris aux pointeurs et que c'est pas gagné et qu'il ya du taf !
nollyflip
Messages postés9Date d'inscriptionlundi 10 octobre 2005StatutMembreDernière intervention 2 juin 2007 2 juin 2007 à 13:47
Qui peut se vanter d'avoir compris rapidement les pointeurs ?
En tout cas j'y crois pas que j'ai oublié mon g_malloc je devais être fatigué hier soir, car j'avais bien fait l'allocation mémoire pour toutes mes autres structures (dans mon prog gtk) avant de pointer dessus.
Ca marche bien en rajoutant ptest=malloc(sizeof(test)); et à la fin free(ptest);
Je suis d'accord à dire qu'il faut regarder son code en premier, je suis même le premier à le dire ! Seulement je comprenais vraiment pas..Codez tête reposée
mogwai93
Messages postés362Date d'inscriptionmardi 31 décembre 2002StatutMembreDernière intervention 4 novembre 2023 2 juin 2007 à 21:21
petit HS
The Guardian : Le DevC++ étant devenu quasi obsoléte, sans mise a jour, tu devrais
penser à changer de compilateur, et de prendre code::block qui est
vraiment extra, c'est mon avis perso.
Depuis quand code:block n'a pas été mis à jour ??? ...... (octobre 2005 si je me base au site.....)
il ne faut pas confondre IDE et compilateur !!
devc++ est suffisant pour un debutant qui souhaite commencer
sans avoir une usine à gaz avec des options dans tous les coins
après s'il souhaite modifier + d'options, il pourra changer d'IDE et/ou de compilo
d'ailleurs regarde ce que fait gagah1 avec Devc++,
et pourtant personne ne lui fait de reproche sur son IDE
alextm
Messages postés23Date d'inscriptionsamedi 2 juin 2007StatutMembreDernière intervention11 mai 2009 2 juin 2007 à 22:25
new n'est pas une fonction mais un opérateur donc pas de ( ).
malloc c'est de la programmation "papy" ! lol . rien contre malloc mais
compile avec VS2005 taura un deprecated et puis new est bien plus
simple dans son utilisation : il determine seul la taille a allouer
pour l'objet et ajoute quelques notions de securité !
De plus un malloc() ne suffit plus sous vista 64 bits ultimate
(seulement) par exemple tu auras une exception du système
d'exploitation car le système d'exploitation a besoin de 4 octets de
plus par objet pour y stocke l'uid de l'utilisateur qui demande
l'allocation de l'objet.
alextm
Messages postés23Date d'inscriptionsamedi 2 juin 2007StatutMembreDernière intervention11 mai 2009 2 juin 2007 à 22:27
pardon je corrige mon précédent message, ce n'est pas a l'allocation
que ça crotte sous vista ultimate 64 bits mais à la libération de
mémoire , au free() donc ! car ce dernier ne libére pas les 4 octets
supplémentaires rajoutés par l'OS
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 2 juin 2007 à 22:35
bon Alextm, on se retrouve donc...
malloc c'est du C. donc quand on code en C, on n'a pas de de new mais malloc. Comme C++ est un surensemble de C, ca marche aussi même si on devrait faire un new qui est la voie naturelle du c++... voici ce que veut dire le compilo par deprecated !
Maintenant, il n'y a pas que le C++ sur terre. Le code de départ de ce fil était du C (inclusion de header de la lib standard C)... Donc faut pas embêter le monde avec tes 3 connaissances de programmation...
Je te le répête : humilité ! et tourne 49 fois ta langue avant de parler !
alextm
Messages postés23Date d'inscriptionsamedi 2 juin 2007StatutMembreDernière intervention11 mai 2009 2 juin 2007 à 23:27
Oui relativement bizard et uniquement sous Vista Ultimate en 64 bits.
Je me suis rendu contre de cela car au sein de l'entreprise dans
laquelle je développe, notre logiciel ne fonctionne pas sous cette
version de Windows car tous les objets font 4 octets de plus donc à la
fermeture de l'application, lors de la destruction des objets ==>
plantage !