[c][Transfer de donnees d´un tableau bidimensionel vers unidimensione]

[Transfer de donnees d´un tableau bidimensionel vers unidimensione] [c] - C - Programmation

Marsh Posté le 16-12-2012 à 21:19:02    

Bonsoir,
 
Avec la fonction readandparse, je lis et ecris le contenu de la variable info dans un tableau bidimensionel. Dans le tableau bidimensionel,les donnees doivent être structurees comme ceci:

t[0][0] = 12,25
t[1][0] = 12,55
t[2][0] = 11,89
t[3][0] = 12,3

 
Jusqu´ici sa va.
 
Dans la suite j´aimerais passer progressivement le contenu du tableau bidimensionel vers un tableau unidimensionel. Helas je bloque !! Bref, j´aimerais que le tableau unidimensionel command[max_size] receptione sucessivement 12,25 puis 12,55 puis 11,89 et 12,3.
Mais je coince.
 
Merci d´avance.
 
Mon programme:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define max_index 6
  4. #define element 5
  5. #define max_size 6
  6. char info[] = {"D12,25FD12,55FD11,89D12,3F"};
  7. char t[max_index][element];
  8. char command[max_size];
  9. unsigned int size = 0;
  10. size_t j = 0;
  11. size_t i = 0;
  12. size_t Number_index = 0; // Number index of table
  13. size_t N = sizeof(t) / sizeof(t[j][0]);// Nombre d'élément total du tableau
  14. size_t M = sizeof(t[0]) / sizeof(t[j][0]); // nombre d´elements d´une ligne
  15. void Transfer_Data(char * pointer1, size_t N1, size_t M1)
  16. {
  17.   unsigned int n = 0;
  18.   size_t j1 = 0  ;
  19.   size_t i1 = 0  ;
  20.    for(n = 0; pointer1[n] != 0; n++)
  21.    {
  22.      if(j1 < N1)
  23.      {
  24.         if(i1 < M1)
  25.         {
  26.           if(size < max_size)
  27.           {
  28.              command[size] = pointer1[n];
  29.              printf("%c", command[size]);
  30.              ++size;
  31.              ++i1;
  32.           }
  33.         }
  34.         else
  35.         {
  36.             printf("\n" );
  37.             ++j1;
  38.             i1 = 0;
  39.             size = 0;
  40.         }
  41.       }
  42.     }
  43. }
  44. void readandparse(char * pointer)
  45. {
  46.   char data;
  47.   int k;
  48.   for(k = 0; pointer[k] != 0; k++)
  49.   {
  50.     data = pointer[k];
  51.     if(data == 'F')
  52.     {
  53.       ++j;
  54.       printf("\n" );
  55.      // printf("%d\n", sizeof(t)); // Taille actuelle de t
  56.     //  printf("Reception du caractere: F!\n" );
  57.       printf("\n" );
  58.     }
  59.     else if(data == 'D')
  60.     {
  61.       printf("\n" );
  62.      // printf("Reception du caractere D: !\n" );
  63.       printf("\n" );
  64.       i = 0;
  65.     }
  66.     else
  67.     {
  68.       if(j < max_index)
  69.       {
  70.         if(i < element)
  71.          {
  72.            t[j][i] = data; // ecrire dans un tableau bidimensionel
  73.            printf("%c", t[j][i]);
  74.            ++i;
  75.          }
  76.       }
  77.     }
  78.   }
  79. }
  80. main()
  81. {
  82.     readandparse(info);
  83.     j = 0;
  84.     Transfer_Data(&t[0][0], max_index, element);
  85.     return 0;
  86. }

Reply

Marsh Posté le 16-12-2012 à 21:19:02   

Reply

Marsh Posté le 19-12-2012 à 09:29:36    

Formule de passage des indices :
si ton tableau 2D est T2d[i][j] avec 0<j<MaxSize, alors T1d[(i*MaxSize)+j]


---------------
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
Reply

Marsh Posté le 19-12-2012 à 13:36:42    

J'avais pas répondu parce que j'avais oublié, mais a la lecture du post initial, il y avait un truc qui me chiffonnait:
char t[max_index][element];
et
t[0][0] = 12,25  
Hem...
C'est pas plutôt
t[0][0] = '1' t[0][1] = '2' t[0][2] = ',' t[0][3] = '2' t[0][4] = '5'  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-12-2012 à 10:05:41    

gilou a écrit :

J'avais pas répondu parce que j'avais oublié, mais a la lecture du post initial, il y avait un truc qui me chiffonnait:
char t[max_index][element];
et
t[0][0] = 12,25  
Hem...
C'est pas plutôt
t[0][0] = '1' t[0][1] = '2' t[0][2] = ',' t[0][3] = '2' t[0][4] = '5'  
A+,


 
Bonjour et merci pour vos interventions,
 
tu as vu juste gilou. J´ai tout simplement foire lors de la representation des donnees de Tableau_bi(bidimensionel)..  En fait les donnees devront être representees dans Tableau_bi comme dans ta remarque:


t[0][0] = '1' t[0][1] = '2' t[0][2] = ',' t[0][3] = '2' t[0][4] = '5'  
t[1][0] = '1' t[0][1] = '2' t[0][2] = ',' t[0][3] = '5' t[0][4] = '5'  
t[2][0] = '1' t[0][1] = '1' t[0][2] = ',' t[0][3] = '8' t[0][4] = '9'  
t[3][0] = '1' t[0][1] = '2' t[0][2] = ',' t[0][3] = '3'  


 
Puis Copietableau(unidimensionel) recevra sucessivement:


Copietableau[] = {'1','2',',','2','5','\0'}
puis
Copietableau[] = {'1','2',',','5','5','\0'}
puis
Copietableau[] = {'1','1',',','8','9','\0'}
puis
Copietableau[] = {'1','2',',','3','\0'}  


 
J´ai modifie mon programme et apparement je semble obtenir ce que je desire.
Donnez moi votre avis  svp!!
A plus tard
 
Programme:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_INDEX 5
  5. #define MAX_ELEMENT 6
  6. #define MAX_SIZE 6
  7. char Donnees[] = {"D12,25FD12,55FD11,89FD12,3F"};
  8. char Tableau_bi[MAX_INDEX][MAX_ELEMENT];
  9. char Tableau_uni[MAX_ELEMENT] = {0};
  10. int SIZE ;
  11. int j = 0;
  12. int i = 0;
  13. size_t N = sizeof(Tableau_bi) / sizeof(Tableau_bi[0]); // Nombre de ligne
  14. //size_t M = sizeof(t[j]) / sizeof(t[j][0]);  //elements de t[j] (t[j][0] a t[j][element-1])
  15. //size_t N = sizeof(Tableau_bi) / sizeof(Tableau_bi[j][0]);// Nombre d'élément total du tableau
  16. size_t M = sizeof(Tableau_bi[0]) / sizeof(Tableau_bi[j][0]); // nombre d´elements d´une ligne
  17. void Copietableau(char Tableauoriginal[N][M], char Copietableau[], int N1, int M1)
  18. {
  19.    int j1;
  20.    int i1;
  21.    for(j1 = 0; j1 < N1; j1++)
  22.    {
  23.      printf("\n" );
  24.      for(i1 = 0; i1 < M1; i1++)
  25.      {
  26.         Copietableau[i1] = Tableauoriginal[j1][i1];
  27.        // printf("%c", Copietableau[i1]);
  28.        printArray1D(Copietableau, i1, "Copietableau" );
  29.      }
  30.    }
  31. }
  32. void printArray1D(char* array, int len, char* name)
  33. {
  34.   int i=0;
  35.   printf("\n Print %s :\n\t", name);
  36.   for(i=0;i<len;++i)
  37.   {
  38.     printf("%c", array[i]);
  39.   }
  40.   printf("\n" );
  41. }
  42. void Lireetecrire(char * pointeur)
  43. {
  44.   char data;
  45.   int k;
  46.   for(k = 0; pointeur[k] != 0; k++)
  47.   {
  48.     data = pointeur[k];
  49.     if(data == 'F')
  50.     {
  51.       printf("\n" );
  52.       ++j;
  53.     }
  54.     else if(data == 'D')
  55.     {
  56.       printf("\n" );
  57.       i = 0;
  58.     }
  59.     else
  60.     {
  61.       if(j < MAX_INDEX)
  62.       {
  63.         if(i < MAX_ELEMENT)
  64.          {
  65.            Tableau_bi[j][i] = data; // ecrire dans un tableau bidimensionel
  66.             printf("%c", Tableau_bi[j][i]);
  67.            ++i;
  68.          }
  69.       }
  70.     }
  71.   }
  72.    printf("Plus bas la copie sucessive des lignes du Tableau_bi\n" );
  73.    j = 0;
  74.   Copietableau(Tableau_bi,Tableau_uni, MAX_INDEX, MAX_ELEMENT);
  75. }
  76. main()
  77. {
  78.     Lireetecrire(Donnees);
  79.     return 0;
  80. }


Reply

Marsh Posté le 20-12-2012 à 15:12:50    

Citation :

char Donnees[] = {"D12,25FD12,55FD11,89FD12,3F"};


Si ça marche, ce n'est pas pour une bonne raison:
Ce devrait être char Donnees[] = "D12,25FD12,55FD11,89FD12,3F";
 
D'autre part, une simple compilation avec le flag -Wall pour les warnings indique que:
- printArray1D est utilisée dans Copietableau sans avoir été déclarée au préalable
- main() n'est pas déclarée avec un type (ce devrait être int main())
 
Il y a plein d'autres choses à dire sur le code.
 
Un petit exemple vite fait de comment on aurait pu faire la lecture avec un tableau dynamique:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. void scanInput(char *data, int *lines, int *cols) {
  6.     char *p = data;
  7.     int maxcols = 0;
  8.     bool insideDF = false;
  9.     *lines = 0;
  10.     *cols = 0;
  11.     while(*p) {
  12.         switch(*p) {
  13.         case 'D':
  14.             if (!insideDF) {
  15.                 insideDF = true;
  16.                 ++*lines;
  17.             }
  18.             maxcols = 0;
  19.             break;
  20.         case 'F':
  21.             if (insideDF) {
  22.                 insideDF = false;
  23.                 *cols = (*cols < maxcols) ? maxcols : *cols;
  24.             }
  25.             break;
  26.         default:
  27.             if (insideDF) {
  28.                 ++maxcols;
  29.             }
  30.             break;
  31.         }
  32.         ++p;
  33.     }
  34. }
  35. void readInput(char *data, char **tableau2D) {
  36.     char *p = data;
  37.     int i, j;
  38.     bool insideDF = false;
  39.     i = -1;
  40.     while(*p) {
  41.         switch(*p) {
  42.         case 'D':
  43.             if (!insideDF) {
  44.                 insideDF = true;
  45.                 ++i;
  46.                 j = 0;
  47.             }
  48.             break;
  49.         case 'F':
  50.             if (insideDF) {
  51.                 insideDF = false;
  52.             }
  53.             break;
  54.         default:
  55.             if (insideDF) {
  56.                 tableau2D[i][j++] = *p;
  57.             }
  58.             break;
  59.         }
  60.         ++p;
  61.     }
  62. }
  63. char **make_tableau2D(int lines, int cols) {
  64.     char **p;
  65.     int i;
  66.     if ((lines <= 0) || (cols <= 0)) return NULL;
  67.     p = malloc(lines * sizeof(char*));
  68.     if (!p) return NULL;
  69.     for (i = 0; i < lines; ++i) {
  70.         p[i] = calloc(cols, sizeof(char));
  71.         if (!p[i]) {
  72.             while(i) {
  73.                 free(p[--i]);
  74.             }
  75.             free(p);
  76.             return NULL;
  77.         }
  78.     }
  79.     return p;
  80. }
  81. void free_tableau2D(char **tableau2D, int lines) {
  82.     int i;
  83.     if (!tableau2D) return;
  84.     for (i = 0; i < lines; ++i) {
  85.         free(tableau2D[i]);
  86.     }
  87.     free(tableau2D);
  88. }
  89. void dump_tableau2D(char **tableau2D, int lines, int cols) {
  90.     int i, j;
  91.     if (!tableau2D) return;
  92.     for (i = 0; i < lines; ++i) {
  93.         for (j = 0; j < cols; ++j) {
  94.             if (tableau2D[i][j])
  95.                 printf("t[%d][%d] = '%c' ", i, j, tableau2D[i][j]);
  96.         }
  97.         printf("\n" );
  98.     }
  99. }
  100. void Lire(char *data)
  101. {
  102.     char **tableau_bi;
  103.     int lines, cols;
  104.     scanInput(data, &lines, &cols);
  105.     tableau_bi = make_tableau2D(lines, cols);
  106.     if (tableau_bi) {
  107.         readInput(data, tableau_bi);
  108.         dump_tableau2D(tableau_bi, lines, cols);
  109.         free_tableau2D(tableau_bi, lines);
  110.     }
  111. }
  112. int main()
  113. {
  114.     char *Donnees = "D12,25FD12,55FD11,89FD12,3F";
  115.     Lire(Donnees);
  116.     return 0;
  117. }


 
 
A+,


Message édité par gilou le 20-12-2012 à 18:26:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-12-2012 à 21:43:15    

Bonsoir gilou,
 
ta methode est tout simplement incroyable.  J´ai tout de même compris le sens de tes codes. Cependant j´ai quelques questions.
 
Quel est la difference entre **tableau2D et *tableau2D ?  
 
D´apres moi: - **tableau2D  pointe sur un tableau 2D
                  - *tableau2D pointe sur un tableau 1D
 
Que signifie  *cols = (*cols < maxcols) ? maxcols : *cols; ?
 
Sinon je crois avoir pige le reste.
 
Merci pour ton aide.
 

Reply

Marsh Posté le 20-12-2012 à 23:24:01    

Bonsoir

Citation :

ta methode est tout simplement incroyable.


Non, c'est la technique standard en C pour les tableaux dynamiques.
 
tableau2D pointe vers un tableau 2D (parce qu'on a construit le tableau de pointeurs sur les lignes)
*tableau2D pointe sur une zone contiguë en mémoire (qu'on peut interpréter comme un tableau 1D)
**tableau2D est le caractère aussi noté tableau2D[0][0]
 
*cols = (*cols < maxcols) ? maxcols : *cols;
c'est une notation courte pour
if (*cols < maxcols)
    *cols = maxcols;
else
    *cols = *cols;
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-12-2012 à 23:45:52    

Quand tu utilises *var_ptr, tu fais ce qu'on appelle un déréférencement, tu accèdes à la valeur à l'adresse donnée par var_ptr. Ca revient à faire var_ptr[0], l'opérateur [ ] fait un offset puis un déréférencement.
Donc si tu as un pointeur du style :
int ** Ptr;

 

Lorsque tu fais *Ptr, tu récupère la valeur à l'adresse de Ptr, celle-ci étant elle-même un pointeur tu peux aussi la déréfencer.
Ensuite, la dernière ligne, c'est l'opérateur ternaire :
var = condition ? valeur_si_vrai : valeur_si_faux;

 

Ca revient à faire if (condition) var=valeur_si_vrai; else var=valeur_si_faux;

 

Là c'est pour faire en sorte que la valeur à l'adresse de col soit toujours supérieur à maxcol (si elle est inférieur, tu lui assigne maxcols sinon tu lui assigne elle-même, bref elle change pas)

 

Ah ben j'ai été grillé :D


Message édité par Terminapor le 20-12-2012 à 23:46:39

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 21-12-2012 à 00:02:15    

Ah oui, sinon, deux détails:
Dans le scan et la lecture, je saute ce qui n'est pas entre un D et un F (début et fin je suppose), d'ou mon flag insideDF
D'autre part, mon stockage dans tableau_bi est optimisé: les lignes de taille maximum sont stockées sans '\0' final (pour les autres, il y en a un car j'ai initialisé à 0 les lignes en les construisant avec calloc)
En faisant tableau_bi = make_tableau2D(lines, cols+1); toutes mes lignes seraient des suites de caractères avec un '\0' final ie des chaines de caractère C ce qui peut être utile éventuellement selon l'usage qu'on en a.
A+,


Message édité par gilou le 21-12-2012 à 00:12:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-12-2012 à 14:53:20    

Bonjour,
 
Merci pour vos explications. Je crois avoir tout compris.  
A+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed