SuperPigeon Posté(e) le 10 avril 2006 Partager Posté(e) le 10 avril 2006 Salut à tous ! ça fait vraiment un bail que j'avais pas posté sur INpact. Bon... bref... Je suis en IUT info en 1ère année, et le C++ est donc au programme. Seulement j'ai un soucis avec les chaines ("non non pitié arrêtez de me jeter des pierres oui oui j'ai honte aïe aïe aïe !") Mon soucis : je créé une Classe toute banale dans un .h #ifnedef KOALA_H//j'avais dit classe banale oui :D #define KOALA_H class Koala{ private: char * sonNom; int sonAge; static int nbr_de_koalas; public: Koala(char* unNom="Jojo",int unAge=18)//Jojo est le nom par défaut et 18 l'age par défaut { sonAge=unAge;//jusque là tout va bien sonNom=malloc(strlen(unNom)*sizeof(char)); strcpy(sonNom,unNom); } ~Koala() { delete(sonNom); } }; #endif Comme erreur j'ai droit à un magnifique : error C2440: '=' : cannot convert from 'void *' to 'char *' Conversion from 'void*' to pointer to non-'void' requires an explicit cast Voilà... toute les librairies sont incluses, je pense que ça doit être une bêtises toute bête de débutant (ou alors j'ai peut-être rien compris et c'est du gros n'importe quoi), mais merci de me filer un p'tit coup de main Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 10 avril 2006 Partager Posté(e) le 10 avril 2006 Je ne suis pas une bête en C++, je n'en ai même jamais fait. Koala(int unNom="Jojo" C'est normal que tu passe une chaîne de caractères à un int ? sonNom=malloc(strlen(unNom)*sizeof(char)); J'aurais mis sonNom = (char *) malloc (strlen (unNom) * sizeof (char)); En effet : MALLOC(3) Linux Programmer's Manual MALLOC(3)NAME calloc, malloc, free, realloc - Allocate and free dynamic memory SYNOPSIS #include <stdlib.h> void *malloc(size_t size); Ce qui colle bien à ton erreur (void * pour du char *) strcpy(sonNom,unNom); strcpy à prohiber.Plutôt utiliser strncpy, strlcpy si ce dernier est dispo (systèmes bsd) ou directement memcpy. Lien vers le commentaire Partager sur d’autres sites More sharing options...
SuperPigeon Posté(e) le 10 avril 2006 Auteur Partager Posté(e) le 10 avril 2006 Oui bon, pour le Koala(int unNom="Jojo" c'était une faute de frappe pour le (char*) avant le malloc, tu avais raison c'est bien ça (merki :) ) Maintenant... pourquoi faut-il prohiber strcpy() ? Et dans quelles librairies je trouve strncpy() ou strlcpy() (ou encore memcpy()) ? sinon pour mon destructeur ? c'est bon ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
LePhasme Posté(e) le 10 avril 2006 Partager Posté(e) le 10 avril 2006 Pas besoin de mettre les parenthèse pour le destructeur. Si tu es en C++ utilise les std::string ca te facilitera la vie. Pour utiliser strncpy tu dois simplement faire un #include <string>, ca permet d'éviter des buffer overflow en spécifiant le nombre maximal de caractère que tu peux copier dans la chaine. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 10 avril 2006 Partager Posté(e) le 10 avril 2006 BOF qui peut ammener ta machine à se faire rooter entre autres. strncpy c'est pas la panacée non plus si tu fout ton \n où il ne faut pas. C'est pour ça que je préfères strlcpy ou memcpy. Lien vers le commentaire Partager sur d’autres sites More sharing options...
SuperPigeon Posté(e) le 10 avril 2006 Auteur Partager Posté(e) le 10 avril 2006 Ok Ok ! Donc si j'ai bien compris, strncpy, strlcpy et memcpy (dans la librairie string lui aussi ?) fonctionnent comme strcpy avec quelques désavantage en moins ? (je sais que strcpy s'arrête dès qu'il trouve un espace... (le crétin!)) bon... hé bien je crois qu'il ne me reste plus qu'à appliquer tout ça :) Merci bien les INpactiens ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.