IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Conversion fonction Delphi en C++ [Langage/Algorithme]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut Conversion fonction Delphi en C++
    Bonjour à tous,

    J'ai un petit problème pour traduire une fonction delphi en c++.
    Mon code modifié me génère une boucle sans fin.

    Code Delphi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    // Procédure pour compter les fichiers
    Function CompteFichiers(Chemin:String):Integer;
    Var S:TSearchRec;
    Begin
     
      Result:=0;
      // Recherche de la première entrée du répertoire
      If FindFirst(Chemin+'*.*',faAnyFile,S)=0
      Then Begin
        Repeat
          // Il faut absolument dans le cas d'une procédure récursive ignorer
          // les . et .. qui sont toujours placés en début de répertoire
          // Sinon la procédure va boucler sur elle-même.
          If (S.Name<>'.')And(s.Name<>'..')
          Then Begin
            If (S.Attr And faDirectory)<>0
              // Dans le cas d'un sous-repertoire on appelle la même procédure
              Then Result:=Result+CompteFichiers(Chemin+S.FindData.cFileName)
              // Sinon on compte simplement le fichier
              Else Inc(Result);
          End;
        // Recherche du suivant
        Until FindNext(S)<>0;
        FindClose(S);
      End;
    End;
    Code C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    int TForm1::Compteur(AnsiString chemin){
    TSearchRec S;
    int result = 0;
    	if (FindFirst(chemin+"*.*",faAnyFile,S)==0){
    		do{
    			if((S.Name != ".")&&(S.Name != ".."))
    			{
    				if ((S.Attr && faDirectory) != 0)
    				{
    					result = result+Compteur(chemin+S.FindData.cFileName);
    				}else {
    					result++;
    				}
    			}
    		}while(FindNext(S)!=0);
    		FindClose(S);
    		return result;
    	}
    }

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Bonjour,
    dans la FAQ, tu as une méthode qui te permet d'obtenir la liste des fichiers d'un répertoire de manière récursive, il ne te reste plus qu'as, soit modifier la méthode pour qu'elle ne liste pas mais qu'elle compte le nombre de fichier, ou alors utiliser tels quel la méthode et simplement appeler la méthode size de la liste après avoir appeler la méthode pour savoir combien d'élément se trouve dans la liste et donc combien de fichier se trouve dans le répertoire

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Est-ce que ton problème ne viendrais pas d'une confusion entre

    "repeat... until.." => "Boucle ... jusqu'à ce que ... "

    et

    "do... while..." => "Boucle... tant que..."

    Donc:

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Pourquoi traduire ?
    Créer un nouveau fichier pascal à ton projet C++ Builder, cela génère le .h pour l'utiliser ensuite en C++ !
    Pourquoi s'embêter quand l'on peut faire simple !

    sinon ceci est faux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((S.Attr && faDirectory) != 0)
    ceci est nettement mieux, c'est un masque binaire (oui en Delphi, le compilateur se débrouille pour comprendre que and est binaire ou logique en fonction du type de variable\valeur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((S.Attr & faDirectory) != 0)
    Sinon pour la boucle, do ... while (condition) en C++, dure aussi longtemps que l'<expression> fournit une valeur différente de zéro, donc inutile de faire "!= 0", connaitre son langage est important !
    Et dans ce cas, c'est faux !

    Pour la boucle repeat ... until condition en Delphi, tant que l'expression renvoie False cela continue (False = 0), c'est quand expression renvoie True, que la boucle s'arrête !

    C'est l'inverse ! et c'est écrit dans l'aide du RAD Studio !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    do
    {
      ...
    }
    while ( ! FindNext(S));
    // while (FindNext(S) == ERROR_SUCCESS);
    EDIT : Mince, le temps que je tape ma réponse et trouve les extraits de l'aide Totoche m'a grillé, n'ayant encore jamais utilisé de do ... while , j'ai préfére vérifier mes dires !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut
    Merci pour vos réponses.
    Suivant vos différents conseils, j'ai modifié mon code cependant je n'obtiens pas la valeur souhaité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    int TForm1::Compteur(AnsiString chemin){
    TSearchRec S;
    int result = 0;
    	if (FindFirst(chemin+"*.*",faAnyFile,S)==0){
    		do{
    			if((S.Name != ".")&&(S.Name != ".."))
    			{
    				if ((S.Attr & faDirectory) != 0)
    				{
    					result = result+Compteur(chemin+S.FindData.cFileName);
    				}else {
    					result++;
    				}
    			}
    		}while ( ! FindNext(S));
    		FindClose(S);
    		return result;
    	}
    }

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    A noter une erreur dans la FAQ Comment lister les fichiers d'un répertoire de manière récursive ?

    FindClose ne doit être appelé que si FindFirst renvoie 0 !
    Cette erreur vient de l'utilisation d'un while{} et non d'un if do{}while
    Dans ta fonction Sixpounder, c'est tout à fait correct !
    Sauf le Return qui devrait la dernière instruction en dehors du if, tu as surement un avertissement de fonction sans retour d'ailleurs !

    tient, poussons la syntaxe du c++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = result+Compteur(chemin+S.FindData.cFileName);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result += Compteur(chemin+S.FindData.cFileName);
    en Delphi, j'écris ceci parfois au lieu du r = r + i;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Inc(result, Compteur(chemin+S.FindData.cFileName));
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut
    Corrigé par contre ma fonction me renvoie toujours 0 :s.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de traduction d'une fonction Delphi en BCB
    Par blondelle dans le forum C++Builder
    Réponses: 7
    Dernier message: 13/03/2007, 23h03
  2. conversion c# delphi win32
    Par zobicket dans le forum Delphi
    Réponses: 6
    Dernier message: 25/01/2007, 20h33
  3. Conflit entre une fonction Delphi et une API ?
    Par [ZiP] dans le forum Delphi
    Réponses: 2
    Dernier message: 23/01/2007, 10h14
  4. Conversion C++ -> Delphi
    Par tane dans le forum Delphi
    Réponses: 3
    Dernier message: 27/07/2006, 08h54
  5. Conversion VB -> Delphi
    Par khlh dans le forum Langage
    Réponses: 2
    Dernier message: 30/11/2005, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo