DECOUPAGE CHEMIN FICHIER (FORUM)

xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009 - 10 août 2005 à 12:37
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/33171-decoupage-chemin-fichier-forum

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
10 août 2005 à 22:43
Vecchio56> Vi vi en effet.... C'est la remarque que BruNews avait fait plus haut (l'histoire des boucles)
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
10 août 2005 à 20:59
Une déclaration de ce type pourrait aussi être utile si on a besoin de faire des concaténations par la suite:

char* GetFileDrive(const char* FilePath, char *tFileDrive)
{
while(*FilePath !'\\') *tFileDrive++ *FilePath++;
*tFileDrive = 0;
return tFileDrive;
}
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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és 15 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 27 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és 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
10 août 2005 à 15:52
Ton code est destiné à Windows apparemment; sous VC++ on peut aussi utiliser _splitpath
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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és 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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és 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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és 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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és 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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és 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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és 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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és 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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és 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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és 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
10 août 2005 à 12:37
Rapide.... ;-)
Rejoignez-nous