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

  FORUM HardWare.fr
  Programmation
  C++

  Erreur de segmentation :/

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur de segmentation :/

n°457357
Giz
Posté le 14-07-2003 à 17:29:13  profilanswer
 

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

mood
Publicité
Posté le 14-07-2003 à 17:29:13  profilanswer
 

n°457359
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-07-2003 à 17:30:39  profilanswer
 

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
n°457362
kadreg
profil: Utilisateur
Posté le 14-07-2003 à 17:31:16  profilanswer
 

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 !
n°457379
nraynaud
lol
Posté le 14-07-2003 à 17:53:21  profilanswer
 

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
n°457390
Giz
Posté le 14-07-2003 à 18:01:55  profilanswer
 

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


Message édité par Giz le 14-07-2003 à 18:02:11
n°457393
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-07-2003 à 18:02:56  profilanswer
 

[: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
n°457394
kadreg
profil: Utilisateur
Posté le 14-07-2003 à 18:03:10  profilanswer
 

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 !
n°457404
Giz
Posté le 14-07-2003 à 18:06:39  profilanswer
 

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 :-/

n°457406
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-07-2003 à 18:07:33  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°457415
nraynaud
lol
Posté le 14-07-2003 à 18:10:51  profilanswer
 

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
mood
Publicité
Posté le 14-07-2003 à 18:10:51  profilanswer
 

n°457505
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-07-2003 à 21:02:41  profilanswer
 

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)
n°457506
kadreg
profil: Utilisateur
Posté le 14-07-2003 à 21:03:50  profilanswer
 

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 !
n°457521
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-07-2003 à 21:18:30  profilanswer
 

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)
n°458083
Giz
Posté le 15-07-2003 à 11:10:37  profilanswer
 

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 ?

n°458179
chrisbk
-
Posté le 15-07-2003 à 11:14:22  profilanswer
 

 

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]

n°458183
polo021
Posté le 15-07-2003 à 11:16:41  profilanswer
 

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)] = '.'

?

n°458184
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 15-07-2003 à 11:17:05  profilanswer
 

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)
n°458185
antp
Super Administrateur
Champion des excuses bidons
Posté le 15-07-2003 à 11:17:23  profilanswer
 

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
n°458193
Giz
Posté le 15-07-2003 à 11:32:22  profilanswer
 

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 ?)

n°458196
antp
Super Administrateur
Champion des excuses bidons
Posté le 15-07-2003 à 11:34:55  profilanswer
 

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
n°458197
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 15-07-2003 à 11:34:57  profilanswer
 

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)
n°458207
Giz
Posté le 15-07-2003 à 11:49:07  profilanswer
 

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
n°458212
antp
Super Administrateur
Champion des excuses bidons
Posté le 15-07-2003 à 11:53:51  profilanswer
 

[: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
n°458224
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 15-07-2003 à 12:04:50  profilanswer
 

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)
n°458241
Giz
Posté le 15-07-2003 à 12:30:21  profilanswer
 

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]

n°458245
antp
Super Administrateur
Champion des excuses bidons
Posté le 15-07-2003 à 12:37:46  profilanswer
 

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
n°458247
antp
Super Administrateur
Champion des excuses bidons
Posté le 15-07-2003 à 12:38:56  profilanswer
 

giz a écrit :

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


 
absolument inutile, sprintf met un 0 à la fin


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°458253
chrisbk
-
Posté le 15-07-2003 à 12:42:46  profilanswer
 

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

n°458255
Giz
Posté le 15-07-2003 à 12:43:59  profilanswer
 

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


Message édité par Giz le 15-07-2003 à 12:46:54
n°458271
lorill
Posté le 15-07-2003 à 12:58:25  profilanswer
 

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]

n°458340
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 15-07-2003 à 14:09:09  profilanswer
 

giz a écrit :

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


[:shooter]


---------------
J'ai un string dans l'array (Paris Hilton)
n°458469
nraynaud
lol
Posté le 15-07-2003 à 16:39:12  profilanswer
 

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
n°458716
kadreg
profil: Utilisateur
Posté le 15-07-2003 à 20:07:55  profilanswer
 

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 !
n°458725
nraynaud
lol
Posté le 15-07-2003 à 20:22:06  profilanswer
 

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
n°458732
deathsharp
Posté le 15-07-2003 à 20:28:17  profilanswer
 

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.
n°459208
Giz
Posté le 16-07-2003 à 11:45:53  profilanswer
 

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
n°459418
deathsharp
Posté le 16-07-2003 à 15:12:08  profilanswer
 

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.
n°459461
skeye
Posté le 16-07-2003 à 15:43:15  profilanswer
 

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

n°459815
blackgodde​ss
vive le troll !
Posté le 17-07-2003 à 00:49:11  profilanswer
 

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 )-
n°460288
Giz
Posté le 17-07-2003 à 14:17:08  profilanswer
 

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)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Erreur de segmentation :/

 

Sujets relatifs
ou est mon erreurcode SQL dans une requete ....[pu d'erreur inside !!!]
[ WML ] Erreur dans le code ?[PHP] erreur Fatal error: open(O_RDWR) failed for session file...
erreur visula c++[XSL + XSQL] erreur ORA-01008: not all variables bound
erreur de segmentationErreur de Segmentation
Erreur de segmentation suite au passage à SuSE 8.1question en c: (random et erreur de segmentation).. aidez moi :-)
Plus de sujets relatifs à : Erreur de segmentation :/


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR