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++ Discussion :

concatenation de char*


Sujet :

C++

  1. #1
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut concatenation de char*
    salut tout le monde

    Etant plus php, le C++ est un peu loin pour moi, je dois generer une liste de tous les mots possibles avec une serie de caractere et les comparer avec un mot -> si pareil, j'affiche, un peu selon les modeles de forces brutes et j'ai des soucis, ca fait 2 jours que j'essaie de concatener, mais rien à faire, erreur windows. Je met le code tel qu'il est la, mais j'ai essayé tout ce que ma memoire se souvenait des pinteurs, string...;
    Merci a celui qui pourra me debloquer (j'utilise DevC++, mode console)

    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
    28
    29
    30
    31
    int main (int argc, char *argv[])
    {
      int i, j, k;
      char **alpha;
      *alpha[0] = "a";*alpha[1] = "b";*alpha[2] = "c";*alpha[3] = "d";*alpha[4] = "e";*alpha[5] = "f";*alpha[6] = "g";
      *alpha[7] = "h";*alpha[8] = "i";*alpha[9] = "j";*alpha[10] = "k";*alpha[11] = "l";*alpha[12] = "m";*alpha[13] = "n";
      *alpha[14] = "o";*alpha[15] = "p";*alpha[16] = "q";*alpha[17] = "r";*alpha[18] = "s";*alpha[19] = "t";*alpha[20] = "u";
      *alpha[21] = "v";*alpha[22] = "w";*alpha[23] = "x";*alpha[24] = "y";*alpha[25] = "z";*alpha[26] = "0";
     
      char *ref;
      char *meuh;
     
      if (argc > 1)
        for (i = 1; i < argc; i++)
          if (argv[i][0] == '-')
          {
             ref = argv[i] + 1;
             for (j=0;j<26;j++)
                 //for (k=0;k<26;k++)
                 {
                     //cout <<ref <<endl;
     
                     meuh = strcat(alpha[j] , alpha[j]);
                     //cout << meuh <<endl;
                     if (strcmp(ref,meuh) == 0)
                        cout <<  meuh <<endl;
                 }
          }
      system ("pause");
      return (0);
    }
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Salut

    Ton programme crash (très certainement) parce que tu n'alloues jamais de mémoire pour tes chaînes.

    Mais heureusement pour toi tu fais du C++, et tu n'as pas besoin de manpiuler toutes ces choses horribles qui viennent du 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
    21
    22
    23
    #include <string>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
       // Création d'une chaine
       string s1 = "Coucou";
     
       // Copie de chaine
       string s2 = s1;
     
       // Concaténation
       string s3 = s1 + s2;
       s3 += "bop";
     
       // Accès aux éléments
       s3[0] = 'T';
     
       // Etc...
     
       return 0
    }
    Avec ça tu devrais t'en sortir pour faire ton programme correctement, et ça devrait t'être plutôt familier si tu viens du PHP (j'imagine).


  3. #3
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    merci, je regarde ça et je vois si je m'en sors.
    Peut-on faire pareil avec des char?
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par wamania
    merci, je regarde ça et je vois si je m'en sors.
    Peut-on faire pareil avec des char?
    Salut,
    Je te conseille effectivement d'utiliser si tu fais du c++ des string comme indiqué précedemment.
    Néanmoins si tu tiens absoluement a le faire avec des char*, il faut utiliser str(n)?cat pour concaténer des chaines. Je te conseille de regarder le code suivant inspiré du tien:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
     
    int main 
    (int argc, char *argv[])
    {
      int i, j;
      char* alpha= new char[26];
      char* ch = new char[3];
     
      alpha[0] = 'a';  alpha[1] = 'b';  alpha[2] = 'c';  alpha[3] = 'd';  alpha[4] = 'e';  alpha[5] = 'f';
      alpha[6] = 'g';  alpha[7] = 'h';  alpha[8] = 'i';  alpha[9] = 'j';  alpha[10] = 'k';  alpha[11] = 'l';
      alpha[12] = 'm';  alpha[13] = 'n';  alpha[14] = 'o';  alpha[15] = 'p';  alpha[16] = 'q';  alpha[17] = 'r';
      alpha[18] = 's';  alpha[19] = 't';  alpha[20] = 'u';  alpha[21] = 'v';  alpha[22] = 'w';  alpha[23] = 'x';
      alpha[24] = 'y';  alpha[25] = 'z';
     
     
      for (i=0;i<26;i++)
    	for (j=0;j<26;j++)
                 {
    memset(ch,0,3); // Initialisation de la chaine
    strncat(ch ,&alpha[i],1);
    strncat(ch,&alpha[j],1);
    cout <<"CHAINE:"<< ch <<endl;
     
                 }
     
     
      delete [] ch;
      delete [] alpha;
      system ("pause");
      return (0);
    }
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    ca marche, merci à vous deux, je pense que j'aurais jamais trouvé.
    n'hesiter pas si vous avez besoin de PHP
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    resalut

    Bon, c'est nickel, tout marche.
    J'ai juste une petite question et je ne voulais pas utiliser un nouveau post juste pour çy a t-il une maniere de lui dire caractere "rien", je m'explique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alpha[0] = 'a';  alpha[1] = 'b';  alpha[2] = 'c';  alpha[3] = 'd';  alpha[4] = 'e';  alpha[5] = 'f';.........
    alpha[37] = '';    // et ça, il veut pas (vive le php)
    pcq que sinon, si je fais par exemple 8 boucles, j'aurai forcement des mots de 8 lettres, et je veux que mes 8 boucles puisse generer des mots de 1 à 8 lettres.
    Vous voyez mon dilemme
    Merci à vous en tout cas
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    desolé, reglé
    Merci encore
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par wamania
    J'ai juste une petite question et je ne voulais pas utiliser un nouveau post juste pour çy a t-il une maniere de lui dire caractere "rien", je m'explique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alpha[0] = 'a';  alpha[1] = 'b';  alpha[2] = 'c';  alpha[3] = 'd';  alpha[4] = 'e';  alpha[5] = 'f';.........
    alpha[37] = '';    // et ça, il veut pas (vive le php)
    Le caractere '' n'existe pas en C/C++. Utilise le caractère '\0' qui est le caractère null plutot.
    et si tu fais ca n'oublie d'adapter le code pour ne pas avoir d'erreur de mémoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* alpha=new char[38];
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    T'as pas utilisé les string :

    Pourquoi pas ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string alpha = "abcdefghijklmnopqrstuvwxyz...";
    Et sinon pour concaténer un caractère à un string tu fais juste un +=, ça marche très bien.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par wamania
    pcq que sinon, si je fais par exemple 8 boucles, j'aurai forcement des mots de 8 lettres, et je veux que mes 8 boucles puisse generer des mots de 1 à 8 lettres.
    Je prefere te prevenir que le temps de génération est extremement long.
    J'ai fait un esquisse de programme réalisant ceci et voici le résulta (a noter qu'il est probablement possible de mieux faire)t:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <iostream>
    #include <string>
    #include <vector>
    #include <windows.h> /* Pour calculer le temps */
    using namespace std;
     
    static string alphabet="abcdefghijklmnopqrstuvwxyz";
    vector<string> generated;
     
    void generate(string chaine, unsigned size)
    {
    if (chaine.length()<size) 
    {
    	for(int i=0;i<26;i++)
    		{
    		string tmp=chaine+alphabet[i];
    //		generated.push_back(tmp); 
    /* Cette ligne est en commentaire car si tu les stockes, ta mémoire va exploser, puisque le nombre de mots correspond au nombre  26+26^2+...+26^p.Pour 8 lettres le nombre de mots est de 217 180 147 158 soit 217*8 = 1, 7 To environ .*/
    		generate(tmp,size);
    		}
    }
     
    }
     
     
    int
    main()
    {
     
    LARGE_INTEGER start,end,freq;
    long long  elapsed;
     
    for(int i=0;i<8;i++)
    {
    	generated.clear();
    	QueryPerformanceFrequency(&freq);
    	QueryPerformanceCounter (&start);
     
    	generate("",i);
     
    	QueryPerformanceCounter (&end);
    	elapsed= (((end.QuadPart)-(start.QuadPart)) * 1000000) / freq.QuadPart;
    	cout<<"Temps d'execution ["<<i<<" lettres]:"<<(float)elapsed /1000000<<" secs"<<endl;
    }
     
    /**************************************
     for(int i=0;i<generated.size();i++)
            cout<<generated[i]<<endl;
    //Pour afficher les résultats
    ****************************************/
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    $> a.exe
    Temps d'execution [0 lettres]:1e-006 secs
    Temps d'execution [1 lettres]:1.7e-005 secs
    Temps d'execution [2 lettres]:0.000214 secs
    Temps d'execution [3 lettres]:0.02869 secs
    Temps d'execution [4 lettres]:0.196923 secs
    Temps d'execution [5 lettres]:5.25353 secs
    ^C
    $>
    J'ai arreté la car le temps pour générer les mots de 1 à 6 lettres est trop long (pourtant j'ai compilé avec l'option -O3 qui optimise au maximum)... Pour que tu en sois convaincu teste par toi meme .

    Pou résumer, retiens cette procédure pour générer (qui est peut etre optimisable, avis aux interessées)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void generate(string chaine, unsigned size)
    {
    if (chaine.length()<size) 
    {
    	for(int i=0;i<26;i++)
    		{
    		string tmp=chaine+alphabet[i];
    		generate(tmp,size);
    		}
    }
     
    }
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  11. #11
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    oui, je me doutais que le temps serait long, mais c'est juste un prog pour montrer la faiblesse de certain mot de passe md5 (je suis webmaster n'oublier pas (php)) et je lutte pour securiser mes scripts, alors que mes charmants visiteurs se font un plaisir de mettre des mots de passe du style slt ou lol, donc j'ai decidé, pour les admins, de lancer ce prog, si je trouve, ils ont perdus
    Voila
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  12. #12
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    je retiens ton code, je vais essayer de voir si je peux optimiser.
    j'arrive qd meme à pres de 300 000 essaie par seconde
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par wamania
    je retiens ton code, je vais essayer de voir si je peux optimiser.
    j'arrive qd meme à pres de 300 000 essaie par seconde
    Ok je comprends ton interet, tu peux utiliser des programmes utilisant des dictionnaires (Brute par exemple).
    La recherche se fait suivant un dictionnaire ce qui restreint l'ensemble.
    Une autre méthode est de générer de facon aléatoire les mots de passe et esperer avoir de la chance.
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  14. #14
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    oui, je pense que je vais essayer aussi par ouverture de fichier, il est vrai que la plus part du temps, les dico suffisent, les gens sont des quand il sagit de mettre un mot de passe
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par wamania
    oui, je pense que je vais essayer aussi par ouverture de fichier, il est vrai que la plus part du temps, les dico suffisent, les gens sont des quand il sagit de mettre un mot de passe
    OUI je confirme, j'ai lu un article récemment qui indiquait que la proportion de mots de passe retrouvées par un dictionnaire est relativement forte.
    Après tout dépend de la stratégie de sécurité qeu tu veux utiliser .
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  16. #16
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Il existe déjà des progs connus qui savent faire ce genre de choses assez rapidement.

    Ensuite, Korta, pour la lenteur, je vois des copies de chaines, des chaines aux dimensions non réservées, de la récursivité (n'ayant pas réfléchi sérieusement au problème, je ne sais pas si on peut s'en passer ici ; mais je pense toutes fois que oui quand on bosse en profondeur d'abord).
    Bref, les temps de calculs peuvent être réduits par un facteur linéaire probablement pas négligeable.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    Salut
    Loulou24 ->
    Je pense que je vais mettre des strings ensuite, histoire de pouvoir manipuler tout ça, mais le code de hashage que j'ai voulait que je lui donne un char*, alors moi, je fais, mais mon old old C++ commence à refaire surface, et maintenant que je sais que le code fonctionne, je vais m'amuser à essayer de vraiment le comprendre.
    La stratégie de sécurité?
    Juste eviter que ce qui ne doit pas arriver arrive. Je participe à un projet en commun (sur developpez) dans conception d'un espace membre sécurisé, mené par sub0, alors j'ai pas envie que tous ces travaux soit anéanti par un admin qui a decidé de mettre comme mot de passe "lol" (y en a vraiment)
    Voila
    Merci
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  18. #18
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    Il existe déjà des progs connus qui savent faire ce genre de choses assez rapidement.
    Oui, mais quel plaisir de faire les choses soit meme, c'est comme la cuisine
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Luc Hermitte
    Ensuite, Korta, pour la lenteur, je vois des copies de chaines, des chaines aux dimensions non réservées, de la récursivité (n'ayant pas réfléchi sérieusement au problème, je ne sais pas si on peut s'en passer ici ; mais je pense toutes fois que oui quand on bosse en profondeur d'abord).
    Bref, les temps de calculs peuvent être réduits par un facteur linéaire probablement pas négligeable.
    Je serai curieux de voir tout ce que tu dis .
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  20. #20
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    En prenant le paramètre par référence constante, j'ai un gain de 10% environ.
    En utilisant cette fonction :
    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
    void generate(string & chaine, unsigned size, unsigned depth)
    {
        if (depth == size) return ;
        chaine.resize(depth+1);
        for(int i=0;i<26;++i)
        {
            chaine[depth] = alphabet[i];
            // std::cout << chaine << "\n";
            generate(chaine,size, depth+1);
        }
        chaine.resize(depth);
    }
    ...
    //lancée avec :
    string ch;
    generate(ch, i, 1); // i varie dans [1,8] (<=> ]0,9[)
    Je gagne un facteur énorme : x70.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //avant: en -O4 sur ma machine
    Temps d'execution [0 lettres]:3e-06 secs
    Temps d'execution [1 lettres]:0.000486 secs
    Temps d'execution [2 lettres]:0.013288 secs
    Temps d'execution [3 lettres]:0.368546 secs
    Temps d'execution [4 lettres]:9.18898 secs
     
    // après
    Temps d'execution [1 lettres]:1.6e-05 secs
    Temps d'execution [2 lettres]:0.00019 secs
    Temps d'execution [3 lettres]:0.005236 secs
    Temps d'execution [4 lettres]:0.126914 secs
    Temps d'execution [5 lettres]:3.37162 secs
    En utilisant un tableau de caractères correctement alloué, on doit pouvoir encore gratter un petit facteur vu qu'il nous permettra d'écrire "ch[i]=0;" plutôt que de faire deux appels à resize();
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2009, 11h35
  2. [Preprocesseur] Concatenation de char
    Par TabrisLeFol dans le forum C
    Réponses: 17
    Dernier message: 22/01/2007, 19h53
  3. concatenation de char *
    Par Blo0d4x3 dans le forum C
    Réponses: 18
    Dernier message: 09/08/2006, 09h45
  4. Concaténer un char et un num dans une variable
    Par ade05fr dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 24/10/2005, 16h32
  5. Réponses: 2
    Dernier message: 01/07/2004, 11h36

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