[Transfer de donnees d´un tableau bidimensionel vers unidimensione] [c] - C - Programmation
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]
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+,
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:  | 
 
 
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: 
|   | 
 
 
Puis Copietableau(unidimensionel) recevra sucessivement: 
|   | 
 
 
J´ai modifie mon programme et apparement je semble obtenir ce que je desire. 
Donnez moi votre avis  svp!! 
A plus tard 
  
Programme: 
| Code : 
 | 
 
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 : 
 | 
 
 
 
A+,
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. 
 
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+,
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é 
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+,
Marsh Posté le 21-12-2012 à 14:53:20
Bonjour, 
 
Merci pour vos explications. Je crois avoir tout compris.  
A+ 
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: