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

  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 089
    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 089
    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 089
    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 089
    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.

  8. #8
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    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 089
    Par d�faut
    Tu as essay� * au lieu de *.*, tu semble vouloir des dossier et non des fichiers !
    Tu as choisi la fonction Delphi qui est fausse � la base ! Pas de Chance !
    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

  9. #9
    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
    Voila ma fonction corrig� ( du moins je l'esp�re ) :

    chemin = C:\\Documents and Settings\\Administrateur\\Bureau\\Source\\

    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){ // testé avec * et *.*
    		do{
    			if((S.Name != ".")&&(S.Name != ".."))
    			{
    				if ((S.Attr & faDirectory) != 0)
    				{
    					result += Compteur(chemin+S.FindData.cFileName);
    				}else {
    					result++;
    				}
    			}
    		}while (!FindNext(S));
    		FindClose(S);
    	}
    return result;
    }
    Elle me retourne le nombre de fichiers pr�sent dans mon dossier mais ne compte pas mes sous r�pertoire.

    Tu as choisi la fonction Delphi qui est fausse � la base ! Pas de Chance !
    On pourra rajouter la fonction dans la FAQ C++ de cette fa�on ^^.

  10. #10
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    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 089
    Par d�faut
    remplace
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Compteur(chemin+S.FindData.cFileName);
    par
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Compteur(chemin+IncludeTrailingPathDelimiter(S.FindData.cFileName));
    Il faut ajouter le \ pour ta fonction qui utilise un chemin et non un dossier
    sinon la recherche suivant serait
    C:\\Documents and Settings\\Administrateur\\Bureau\\Source\\Trouve*
    au lieu de
    C:\\Documents and Settings\\Administrateur\\Bureau\\Source\\Trouve\\*

    Bon, j'envoie la facture o� ? Avec le mode Debug, tu aurais du comprendre tous ces probl�mes sans aide !
    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

  11. #11
    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 de ton aide ShaiLeTroll, m�me en cherchant seul durant 2 semaines je n'aurais pas r�ussi � r�soudre mon probl�me ( encore trop peut d'exp�rience ).

    Voici le code :

    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
     
    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 += Compteur(chemin+IncludeTrailingPathDelimiter(S.FindData.cFileName)); 
    				}else {
    					result++;
    				}
    			}
    		}while (!FindNext(S));
    		FindClose(S);
    	}
    return result;
    }

  12. #12
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    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 089
    Par d�faut
    C'est en forgeant que l'on devient Forgeron !

    Il assez dr�le de voir une question similaire en Delphi et C++ le m�me jour !

    En tout cas, je suis bien content de t'avoir aider !
    J'ai fait une fonction similaire pour calculer la taille d'un dossier (et ses sous-dossiers) avant de les copier (on parle de plusieurs Go de GED Imagerie M�dicale) !
    Prudence oblige lorsque l'on connait l'�tat des serveurs des clients !
    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

  13. #13
    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
    C'est en forgeant que l'on devient Forgeron !

+ 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