Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1745 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Aide sur pointeurs et array en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide sur pointeurs et array en C

n°2284830
Merlin66
Posté le 07-07-2016 à 11:41:57  profilanswer
 

Bonjour j'aurais besoin d'aide avec les pointeurs et les tableaux, je suis un peu perdu et rouillé :(  

Code :
  1. char currentKey[12];
  2.     const char hexChar[] = "0123456789ABCDEF";
  3.     char *hexCharPointer = hexChar;
  4.     int hexIndex[] =  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  5.     int *hexIndexPointer = hexIndex;
  6.     int length = getCharPointerSize(hexCharPointer); // Ca ca fonctionne
  7.     char buffer[32] = { 0 };
  8.     char *bufferPointer = buffer;
  9.      while (true) {
  10.         char *string = "";
  11.         for ( i = 0; i < length; ++i)
  12.         {
  13.             //TODO Ne fonctionne pas
  14. //            buffer[i] = hexChar[hexIndex[i]];
  15. //            strcat(string, hexChar[hexIndex[i]]);
  16.         }
  17.         hexStringToByteArray(currentKey, bufferPointer, length);
  18.         if (checkKey(currentKey)) {
  19.             break;
  20.         }
  21.         hexIncrease(11);
  22.         fprintf(stderr, "Key %s", buffer);
  23.     }
  24.     free(buffer);


mood
Publicité
Posté le 07-07-2016 à 11:41:57  profilanswer
 

n°2284837
rat de com​bat
attention rongeur méchant!
Posté le 07-07-2016 à 13:12:54  profilanswer
 

Il serait bien de donner un exemple compilable...
 
>char *string = "";
>strcat(string,
Faudrait réserver de la mémoire avant... Autrement dit char *string=malloc(...) ou realloc(...) plus test si succès ou alors char string[<nombre>]; si la place nécessaire est connue au moment de la compilation.
 
Tes <machin>Pointer sont inutiles. Si tu déclares un tableau char tab[42] alors tab est un pointeur sur ce tableau. Autrement dit tu peux faire directement
>int length = getCharPointerSize(hexChar);
(D'autant plus que dans l'état actuel je vois un warning: tst.c:8:28: warning: initialization discards 'const' qualifier from pointer target type [enabled by default])
 
D'Ailleurs, dans le cas présent: int length = sizeof(hexChar)/sizeof(char)-1; mais attention, cela ne fonctionne plus dans une fonction à laquelle tu auras passé un pointeur vers hexChar. Tu peux aussi utiliser int length = strlen(hexChar); qui fonctionnera toujours à condition d'avoir une chaine de caractères (donc terminée par '\0').  Rajouter #include <string.h>.

n°2284838
Merlin66
Posté le 07-07-2016 à 13:47:19  profilanswer
 

Donc je fais :

Code :
  1. {
  2.     char currentKey[12] = { 0 };
  3.     const char hexChar[] = "0123456789ABCDEF";
  4.     int hexIndex[] =  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  5.    
  6.     int length = sizeof(hexChar)/sizeof(char)-1;
  7.     char buffer[32] = { 0 };
  8.    
  9.      while (true) {
  10.      
  11.         for ( i = 0; i < length; ++i)
  12.         {
  13.             //TODO Ne fonctionne pas
  14.             buffer[i] = hexChar[hexIndex[i]];
  15.         }
  16.         hexStringToByteArray(currentKey, *buffer, length);
  17.         if (checkKey(currentKey)) {
  18.             break;
  19.         }
  20.         hexIncrease(11);
  21.     }
  22.     fprintf(stderr, "Key %s", currentKey); // Devrait être la chaine de 12 char "FFFFFFFFFFFF"
  23.     free(buffer);
  24. }
  25. bool checkKey(char *key) {
  26.     return 0 == strcmp(key, "FFFFFFFFFFFF" ); //Juste à des fins de test
  27. }
  28. void hexIncrease(int n) {
  29.     int n2 = 1 + hexIndex[n];
  30.     hexIndex[n] = n2;
  31.     if (n2 == 16) {
  32.         hexIndex[n] = 0;
  33.         hexIncrease(n - 1);
  34.     }
  35. //convert hexstring to len bytes of data
  36. //returns 0 on success, -1 on error
  37. //data is a buffer of at least len bytes
  38. //hexstring is upper or lower case hexadecimal, NOT prepended with "0x"
  39. int hexStringToByteArray(unsigned char *data, const unsigned char *hexstring, unsigned int len)
  40.     {
  41.         unsigned const char *pos = hexstring;
  42.         char *endptr;
  43.         size_t count = 0;
  44.         if ((hexstring[0] == '\0') || (strlen(hexstring) % 2)) {
  45.             //hexstring contains no data
  46.             //or hexstring has an odd length
  47.             return -1;
  48.         }
  49.         for(count = 0; count < len; count++) {
  50.             char buf[5] = {'0', 'x', pos[0], pos[1], 0};
  51.             data[count] = strtol(buf, &endptr, 0);
  52.             pos += 2 * sizeof(char);
  53.             if (endptr[0] != '\0') {
  54.                 //non-hexadecimal character encountered
  55.                 return -1;
  56.             }
  57.         }
  58.         return 0;
  59.     }
  60. }


 

rat de combat a écrit :

Il serait bien de donner un exemple compilable...
 
>char *string = "";
>strcat(string,
Faudrait réserver de la mémoire avant... Autrement dit char *string=malloc(...) ou realloc(...) plus test si succès ou alors char string[<nombre>]; si la place nécessaire est connue au moment de la compilation.
 
Tes <machin>Pointer sont inutiles. Si tu déclares un tableau char tab[42] alors tab est un pointeur sur ce tableau. Autrement dit tu peux faire directement
>int length = getCharPointerSize(hexChar);
(D'autant plus que dans l'état actuel je vois un warning: tst.c:8:28: warning: initialization discards 'const' qualifier from pointer target type [enabled by default])
 
D'Ailleurs, dans le cas présent: int length = sizeof(hexChar)/sizeof(char)-1; mais attention, cela ne fonctionne plus dans une fonction à laquelle tu auras passé un pointeur vers hexChar. Tu peux aussi utiliser int length = strlen(hexChar); qui fonctionnera toujours à condition d'avoir une chaine de caractères (donc terminée par '\0').  Rajouter #include <string.h>.


n°2284839
rat de com​bat
attention rongeur méchant!
Posté le 07-07-2016 à 14:00:49  profilanswer
 

Bon... Explique nous avec des mots ce que tu veux faire. Ton code est loin d'être compilable.
 
Tu as activé les warnings de ton compilateur? gcc: Rajouter -Wall comme paramètre.

n°2284840
Merlin66
Posté le 07-07-2016 à 14:11:53  profilanswer
 

Bien simplement donner toutes les permutations des 16 chars hexadécimaux en 12 char hexadécimaux.  
Je veux utiliser le fait que travailler sur des 0x.. serait plus rapide que de faire les "bêtes" permutations d'une chaine de caracteres que l'on trouve partout et qui sont très lentes
 
Ce code vient de mon code en java qui fonctionne, et je le souhaite en C pour des qestion de rapidité

Message cité 1 fois
Message édité par Merlin66 le 07-07-2016 à 14:13:02
n°2284867
rat de com​bat
attention rongeur méchant!
Posté le 07-07-2016 à 23:52:28  profilanswer
 

Merlin66 a écrit :

Bien simplement donner toutes les permutations des 16 chars hexadécimaux en 12 char hexadécimaux.


ce qui doit donner 16**12=2,8*10**14 possibilités... Si c'est pour craquer un code ( :o ) ton ordi aura fort à faire...

 
Citation :

Je veux utiliser le fait que travailler sur des 0x.. serait plus rapide que de faire les "bêtes" permutations d'une chaine de caracteres que l'on trouve partout et qui sont très lentes


Pas compris... C'est quoi le format final dont tu as besoin?
edit tardif: Tu es conscient que là justement tu travailles sur des chaînes de caractères?


Message édité par rat de combat le 08-07-2016 à 01:58:19
n°2284871
Merlin66
Posté le 08-07-2016 à 08:46:29  profilanswer
 

Merci de ta réponse, et oui je suis conscient :
- du nombre de possibilités (mais entre 3% d'usage du processeur en java et 50% d''utilisation en C
- et que cet algo utilise les char malheureusement.

 

en entrée j'ai besoin d'un :
uint8_t keys[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; (par exemple pour les valeurs)

 


Message cité 1 fois
Message édité par Merlin66 le 08-07-2016 à 08:49:24
n°2284873
rufo
Pas me confondre avec Lycos!
Posté le 08-07-2016 à 09:17:02  profilanswer
 

Si tu veux aller vite, il vaudrait mieux te tourner vers du CUDA (CG Nvidia) ou son équivalent chez AMD et rendre ton algo parallélisable :/
 
Sinon, utiliser un algo appelé MapReduce (domaine du big data). dans tous les cas, il faudra avoir un algo parallélisable si tu veux de la perf. :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2284874
Merlin66
Posté le 08-07-2016 à 09:23:46  profilanswer
 

pas de parallelisation avec mon chti android lol

n°2284902
rufo
Pas me confondre avec Lycos!
Posté le 08-07-2016 à 14:42:22  profilanswer
 

16^12 = 281 474 976 710 656 combinaisons. C'est pas avec ton petit Androïd, comme tu dis, que tu vas y arriver en un temps "raisonnable" :/
 
Tu veux faire quoi en fait ? Que cherches tu à trouver avec ces combinaisons générées ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
mood
Publicité
Posté le 08-07-2016 à 14:42:22  profilanswer
 

n°2284921
rat de com​bat
attention rongeur méchant!
Posté le 08-07-2016 à 17:44:54  profilanswer
 

Merlin66 a écrit :

en entrée j'ai besoin d'un :
uint8_t keys[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; (par exemple pour les valeurs)


Alors c'est complètement inutile (et même idiot au niveau perfs) de s'embêter avec des chars! Un caractère héxa = 4 bits complets, soit deux caractères = un octet complet. Tu peux simplement faire un compteur sur 6 octets pour parcourir l'ensemble des clés.
 
La méthode la plus directe c'est des boucles imbriquées:

Code :
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. int main(void)
  4. {
  5. uint8_t keys[6];
  6. int cpt[6]; //au moins (u)int16
  7. for(cpt[0]=0; cpt[0]<=255; cpt[0]++)
  8. {
  9.  keys[0]=(uint8_t)cpt[0];
  10.  for(cpt[1]=0; cpt[1]<=255; cpt[1]++)
  11.  {
  12.   keys[1]=(uint8_t)cpt[1];
  13.   for(cpt[2]=0; cpt[2]<=255; cpt[2]++)
  14.   {
  15.    keys[2]=(uint8_t)cpt[2];
  16.    for(cpt[3]=0; cpt[3]<=255; cpt[3]++)
  17.    {
  18.     keys[3]=(uint8_t)cpt[3];
  19.     for(cpt[4]=0; cpt[4]<=255; cpt[4]++)
  20.     {
  21.      keys[4]=(uint8_t)cpt[4];
  22.      for(cpt[5]=0; cpt[5]<=255; cpt[5]++)
  23.      {
  24.       keys[5]=(uint8_t)cpt[5];
  25.       //faire quelque chose avec keys
  26.       //affichage p.ex., attention au sens des indexes (inverser eventuellement)
  27.       printf("%02X %02X %02X %02X %02X %02X\r", keys[0], keys[1], keys[2], keys[3], keys[4], keys[5]);
  28.      }
  29.     }
  30.    }
  31.   }
  32.  }
  33. }
  34.     return 0;
  35. }


 
Comme on veut parcourir toutes les valeurs possibles d'un uint8_t on ne peut pas le mettre directement dans l'en-tête de la boucle. Je passe par un autre tableau de int mais je me demande si il n'y a pas plus élégant.
Dans le printf() j'ai mis \r à la fin et non \n, c'est à dire retour au debut de la même ligne et non saut de ligne pour ne pas perdre trop de temps avec l'affichage. Attention, ce dernier est quand même très gourmand en temps, il faut absolument l'éviter dans le code final (en tout cas à cet endroit)!
On peut certainement optimiser d'avantage en passant à l'assembleur.
 
Reste à dire que même avec ça tu ne vas pas aller loin (surtout sur du Android) si il faut parcourir l'ensemble des possibilités...

n°2284923
Merlin66
Posté le 08-07-2016 à 18:06:33  profilanswer
 

Je viens de faire autre chose,  
J'ai même pas eu l'info que tu me donnes avant, je testerais quand même !
Merci de ton aide précieuse en tout cas
 

Code :
  1. #include <stdio.h>
  2. typedef unsigned char byte;
  3. void incByteRecursive(byte *state, int i)
  4. {
  5.     if (state[i] < 0xff)
  6.     {
  7.         state[i]++;
  8.         return;
  9.     }
  10.     state[i] = 0x00;
  11.     if (i == 0)
  12.         return;
  13.     i--;
  14.     incByteRecursive(state, i);
  15. }
  16. void printBytes(byte *state, int len)
  17. {
  18.     int i;
  19.     for (i = 0; i < len; i++)
  20.     {
  21.         printf("%02X ", state[i]);
  22.     }
  23.     fprintf(stdout, "\n" );
  24. }
  25. void test()
  26. {
  27.     byte state[6] = { 0x00 }; // Pourra être un état sauvé
  28.     byte search[6] = {0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF}; //01 FF FF FF FF  553 s
  29.    
  30.     while (0 != memcmp(state, search, sizeof(state)))
  31.     {
  32.         incByteRecursive(state, sizeof(state) - 1);
  33.     }
  34.     printBytes(state, sizeof(state));
  35. }
  36. int main(void) {
  37.     test();
  38.     return 0;
  39. }


Je pense qu'on peux faire encore mieux, mais je commence à avoir une résultat simple à lire et assez (pas assez) rapide.  
 
 
 

rat de combat a écrit :


Alors c'est complètement inutile (et même idiot au niveau perfs) de s'embêter avec des chars! Un caractère héxa = 4 bits complets, soit deux caractères = un octet complet. Tu peux simplement faire un compteur sur 6 octets pour parcourir l'ensemble des clés.
 
La méthode la plus directe c'est des boucles imbriquées:

Code :
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. int main(void)
  4. {
  5. uint8_t keys[6];
  6. int cpt[6]; //au moins (u)int16
  7. for(cpt[0]=0; cpt[0]<=255; cpt[0]++)
  8. {
  9.  keys[0]=(uint8_t)cpt[0];
  10.  for(cpt[1]=0; cpt[1]<=255; cpt[1]++)
  11.  {
  12.   keys[1]=(uint8_t)cpt[1];
  13.   for(cpt[2]=0; cpt[2]<=255; cpt[2]++)
  14.   {
  15.    keys[2]=(uint8_t)cpt[2];
  16.    for(cpt[3]=0; cpt[3]<=255; cpt[3]++)
  17.    {
  18.     keys[3]=(uint8_t)cpt[3];
  19.     for(cpt[4]=0; cpt[4]<=255; cpt[4]++)
  20.     {
  21.      keys[4]=(uint8_t)cpt[4];
  22.      for(cpt[5]=0; cpt[5]<=255; cpt[5]++)
  23.      {
  24.       keys[5]=(uint8_t)cpt[5];
  25.       //faire quelque chose avec keys
  26.       //affichage p.ex., attention au sens des indexes (inverser eventuellement)
  27.       printf("%02X %02X %02X %02X %02X %02X\r", keys[0], keys[1], keys[2], keys[3], keys[4], keys[5]);
  28.      }
  29.     }
  30.    }
  31.   }
  32.  }
  33. }
  34.     return 0;
  35. }


 
Comme on veut parcourir toutes les valeurs possibles d'un uint8_t on ne peut pas le mettre directement dans l'en-tête de la boucle. Je passe par un autre tableau de int mais je me demande si il n'y a pas plus élégant.
Dans le printf() j'ai mis \r à la fin et non \n, c'est à dire retour au debut de la même ligne et non saut de ligne pour ne pas perdre trop de temps avec l'affichage. Attention, ce dernier est quand même très gourmand en temps, il faut absolument l'éviter dans le code final (en tout cas à cet endroit)!
On peut certainement optimiser d'avantage en passant à l'assembleur.
 
Reste à dire que même avec ça tu ne vas pas aller loin (surtout sur du Android) si il faut parcourir l'ensemble des possibilités...


n°2284925
gilou
Modérateur
Modzilla
Posté le 08-07-2016 à 18:34:35  profilanswer
 

Ceci devrait coller, à adapter selon ses besoins.
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4.   long cnt;
  5.   int i;
  6.   char chiffre[] = "0123456789ABCDEF";
  7.   char *resultat = malloc(13);
  8.   for (i = 0; i < 12; ++i)
  9.     resultat[i] = '0';
  10.   resultat[12] = 0;
  11.   printf("0x%s\n", resultat);
  12.   for (cnt = 1; cnt < 281474976710656; ++cnt) {
  13.     i = 11;
  14.     resultat[i] = chiffre[cnt % 16];
  15.     while (resultat[i] == '0' && i >= 0) {
  16.       --i;
  17.       if (resultat[i] <= '9')
  18.         resultat[i] = chiffre[((resultat[i] - '0') + 1)];
  19.       else
  20.         resultat[i] = chiffre[((resultat[i] - 'A') + 11) % 16];
  21.     }
  22.     printf("0x%s\n", resultat);
  23.   }
  24.   return 0;
  25. }


 
C'est peut être optimisable.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2284933
rufo
Pas me confondre avec Lycos!
Posté le 08-07-2016 à 23:19:54  profilanswer
 

Merlin66 a écrit :

Je viens de faire autre chose,  
J'ai même pas eu l'info que tu me donnes avant, je testerais quand même !
Merci de ton aide précieuse en tout cas
 

Code :
  1. #include <stdio.h>
  2. typedef unsigned char byte;
  3. void incByteRecursive(byte *state, int i)
  4. {
  5.     if (state[i] < 0xff)
  6.     {
  7.         state[i]++;
  8.         return;
  9.     }
  10.     state[i] = 0x00;
  11.     if (i == 0)
  12.         return;
  13.     i--;
  14.     incByteRecursive(state, i);
  15. }
  16. void printBytes(byte *state, int len)
  17. {
  18.     int i;
  19.     for (i = 0; i < len; i++)
  20.     {
  21.         printf("%02X ", state[i]);
  22.     }
  23.     fprintf(stdout, "\n" );
  24. }
  25. void test()
  26. {
  27.     byte state[6] = { 0x00 }; // Pourra être un état sauvé
  28.     byte search[6] = {0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF}; //01 FF FF FF FF  553 s
  29.    
  30.     while (0 != memcmp(state, search, sizeof(state)))
  31.     {
  32.         incByteRecursive(state, sizeof(state) - 1);
  33.     }
  34.     printBytes(state, sizeof(state));
  35. }
  36. int main(void) {
  37.     test();
  38.     return 0;
  39. }


Je pense qu'on peux faire encore mieux, mais je commence à avoir une résultat simple à lire et assez (pas assez) rapide.  
 
 
 


Vu le nb de combinaisons, je te déconseille fortement de faire un algo récursif  :non:  C'est un coup à faire péter la pile :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2284937
gilou
Modérateur
Modzilla
Posté le 09-07-2016 à 00:36:18  profilanswer
 

Et une version C++11

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <unordered_map>
  4. int main() {
  5. const std::string chiffre = "0123456789ABCDEF";
  6. std::string resultat = "000000000000";
  7. std::unordered_map<char, int> rang (
  8.   {{'0',0}, {'1',1}, {'2',2}, {'3',3},
  9.    {'4',4}, {'5',5}, {'6',6}, {'7',7},
  10.    {'8',8}, {'9',9}, {'A',10}, {'B',11},
  11.    {'C',12}, {'D',13}, {'E',14}, {'F',15}} );
  12. long long int cnt = 281474976710656 ;
  13. do {
  14.  int i = 12;
  15.  std::cout << "0x" << resultat << std::endl;
  16.  do {
  17.   --i;
  18.   resultat[i] = chiffre[(rang[resultat[i]] + 1) % 16];
  19.  } while ((!rang[resultat[i]]) && (i >= 0) );
  20. } while(--cnt);
  21. return 0;
  22. }


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2284938
gilou
Modérateur
Modzilla
Posté le 09-07-2016 à 00:42:46  profilanswer
 

rufo a écrit :


Vu le nb de combinaisons, je te déconseille fortement de faire un algo récursif  :non:  C'est un coup à faire péter la pile :o

A la louche s'il empile 281474976710656 appels, avec 4 ou 5 Peta Octets de Ram, ça peut passer... ;)  
 
A+,


Message édité par gilou le 09-07-2016 à 00:43:18

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2284950
gilou
Modérateur
Modzilla
Posté le 09-07-2016 à 11:49:59  profilanswer
 

gilou a écrit :

C'est peut être optimisable.


C'est.

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4.     char *c = "0123456789ABCDEF";
  5.     char r[12] = {0};
  6.     long long int cnt = 281474976710656;
  7.     do {
  8.         int i = 11;
  9.         printf("%s%c%c%c%c%c%c%c%c%c%c%c%c\n", "0x",
  10.                c[r[0]], c[r[1]], c[r[2]], c[r[3]], c[r[4]], c[r[5]], c[r[6]], c[r[7]], c[r[8]], c[r[9]], c[r[10]], c[r[11]]);
  11.         do {
  12.             r[i] = (r[i] +1) % 16;
  13.         } while ((!r[i]) && (i-- >= 0));
  14.     } while (--cnt);
  15.     return 0;
  16. }


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2284951
Merlin66
Posté le 09-07-2016 à 12:12:25  profilanswer
 

C'est effectivement plus rapide que ma récursion :
 
0x0001FFFFFFF
Took 389.173279 seconds to execute (au lieu de 550)
 
De plus j'avais des soucis avec la version C++11 (android studio n'aime pas mélanger tout pour le moment)
Merci Gilou !
PS Je pense que le modulo 16 peut être amélioré (j'avais trouver un truc pour mon arduino à ce propos)
 
 

gilou a écrit :


C'est.

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4.     char *c = "0123456789ABCDEF";
  5.     char r[12] = {0};
  6.     long long int cnt = 281474976710656;
  7.     do {
  8.         int i = 11;
  9.         printf("%s%c%c%c%c%c%c%c%c%c%c%c%c\n", "0x",
  10.                c[r[0]], c[r[1]], c[r[2]], c[r[3]], c[r[4]], c[r[5]], c[r[6]], c[r[7]], c[r[8]], c[r[9]], c[r[10]], c[r[11]]);
  11.         do {
  12.             r[i] = (r[i] +1) % 16;
  13.         } while ((!r[i]) && (i-- >= 0));
  14.     } while (--cnt);
  15.     return 0;
  16. }


 
A+,


n°2284958
gilou
Modérateur
Modzilla
Posté le 09-07-2016 à 19:25:44  profilanswer
 

A ce niveau, ce qui est couteux, c'est le printf à chaque étape.
Si on peut se permettre de bufferiser et écrire à l'écran toutes les n lignes (avec un n optimal à déterminer, dépendant probablement de la taille du buffer interne du printf) on doit pouvoir gagner pas mal.
 
> Je pense que le modulo 16 peut être amélioré (j'avais trouver un truc pour mon arduino à ce propos)  
On peut tenter ici:  
r[i] += 1;
if (r[i] == 16) r[i] = 0;
ou bien
r[i] = (r[i] == 15)?0:(r[i] + 1);
et voir si c'est plus efficace.
 
A+,


Message édité par gilou le 09-07-2016 à 19:37:07

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2284961
rat de com​bat
attention rongeur méchant!
Posté le 09-07-2016 à 20:48:40  profilanswer
 

Tu as testé ma méthode avec les boucles?

n°2284970
gilou
Modérateur
Modzilla
Posté le 10-07-2016 à 02:06:43  profilanswer
 

C'est sur qu'elle marche, mais écrire 12 boucles imbriquées...
Alors que ça c'est générique vis a vis du nombre de chiffres du résultat:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define STEPS 12
  4. int main() {
  5.     char *c = "0123456789ABCDEF";
  6.     char r[STEPS] = {0};
  7.     long long int cnt = 1;
  8.     int i;
  9.     for (i = 0; i < STEPS; ++i) cnt *= 16;
  10.    
  11.     do {
  12.         printf("0x" );
  13.         for (i = 0; i < STEPS; ++i) printf("%c", c[r[i]]);
  14.         printf("\n" );
  15.         i = (STEPS - 1);
  16.         do {
  17.             r[i] = (r[i] +1) % 16;
  18.         } while ((!r[i]) && (i-- >= 0));
  19.     } while (--cnt);
  20.     return 0;
  21. }


 
A+,

Message cité 1 fois
Message édité par gilou le 10-07-2016 à 02:07:27

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2285092
Merlin66
Posté le 13-07-2016 à 12:34:26  profilanswer
 

:whistle: Je reviens pour m'excuser, j'ai oublié une chose essentielle...
Le test d'une clé prend en moyenne 3ms
La vitesse de l'algorithme n'est donc pas essentielle.
Désolé, je me sent ballot.
Malgré tout, je garde les codes sous le coude, notamment les moins gourmand en mémoire.

n°2285108
rat de com​bat
attention rongeur méchant!
Posté le 13-07-2016 à 14:20:19  profilanswer
 

gilou a écrit :

C'est sur qu'elle marche, mais écrire 12 boucles imbriquées...


6 :o Je n'ai pas dit que c'était beau...
 

Citation :

Alors que ça c'est générique vis a vis du nombre de chiffres du résultat:


Certes, mais plus rapide? Enfin bon, de toute façon vu le nombre de possibilités (et vu qu'un test de clé c'est 3ms soit maxi 333 tests/s) c'est une question purement théorique. Mais c'est quand même intéressant, surtout si on fabrique une version assembleur aussi.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Aide sur pointeurs et array en C

 

Sujets relatifs
Fonction : Passer un élément d'array en paramètreProg C d'un LCD
VBA AIDEBesoin d'aide Programmation Arduino Urgent
Problème C# récupération de donnéeBesoin d'aide pour un projet
Problème, besoin d'aide svp![C#] Tableaux croisés dynamiques et Open XML
[C#] Un bon livre ?Aide code C++ faire un rectangle ( noob )
Plus de sujets relatifs à : Aide sur pointeurs et array en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR