xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009
-
10 août 2005 à 12:37
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013
-
10 août 2005 à 22:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 10 août 2005 à 20:58
A chaque fois tu fais deux boucles la ou tu pourrais n'en faire qu'une seule:
une boucle sur i puis une avec strncat/strcpy
Par exemple GetFileDrive pourrait devenir:
int GetFileDrive(const char* FilePath, char *tFileDrive)
{
while(*FilePath !'\\') *tFileDrive++ *FilePath++;
*tFileDrive = 0;
return 0;
}
C'est peut être plus dificile a saisir pour un débutant il est vrai.
Le premier param devrait être de type const char* au lieu de char[MAX_PATH] car on doit pouvoir mettre une chaine la taille qu'on veut
cs_ledruid
Messages postés15Date d'inscriptionmardi 21 juin 2005StatutMembreDernière intervention27 avril 2006 10 août 2005 à 20:41
Je confirme, c'est suite à ma demande sur le forum que il y à eu la gentillesse de me donner un coup de main, et effectivement je suis sur un projet en c++ avec quelques contraintes ( mais je suis un vrai débutant .. lol).
Et effectivement le but n'est pas de le copier tel quel, mais plutot de m'en servir pour "apprendre".
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 10 août 2005 à 15:52
Ton code est destiné à Windows apparemment; sous VC++ on peut aussi utiliser _splitpath
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 10 août 2005 à 15:26
Les guillemets ? non je penses pas, ca compile ca en C++ ?
struct
{
int a;
int b;
} s { .b 5 };
Mais tu as raison, c ansi est à peu de chose prés (cast du void* par exemple) compatible avec C++.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 10 août 2005 à 15:19
D'ou les guillemets que j'ai mis en écrivant "marche" ;-)
Quote : "C n'est pas compatible avec C++"
T'aurais pas oublier des guillemets aussi ? lol
Mais bon comme tu le dis ca s'interface.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 10 août 2005 à 15:05
C'est pas grave je voulais dire, on peut se contenter de mettre le code en extern "C", le C s'interface tres bien avec le C++.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 10 août 2005 à 15:00
Tout ce qui "marche" en C "marche" en C++
Justement non, c'est pour ca toute ces questions, C n'est pas compatible avec C++. Enfin c'est grave.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 10 août 2005 à 14:50
Steve_Clamage> lol t'es l'inspecteur gadget ? Tout ce qui "marche" en C "marche" en C++. Pas besoin de ces directives de compilations. Le gars va tout simplement récuperer le code et je ne suis meme pas sure qu'il va le copier tel quel.
Cette source est plus a titre d'apprentissage que de réutilisation.
Faut que j'aille au poste pour plus de question ? ^_^
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 10 août 2005 à 14:45
Mais dans ce cas il faut absolument mettre la directive extern "C", et pourquoi donner une solution C à un probleme en C++ ?
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 10 août 2005 à 14:39
Steve_Clamage> Le gars bosse sur un projet C++. J'ai fait le code en C mais dans un .cpp car il ne va pas l'utiliser tel quel.
BruNews> Vala je viens de corriger le probleme de la fuite mémoire. J'ai monter le buffer dans les params de la fonctions.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 10 août 2005 à 14:28
Pourquoi tu compiles en C++ ? Tu peux tres bien compiler en C, c'est juste une histoire d'extension du fichier source avec la plupart des edi.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 10 août 2005 à 13:58
BruNews> Faut dire que je dors pas beaucoup ces temps ci (debout 5h, coucher 23h30)
Sinon pour les itérateurs je sais que j'aurais pu passer par les pointeurs en décellant le "Null-terminated string" mais le gars est un débutant. C'est plus dans l'optique de travailler sur des tableaux que sur des pointeurs.
Steve_Clamage> Pour le cast je suis obligé car je passe par un compilateur C++. Il n'accèpete pas de transtypé un (void *) en (char *).
Sinon pour l'entete ctype.h, elle peut etre ommise car déjà présente dans stdlib.h.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 10 août 2005 à 13:22
Il manque des const et un entete (ctype.h pour toupper), le cast de la valeur retour de malloc n'est pas nécéssaire.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 10 août 2005 à 12:57
Salut,
eh bien tu n'es pas en forme ?
Dans ta GetFileType(), il y a de la mémoire allouée par ta strtoupper(), je ne vois pas le free() correspondant. Comme quoi il ne faut jamais retourner de chaine allouée dans une func c'est source d'oubli de libération de mémoire à tout coup, faut passer buffer que la func remplira. De plus ça oblige à bosser avec le mode d'alloc de la func, on peut ne pas vouloir de la CRT.
En C on connait les pointeurs, pas besoin d'itérateurs comme dans GetFileName() et les autres, ça fait parcourit les chaines plusieurs fois. 1 seul compteur suffit pour controler la longueur qund tu écris afin d'éviter un overflow.
A revoir, bonne continuation.
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 10 août 2005 à 12:37
10 août 2005 à 22:43
10 août 2005 à 20:59
char* GetFileDrive(const char* FilePath, char *tFileDrive)
{
while(*FilePath !'\\') *tFileDrive++ *FilePath++;
*tFileDrive = 0;
return tFileDrive;
}
10 août 2005 à 20:58
une boucle sur i puis une avec strncat/strcpy
Par exemple GetFileDrive pourrait devenir:
int GetFileDrive(const char* FilePath, char *tFileDrive)
{
while(*FilePath !'\\') *tFileDrive++ *FilePath++;
*tFileDrive = 0;
return 0;
}
C'est peut être plus dificile a saisir pour un débutant il est vrai.
Le premier param devrait être de type const char* au lieu de char[MAX_PATH] car on doit pouvoir mettre une chaine la taille qu'on veut
10 août 2005 à 20:41
Et effectivement le but n'est pas de le copier tel quel, mais plutot de m'en servir pour "apprendre".
10 août 2005 à 15:52
10 août 2005 à 15:26
struct
{
int a;
int b;
} s { .b 5 };
Mais tu as raison, c ansi est à peu de chose prés (cast du void* par exemple) compatible avec C++.
10 août 2005 à 15:19
Quote : "C n'est pas compatible avec C++"
T'aurais pas oublier des guillemets aussi ? lol
Mais bon comme tu le dis ca s'interface.
10 août 2005 à 15:05
10 août 2005 à 15:00
Justement non, c'est pour ca toute ces questions, C n'est pas compatible avec C++. Enfin c'est grave.
10 août 2005 à 14:50
Cette source est plus a titre d'apprentissage que de réutilisation.
Faut que j'aille au poste pour plus de question ? ^_^
10 août 2005 à 14:45
10 août 2005 à 14:39
BruNews> Vala je viens de corriger le probleme de la fuite mémoire. J'ai monter le buffer dans les params de la fonctions.
10 août 2005 à 14:28
10 août 2005 à 13:58
Sinon pour les itérateurs je sais que j'aurais pu passer par les pointeurs en décellant le "Null-terminated string" mais le gars est un débutant. C'est plus dans l'optique de travailler sur des tableaux que sur des pointeurs.
Steve_Clamage> Pour le cast je suis obligé car je passe par un compilateur C++. Il n'accèpete pas de transtypé un (void *) en (char *).
Sinon pour l'entete ctype.h, elle peut etre ommise car déjà présente dans stdlib.h.
10 août 2005 à 13:22
10 août 2005 à 12:57
eh bien tu n'es pas en forme ?
Dans ta GetFileType(), il y a de la mémoire allouée par ta strtoupper(), je ne vois pas le free() correspondant. Comme quoi il ne faut jamais retourner de chaine allouée dans une func c'est source d'oubli de libération de mémoire à tout coup, faut passer buffer que la func remplira. De plus ça oblige à bosser avec le mode d'alloc de la func, on peut ne pas vouloir de la CRT.
En C on connait les pointeurs, pas besoin d'itérateurs comme dans GetFileName() et les autres, ça fait parcourit les chaines plusieurs fois. 1 seul compteur suffit pour controler la longueur qund tu écris afin d'éviter un overflow.
A revoir, bonne continuation.
10 août 2005 à 12:37