Erreur de segmentation :/

Erreur de segmentation :/ - C++ - Programmation

Marsh Posté le 14-07-2003 à 17:29:13    

m_version = new char[20];
 
 
/**************************************************************************/
//card information
 
void CVcdio::GetCardInfo()
{
 /* serial number */
 m_serialnumber = EDRE_Query (0, BRDSERIALNO, 0);
 /* boardname */
 EDRE_StrBoardName (m_serialnumber,m_name);
 /* driver version */
 m_version = (char *) EDRE_Query (m_serialnumber, DRVMAJOR, 0);
 strcat (m_version, "." );
 
 
 
Voici mon code ci dessus, pkoi ca crash a la ligne en gras :??: la 1ere ligne du code (tout en haut) est ds le constructeur.
 
la fonction EDRE_Query (m_serialnumber, DRVMAJOR, 0); renvoie un long

Reply

Marsh Posté le 14-07-2003 à 17:29:13   

Reply

Marsh Posté le 14-07-2003 à 17:30:39    

Il renvoie un long et tu transformes ça en char * comme ça :heink:
Et tu es sûr de ton assignation ? Ça me paraît extrèmement douteux...


Message édité par antp le 14-07-2003 à 17:31:34

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-07-2003 à 17:31:16    

giz a écrit :


la fonction EDRE_Query (m_serialnumber, DRVMAJOR, 0); renvoie un long


 
 :ouch:  
 
 
C'est un long, ça ne se converti pas en char* comme ça.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 14-07-2003 à 17:53:21    

kadreg a écrit :


C'est un long, ça ne se converti pas en char* comme ça.

Ben si, la preuve !¡! [:nraynaud]


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-07-2003 à 18:01:55    

ben un chiffre peut bien tjs se caster en char* :-/ non ?


Message édité par Giz le 14-07-2003 à 18:02:11
Reply

Marsh Posté le 14-07-2003 à 18:02:56    

[:fear]
 
ouais tu castes 32 en char et t'auras un espace
mais tu castes 32 en char * et tu vas pointer vers l'adresse 0x00000020 de la RAM :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-07-2003 à 18:03:10    

giz a écrit :

ben un chiffre peut bien tjs se caster en char* :-/ non ?


 
En C, tu peux tout faire, y compris des trucs crétins.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 14-07-2003 à 18:06:39    

antp a écrit :

[:fear]
 
ouais tu castes 32 en char et t'auras un espace
mais tu castes 32 en char * et tu vas pointer vers l'adresse 0x00000020 de la RAM :D


 
mais ma var 'm_version est un char* jsuis oblige de caster en char* ! jcomprends pas le pb :-/

Reply

Marsh Posté le 14-07-2003 à 18:07:33    

Dis moi que tu nous fait une blague [:totoz]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-07-2003 à 18:10:51    

kadreg a écrit :


En C, tu peux tout faire, y compris des trucs crétins.

s/y compris/surtout/
 
exemples : gnome, emacs, le hurd, les compilateurs C etc.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-07-2003 à 18:10:51   

Reply

Marsh Posté le 14-07-2003 à 21:02:41    

giz a écrit :


 
mais ma var 'm_version est un char* jsuis oblige de caster en char* ! jcomprends pas le pb :-/


le problème est que tu confonds le cast et la conversion, triple buse !!
c'est pas parce que tu vas caster un int en char* que tu vas récupérer la chaine de caractères équivalente !
comme t'as l'air d'utiliser les MFC, regarde donc du coté de la classe CString au lieu d'utiliser un char* !  
sinon, si tu tiens absolument à mélanger C et C++, regarde donc du coté de la fonction itoa(), qui convertit un integer en string ! tu devras inclure <stdlib.h> pour l'utiliser !
 
et achète un book sur le C++ au passage :pfff:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 14-07-2003 à 21:03:50    

Harkonnen a écrit :


le problème est que tu confonds le cast et la conversion, triple buse !!


 
Pas d'insulte s'il te plait ou je vais en référer aux modérateurs :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 14-07-2003 à 21:18:30    

kadreg a écrit :


 
Pas d'insulte s'il te plait ou je vais en référer aux modérateurs :o

ça va, chuis tranquille, on peut plus TT un modo [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-07-2003 à 11:10:37    

Harkonnen a écrit :


le problème est que tu confonds le cast et la conversion, triple buse !!
c'est pas parce que tu vas caster un int en char* que tu vas récupérer la chaine de caractères équivalente !
comme t'as l'air d'utiliser les MFC, regarde donc du coté de la classe CString au lieu d'utiliser un char* !  
sinon, si tu tiens absolument à mélanger C et C++, regarde donc du coté de la fonction itoa(), qui convertit un integer en string ! tu devras inclure <stdlib.h> pour l'utiliser !
 
et achète un book sur le C++ au passage :pfff:


1 - je n'utilise pas de MFC, jve une simple appli dos !
j'ai essaie :
 
m_version = NULL;
*m_version = (char) EDRE_Query (m_serialnumber, DRVMAJOR, 0);
strcat (m_version, "." );
 
et ca plante tjs au strcat !, toi qui est si fort :D comment tu ferais ?

Reply

Marsh Posté le 15-07-2003 à 11:14:22    

 

Citation :

m_version = NULL;
*m_version = (char) EDRE_Query (m_serialnumber, DRVMAJOR, 0);


 
Mais pourquoi je doute fort que ca soit strcat qui plante ? [:meganne]

Reply

Marsh Posté le 15-07-2003 à 11:16:41    

j'ai pas lu tout mais ... as tu alloue de la place pour m_version :heink:  
 
et si tu faisais

Code :
  1. m_version[strlen (m_version)] = '.'

?

Reply

Marsh Posté le 15-07-2003 à 11:17:05    

giz a écrit :

m_version = NULL;
*m_version = (char) EDRE_Query (m_serialnumber, DRVMAJOR, 0);
strcat (m_version, "." );


de mieux en mieux... :pfff:
achète un bouquin, ça devient vraiment urgent là !
 
allez, je te libère de tes soucis :

Code :
  1. #include <stdlib.h>
  2. (...)
  3. char buffer[20]; // buffer qui contiendra le serial transformé en chaine
  4. itoa(m_serialnumber,buffer,10);


Message édité par Harkonnen le 15-07-2003 à 11:17:55

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-07-2003 à 11:17:23    

giz a écrit :


et ca plante tjs au strcat !, toi qui est si fort :D comment tu ferais ?


 
sûrement pas comme ça :D
 
plutôt un truc du genre:
 

Code :
  1. char m_version[12];
  2. sprintf(m_version, "%d.", EDRE_Query(m_serialnumber, DRVMAJOR, 0));


(et pas besoin d'ajouter le point après-coup)
 
ou avec snprintf c'est encore mieux (mais je sais plus à quel endroit on donne la longueur max)


Message édité par antp le 15-07-2003 à 11:18:33

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 15-07-2003 à 11:32:22    

mouais moi ja v l'habitude d'alouer dynamiquement :/, elle est ou mon erreur ds mes 2 exemple (encore le 1er ok, je converti un long en adresse, mais le 2eme ?)

Reply

Marsh Posté le 15-07-2003 à 11:34:55    

le 2è tu utilises un pointeur null, et à cette adresse nulle (boum) tu convertis un long en un octet (perte de précision) au lieu de le convertir en chaîne
 
 
  char *m_version;
  m_version = new char[12];
  sprintf(m_version, "%d.", EDRE_Query(m_serialnumber, DRVMAJOR, 0));


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 15-07-2003 à 11:34:57    

giz a écrit :

mouais moi ja v l'habitude d'alouer dynamiquement :/, elle est ou mon erreur ds mes 2 exemple (encore le 1er ok, je converti un long en adresse, mais le 2eme ?)


dans la 2eme, tu écris tout simplement à l'adresse mémoire 0 :
 
m_version = NULL;
*m_version = (...)
 
edit: [:benou_grilled]


Message édité par Harkonnen le 15-07-2003 à 11:35:33

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-07-2003 à 11:49:07    

ouai non, en faite j'ai vire le NULL mais je pense que mon strcat plantait a cause de l'absence du caractere de fin de chaine ds m_version :/
 
un truc du genre :  
*m_version = (char) EDRE_Query (m_serialnumber, DRVMAJOR, 0);
*(m_version + strlen ((char *) EDRE_Query (m_serialnumber, DRVMAJOR, 0))) = '/0';
 
mais ca plante a la 2eme...en fait c le meme pb, mon strlen n'a pas le carac de fin  [:ke-c]


Message édité par Giz le 15-07-2003 à 11:52:33
Reply

Marsh Posté le 15-07-2003 à 11:53:51    

[:sygus] tu le fais exprès ou quoi ?
 
pourquoi la solution du sprintf ne te plaît pas ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 15-07-2003 à 12:04:50    

ON TE DIT QUE TU ECRIS A UNE ADRESSE NULLE ET QUE C'EST CA QUI FAIT PLANTER !!!!
 
TU UTILISES LE SPRINTF OU LE ITOA ET CA MARCHERA TRES BIEN !!!


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-07-2003 à 12:30:21    

et voila la version finale !  :sol:  
 
/* driver version */
 nb = sprintf(m_version, "%lu", EDRE_Query(m_serialnumber, DRVMAJOR, 0));
 *(m_version + nb) = '\0';
 strcat(m_version, "." );
 nb += sprintf(m_version + nb + 1, "%lu", EDRE_Query(m_serialnumber, DRVMINOR, 0));
 *(m_version + nb + 1) = '\0';
 strcat(m_version, "." );
 sprintf(m_version + nb + 2, "%lu", EDRE_Query(m_serialnumber, DRVBUILD, 0));
 
Merci tout le monde  :hello:  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
PS : Harkonnen j'aime quand tu t'enerves  :love:   [:schumacher]

Reply

Marsh Posté le 15-07-2003 à 12:37:46    

La même chose en 1 ligne :
 
 sprintf(m_version, "%lu.%lu.%lu", EDRE_Query(m_serialnumber, DRVMAJOR, 0), EDRE_Query(m_serialnumber, DRVMINOR, 0), EDRE_Query(m_serialnumber, DRVBUILD, 0));
 
:D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 15-07-2003 à 12:38:56    

giz a écrit :

*(m_version + nb) = '\0';


 
absolument inutile, sprintf met un 0 à la fin


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 15-07-2003 à 12:42:46    

antp a écrit :


 
absolument inutile, sprintf met un 0 à la fin


 
et j'aimerais bien cprendre pkoi y'en a qui s'entete a utiliser cette notation cracra plutot que la bonne vieille notation tableau

Reply

Marsh Posté le 15-07-2003 à 12:43:59    

ben je connaissais pas tres bien sprintf  [:spamafote]
Muchas Gracias  :jap:


Message édité par Giz le 15-07-2003 à 12:46:54
Reply

Marsh Posté le 15-07-2003 à 12:58:25    

giz a écrit :

ben je connaissais pas tres bien sprintf  [:spamafote]
Muchas Gracias  :jap:

dans des cas comme ca, tu tapes man sprintf si t'es sous unix, et sinon tu fais pareil, mais dans google  [:sinclaire]

Reply

Marsh Posté le 15-07-2003 à 14:09:09    

giz a écrit :

PS : Harkonnen j'aime quand tu t'enerves  :love:   [:schumacher]  


[:shooter]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-07-2003 à 16:39:12    

lorill a écrit :

dans des cas comme ca, tu tapes man sprintf si t'es sous unix, et sinon tu fais pareil, mais dans google  [:sinclaire]  

le man de printf il est impressionnant et imbitable pour les débutants.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 15-07-2003 à 20:07:55    

nraynaud a écrit :

le man de printf il est impressionnant et imbitable pour les débutants.


 
Honnêtement, c'est pas parmi les pires, il y a même des exemples d'utilisation correcte.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 15-07-2003 à 20:22:06    

kadreg a écrit :


 
Honnêtement, c'est pas parmi les pires, il y a même des exemples d'utilisation correcte.  

Attention, tu as mis "printf" et "correcte" dans la meme phrase !


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 15-07-2003 à 20:28:17    

giz je suis sur, ta allumer ton pc, ta fais une image avec paint et tu te dit : "jsuis trop l33t pour ca jve passer direct a la prog"
 
je veux bien que tu debutes, mais il y a differente facon de debuter:
il y a celui qui va y aller pas a pas, normalement et celui qui va lire la page d'introduction d'un livre de C++ et qui va directement essayer d'ecrire son propre quake 3...
 


---------------
What butter and whiskey won't cure, there is no cure for.
Reply

Marsh Posté le 16-07-2003 à 11:45:53    

deathsharp a écrit :

giz je suis sur, ta allumer ton pc, ta fais une image avec paint et tu te dit : "jsuis trop l33t pour ca jve passer direct a la prog"
 
je veux bien que tu debutes, mais il y a differente facon de debuter:
il y a celui qui va y aller pas a pas, normalement et celui qui va lire la page d'introduction d'un livre de C++ et qui va directement essayer d'ecrire son propre quake 3...
 
 


 
Oue, HO ! c bon , n'en rajoute pas  :lol:
et le pire c que je ne debute meme pas !  [:grinking]  


Message édité par Giz le 16-07-2003 à 11:56:03
Reply

Marsh Posté le 16-07-2003 à 15:12:08    

giz a écrit :


Oue, HO ! c bon , n'en rajoute pas  :lol:
et le pire c que je ne debute meme pas !  [:grinking]  


encore pire...


---------------
What butter and whiskey won't cure, there is no cure for.
Reply

Marsh Posté le 16-07-2003 à 15:43:15    

Hummmmmmmm j'adore les gens qui jugent avant de chercher à connaitre... :sarcastic:

Reply

Marsh Posté le 17-07-2003 à 00:49:11    

mouais moi ja v l'habitude d'alouer dynamiquement  
m_version = new char[20];  
 
euh ... je comprends pas l'interet ?
(surtout si tu alloue dans le constructeur et que tu compte désallouer dans le destructeur ?)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 17-07-2003 à 14:17:08    

BlackGoddess a écrit :

mouais moi ja v l'habitude d'alouer dynamiquement  
m_version = new char[20];  
 
euh ... je comprends pas l'interet ?
(surtout si tu alloue dans le constructeur et que tu compte désallouer dans le destructeur ?)


 
En fait l'utilite d'allouer dynamiquement c seulement si ton objet aura besoin d'etre modifier par une autre fonction (par exemple modifier un pointeur sur un pointeur. car modifier juste une variable c possible avec l'operateur '&' sans allouer dynamiquement). Je pense que l'allocation statique est aussi plus rapide que l'allocation dynamique (appel de new et delete)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed