Erreur de segmentation :/ - C++ - Programmation
Marsh Posté le 14-07-2003 à 17:30:39
Il renvoie un long et tu transformes ça en char * comme ça
Et tu es sûr de ton assignation ? Ça me paraît extrèmement douteux...
Marsh Posté le 14-07-2003 à 17:31:16
giz a écrit : |
C'est un long, ça ne se converti pas en char* comme ça.
Marsh Posté le 14-07-2003 à 17:53:21
kadreg a écrit : |
Ben si, la preuve !¡!
Marsh Posté le 14-07-2003 à 18:01:55
ben un chiffre peut bien tjs se caster en char* :-/ non ?
Marsh Posté le 14-07-2003 à 18:02:56
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
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.
Marsh Posté le 14-07-2003 à 18:06:39
antp a écrit : |
mais ma var 'm_version est un char* jsuis oblige de caster en char* ! jcomprends pas le pb :-/
Marsh Posté le 14-07-2003 à 18:07:33
Dis moi que tu nous fait une blague
Marsh Posté le 14-07-2003 à 18:10:51
kadreg a écrit : |
s/y compris/surtout/
exemples : gnome, emacs, le hurd, les compilateurs C etc.
Marsh Posté le 14-07-2003 à 21:02:41
giz 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
Marsh Posté le 14-07-2003 à 21:03:50
Harkonnen a écrit : |
Pas d'insulte s'il te plait ou je vais en référer aux modérateurs
Marsh Posté le 14-07-2003 à 21:18:30
kadreg a écrit : |
ça va, chuis tranquille, on peut plus TT un modo
Marsh Posté le 15-07-2003 à 11:10:37
Harkonnen a écrit : |
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 comment tu ferais ?
Marsh Posté le 15-07-2003 à 11:14:22
Citation : m_version = NULL; |
Mais pourquoi je doute fort que ca soit strcat qui plante ?
Marsh Posté le 15-07-2003 à 11:16:41
j'ai pas lu tout mais ... as tu alloue de la place pour m_version
et si tu faisais
Code :
|
?
Marsh Posté le 15-07-2003 à 11:17:05
giz a écrit : m_version = NULL; |
de mieux en mieux...
achète un bouquin, ça devient vraiment urgent là !
allez, je te libère de tes soucis :
Code :
|
Marsh Posté le 15-07-2003 à 11:17:23
giz a écrit : |
sûrement pas comme ça
plutôt un truc du genre:
Code :
|
(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)
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 ?)
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));
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:
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
Marsh Posté le 15-07-2003 à 11:53:51
tu le fais exprès ou quoi ?
pourquoi la solution du sprintf ne te plaît pas ?
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 !!!
Marsh Posté le 15-07-2003 à 12:30:21
et voila la version finale !
/* 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
PS : Harkonnen j'aime quand tu t'enerves
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));
Marsh Posté le 15-07-2003 à 12:38:56
giz a écrit : *(m_version + nb) = '\0'; |
absolument inutile, sprintf met un 0 à la fin
Marsh Posté le 15-07-2003 à 12:42:46
antp a écrit : |
et j'aimerais bien cprendre pkoi y'en a qui s'entete a utiliser cette notation cracra plutot que la bonne vieille notation tableau
Marsh Posté le 15-07-2003 à 12:43:59
ben je connaissais pas tres bien sprintf
Muchas Gracias
Marsh Posté le 15-07-2003 à 12:58:25
giz a écrit : ben je connaissais pas tres bien sprintf |
dans des cas comme ca, tu tapes man sprintf si t'es sous unix, et sinon tu fais pareil, mais dans google
Marsh Posté le 15-07-2003 à 14:09:09
giz a écrit : PS : Harkonnen j'aime quand tu t'enerves |
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 |
le man de printf il est impressionnant et imbitable pour les débutants.
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.
Marsh Posté le 15-07-2003 à 20:22:06
kadreg a écrit : |
Attention, tu as mis "printf" et "correcte" dans la meme phrase !
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...
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" |
Oue, HO ! c bon , n'en rajoute pas
et le pire c que je ne debute meme pas !
Marsh Posté le 16-07-2003 à 15:12:08
giz a écrit : |
encore pire...
Marsh Posté le 16-07-2003 à 15:43:15
Hummmmmmmm j'adore les gens qui jugent avant de chercher à connaitre...
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 ?)
Marsh Posté le 17-07-2003 à 14:17:08
BlackGoddess a écrit : mouais moi ja v l'habitude d'alouer dynamiquement |
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)
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