DevCpp capricieux ? bug étrange... [Résolu]

Signaler
Messages postés
9
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
2 juin 2007
-
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
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 !)

Bref,

26 réponses

Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1
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;

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
Messages postés
317
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
19 octobre 2007

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.

Une autruche ne se cuit pas aux petits lardons
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

ptest est un pointeur qui ne pointe sur rien, normal que ca plante.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
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++
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1
Biensur ne pas oublié le free à la fin.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
Messages postés
317
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
19 octobre 2007

Ah oui, tiens, j'avais même pas regarder le code, tant j'étais fixée sur le compil ( lol )

Une autruche ne se cuit pas aux petits lardons
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Je code sous dev-cpp et tous les bugs qui me sont apparus étaient tjs causés par une erreur de code, jamais à cause du compilo :)
Messages postés
317
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
19 octobre 2007

Oui, sans doute que j'ai trop de aprioris sur le devC++ :p

Une autruche ne se cuit pas aux petits lardons
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010

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 !

BruNews, en temps qu'admin, ca te déprime pas ??

Bon week end
...
Messages postés
9
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
2 juin 2007

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
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

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

donc le + important est la façon de coder !

fin du HS
Messages postés
317
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
19 octobre 2007

LooL oui ok c'est vrai que l'important c'est de savoir coder.
Mais j'aime bien code::block voilà.
Je voulais le dire :p

Une autruche ne se cuit pas aux petits lardons
Messages postés
23
Date d'inscription
samedi 2 juin 2007
Statut
Membre
Dernière intervention
11 mai 2009

avant de croire savoir utiliser les pointeurs utilise tes objets normalement.


test mTest;

mText.valeur = 10;


et puis un typedef sur structure se declare bien mieux sous cette forme plus lisible :


typedef struct

{

    int valeur;

} test;
Messages postés
23
Date d'inscription
samedi 2 juin 2007
Statut
Membre
Dernière intervention
11 mai 2009

et malloc c'est deprecated c'est du C. Depuis le c++ on a un bel operateur qui s'appelle new
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
malloc() n'a rien de deprecated, c'est du C qui n'a rien de deprecated non plus.

Le code de nollyflip est d'ailleurs du C, new() n'a donc rien à y faire.

ciao...
BruNews, MVP VC++
Messages postés
23
Date d'inscription
samedi 2 juin 2007
Statut
Membre
Dernière intervention
11 mai 2009

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.
Messages postés
23
Date d'inscription
samedi 2 juin 2007
Statut
Membre
Dernière intervention
11 mai 2009

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
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010

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 !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
4 octets supplémentaires ???
Faudra que je pense à tester cela.

J'avais pourtant regardé l'asm généré (il y a qlq temps deja), new finissait par un appel malloc qui lui meme finit chez HeapAlloc().

ciao...
BruNews, MVP VC++
Messages postés
23
Date d'inscription
samedi 2 juin 2007
Statut
Membre
Dernière intervention
11 mai 2009

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 !
1 2