Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2432 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Segmentation fault <core dumped>

n°228975
peak
Posté le 16-10-2002 à 21:07:03  profilanswer
 

Reprise du message précédent :

Musaran a écrit a écrit :

Triple hélas!
En C++ standard, on ne peut initialiser les éléments de tableaux issus de new.
Le type doit donc disposer d'un constructeur par défaut.
Il faut leur affecter une valeur après.
 
Soyons patients, ça viendra.




 
Mais pourkoi c'est ke des warnings et pas des erreurs alors??

mood
Publicité
Posté le 16-10-2002 à 21:07:03  profilanswer
 

n°228981
Kristoph
Posté le 16-10-2002 à 21:14:20  profilanswer
 

C'est assez clair quand meme ces messages :
 

Code :
  1. $ g++-3.0.4 -Wall -ansi -pedantic -o testing test4.cc
  2. test4.cc:6: `main' must return `int'
  3. test4.cc:6: warning: return type for `main' changed to `int'
  4. test4.cc: In function `int main(...)':
  5. test4.cc:7: warning: ISO C++ forbids initialization of new expression with `='
  6. test4.cc:7: warning: new initializer lists extension is deprecated, please see
  7.    the documentation for details
  8. test4.cc:7: warning: ISO C++ forbids initialization in array new


 
Et il ne m'a pas genere "testing" donc c'est bien des erreurs.

n°228985
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 16-10-2002 à 21:19:15  profilanswer
 

pour le main tu peux le faire tout seul et poour l'init de ton tableau, c'est du travaille de porc, tu peux quand meme ecrire deux lignes et pas besoin d'un new...


---------------
du bon usage de rand [C] / [C++]
n°229048
tanguy
Posté le 16-10-2002 à 22:14:28  profilanswer
 

peak a écrit a écrit :

 

Code :
  1. void fct(double* p=NULL){}
  2. void main(){
  3. fct(new double[3]={1.0, 1.0, 1.0});
  4. }






ha je sens que tu as fait du Java :D
 
en C++ t'as pas de GC, donc les new sans delete ca le fait pas !
 
je rappelle au passage pour certain, qu'un new sans delete ca ne fait pas un segfault et encore moins un core dump mais une fuite memoire
 
ici il ne faut pas utiliser de new car une allocation dynamique ca prend pas mal de ressources et puis il faut se faire chier avec un delete derriere, alors des qu'on peut on evite
en Java y'a pas cette distinction puisque tout passe par des references, sauf pour les types de bases genre int
 
il faut utiliser une variable automatique
au passage on met un const, c'est plus mieux (tm)
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. void fct(const double *p = NULL) {
  4.         cout << p[0] << p[1] << p[2] << endl;
  5. }
  6. int main() {
  7.         double tmp[3] = {0.04, 1.04, 2.04};
  8.         fct(tmp);
  9. }


 
par contre, creer des variables temporaires vaut mieux eviter aussi parceque ca creer pas mal de surprises quelque fois
 
 
pour la precedente version :

Code :
  1. #include <iostream>
  2. using namespace std;
  3. void fct(double *p = NULL) {
  4.         cout << p[0] << p[1] << p[2] << endl;
  5. }
  6. int main() {
  7.         fct(new double[3] = {0.04, 1.04, 2.04});
  8. }


 
tanguy@niluge:~$ g++-3.0 -Wall -pedantic -ansi test.cpp
test.cpp: In function `int main()':
test.cpp:9: warning: ISO C++ forbids initialization of new expression with `='
test.cpp:9: warning: new initializer lists extension is deprecated, please see  
   the documentation for details
test.cpp:9: warning: ISO C++ forbids initialization in array new
 
tanguy@niluge:~$ ./a.out
0.041.042.04
 
tanguy@niluge:~$ gdb ./a.out
[...]
(gdb) run
Starting program: /home/tanguy/a.out  
0.041.042.04
 
Program exited normally.
(gdb) quit
 
 
donc ca marche pas trop mal, et meme avec gcc 2.95
 
 
Moralite toujours programmer en -Werror -pedantic -ansi ;)

n°229049
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 16-10-2002 à 22:15:51  profilanswer
 

surtout en -Wall est utiliser std::vector


---------------
du bon usage de rand [C] / [C++]
n°229052
Kristoph
Posté le 16-10-2002 à 22:18:30  profilanswer
 

Ca fait quoi -pedantic-error ?
 
Pour faire du C++, il faut autant que possible utiliser gcc 3.2 car les gcc 2 sont vraiment pas top sur la norme C++ ;)
 
Enfin, pour finir ce code la passe très mal en C++ car tu n'as pas de moyen facile de trouver la taille de ton tableau :
 

Code :
  1. void fct(const double *p = NULL) {
  2.        cout << p[0] << p[1] << p[2] << endl;
  3. }


 
Utilise un std::vector pour ca ce sera mieux.

n°229057
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 16-10-2002 à 22:23:19  profilanswer
 

surtout la valeur du paramètre par défaut, c'est vraiment fait expres pour un segfault!


---------------
du bon usage de rand [C] / [C++]
n°229063
Mr White
Nettoyage a sec
Posté le 16-10-2002 à 22:28:52  profilanswer
 

tanguy a écrit a écrit :

 
 
nan de la memoire non desallouee ne fait pas planter un programme, ca fait simplement une fuite memoire
pour eviter les fuites memoire on utilise pas un debuggeur mais un memory checker ou leak checker
 
un segfault peut etre causer par pleins de choses, mais en general c'est simplement par exemple :
int tab[12]
et ensuite on fait int i = tab[50]
pof segfault
 
donc pour comprendre c'est tres simple, tu prends gdb le debuggeur
tu le lances avec en parametre le nom de ton programme dans le meme repertoire (en compilant bien sur le programme avec l'option -g pour debug)
tu fais run et il va t'afficher la derniere instruction qui a fait plante le programme (si t'as de la chance)
ensuite tu fais up pour remonter dans la pile d'appels et voir tout ce qui c'est passe
 
si t'as pas de chance et qu'il n'y a pas de pile (t'inquiete ca sera pas ton cas), tu fou un break point la juste avant ou tu penses que tu as fait une erreur de programmation et puis des step et des next jusqu'au moment fatidique
 
bon moi j'utilise DDD sous unix, mais avec gdb sous windows ou dev-c++ c'est le meme principe meme si je peux pas donner la demarche exacte
 
edit :
j'oubliais, compile tes programmes avec :
-Wall -pedantic -ansi -g
ca t'afficheras beaucoup plus de warnings et donc de trouver des bugs potentiels plus facilement
et utiliser un memory checker aussi c'est une bonne idee, sous cygwin je sais pas
mais c'est linux y'en a des dizaines, le plus simple a utiliser c'est memprof, le plus puissant c'est valgrind



je ne pouvais pas dire mieux :jap:
 
DDD sous linux est vraiment bien sympa :)


---------------
[:palpatine]
n°229066
tanguy
Posté le 16-10-2002 à 22:30:00  profilanswer
 

Kristoph a écrit a écrit :

 

Code :
  1. void fct(const double *p = NULL) {
  2.        cout << p[0] << p[1] << p[2] << endl;
  3. }






c'etait juste pour montrer que ca marchait (oui le gdb suffisait mais bon)... et le NULL c'est pas moi
 
et pour gcc 3.2 desole mais dans la woody c'est 3.0.4 au mieux :/

n°229331
peak
Posté le 17-10-2002 à 11:52:54  profilanswer
 

bon ben je croit ke je vais me resigner même si je comprend pas ce ki me veux :heink:  (je trouvais ma technik plus logike)
...vais à chake fois le faire en deux fois...

Citation :

Code :
  1. #include <iostream>
  2. using namespace std;
  3. void fct(const double *p = NULL) {
  4.        cout << p[0] << p[1] << p[2] << endl;
  5. }
  6. int main() {
  7.        double tmp[3] = {0.04, 1.04, 2.04};
  8.        fct(tmp);
  9. }

 


 :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  
http://www.imchat.net/tooo.JPG
...et le pire c ke ça marche très bien sans -pedantic....
 :spookie:


Message édité par peak le 17-10-2002 à 12:12:17
mood
Publicité
Posté le 17-10-2002 à 11:52:54  profilanswer
 

n°229370
peak
Posté le 17-10-2002 à 12:37:18  profilanswer
 

Citation :

Moralite toujours programmer en -Werror -pedantic -ansi    


sorry, j'avais pas capté: y me prend direct beacoup moins la tête :D :D  
 
(thx)  

n°229888
gilou
Modérateur
Modosaurus Rex
Posté le 18-10-2002 à 05:20:28  profilanswer
 

kadreg a écrit a écrit :

 
 
Je connais pas beaucoup de programme encore vivant après avoir coredumpé




Tu devrais savoir que le coredump provoqué d'un programme correct permet de le relaoder dans l'etat avant core dump et d'en continuer l'execution.  
Tex utilisait cette technique car le load d'un core dump correctement initialisé etait plus rapide que de la reexecution de toute les initialisations.
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Impossible de lancer une commande systeme : segmentation faultComment recuperer la version d'un core intel et amd en VB
Mais ils sont où les CORE ???question en c: (random et erreur de segmentation).. aidez moi :-)
Exploitation du fichier coreformat core
[Assembleur Intel] Segmentation Fault, SIGSEGV ?? 
Plus de sujets relatifs à : Segmentation fault <core dumped>


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)