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

  FORUM HardWare.fr
  Programmation
  C

  Tableau1 -> Tableau2

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tableau1 -> Tableau2

n°1516153
timz
Posté le 18-02-2007 à 15:08:24  profilanswer
 

Bonjour à tous,
 
Je souhaites réaliser un tableau de deux dimensions, qui serait rempli par un tableau temporaire de 10 octets.
Mais je voudrais, que les 10 octets se suivent (c'est à dire réaliser un tableau de 200 octets par exemple pour y mettre 20 tableau temporaire). Je ne sais pas du tout comment réaliser ceci. J'ai beau regarder des cours en C sur les tableaux je ne comprend pas. Si quelqu'un pourrait me mettre sur la piste cela serait sympa :)
 
Merci de m'avoir lu.

mood
Publicité
Posté le 18-02-2007 à 15:08:24  profilanswer
 

n°1516161
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-02-2007 à 15:37:20  profilanswer
 

timz a écrit :

Je souhaites réaliser un tableau de deux dimensions, qui serait rempli par un tableau temporaire de 10 octets.
Mais je voudrais, que les 10 octets se suivent (c'est à dire réaliser un tableau de 200 octets par exemple pour y mettre 20 tableau temporaire). Je ne sais pas du tout comment réaliser ceci. J'ai beau regarder des cours en C sur les tableaux je ne comprend pas. Si quelqu'un pourrait me mettre sur la piste cela serait sympa :)


Créer dynamiquement un tableau linéaire de NB_LIN (20) tableaux de SZ_LIN (10) unsigned char (il n'y a pas d'octets en C. C'est une notion 'flux' ou 'réseau', pas mémoire interne)

 
Code :
  1. unsigned char *tab = malloc (NB_LIN * SZ_LIN * sizeof *tab);


Ensuite 2 méthodes. Soit calculer l'adresse des éléments :

Code :
  1. char *adr (char *tab, size_t lin, size_t col)
  2. {
  3.    return tab + lin * SL_LIN + col;
  4. }


soit intialiser un tableau de pointeur avec les adresses des 20 tableau de char

Code :
  1. char *pp[20];
  2.    for (i = 0; i < sizeof pp / sizeof *pp; i++)
  3.    {
  4.       pp[i] = tab + i * SZ_LIN;
  5.    }


ce qui permet ensuite un accès direct

Code :
  1. x = pp[lin][col];
  

 


Message édité par Emmanuel Delahaye le 18-02-2007 à 15:41:48

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1516168
Sve@r
Posté le 18-02-2007 à 16:16:45  profilanswer
 

timz a écrit :

Bonjour à tous,
 
Je souhaites réaliser un tableau de deux dimensions, qui serait rempli par un tableau temporaire de 10 octets.
Mais je voudrais, que les 10 octets se suivent (c'est à dire réaliser un tableau de 200 octets par exemple pour y mettre 20 tableau temporaire). Je ne sais pas du tout comment réaliser ceci. J'ai beau regarder des cours en C sur les tableaux je ne comprend pas. Si quelqu'un pourrait me mettre sur la piste cela serait sympa :)
 
Merci de m'avoir lu.


La méthode d'Emmanuel me semble "compliquée" pour quelqu'un qui débute en C. Moi, je ferais plus simple. c.a.d. définir un simple tableau de [20][10]

Code :
  1. unsigned char tab[20][10];


Là, t'es certain que ton tableau est contiguë en mémoire, c.a.d. que toutes les cases se suivent. Il en résulte que si tu remplis "5" octets à partir de "tab[5][8]" (par exemple), alors le 1er octet ira dans tab[5][8], le second ira dans tab[5][9], le 3° ira dans tab[6][0], le 4° ira dans tab[6][1] et le 5° ira dans tab[6][2].
 
Ensuite, il te suffit d'utiliser "memcpy()" pour copier à chaque "debut de ligne" ton tableau temporaire.
Ex: Imaginons que tes 20 tableaux temporaires se nomment "tmp1", "tmp2", "tmp3", etc..., alors il te suffit d'écrire

Code :
  1. memcpy(tab[0], tmp1, 10);
  2. memcpy(tab[1], tmp2, 10);
  3. <...>
  4. memcpy(tab[19], tmp20, 10);


 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1516195
timz
Posté le 18-02-2007 à 18:52:50  profilanswer
 

Merci beaucoup je vais utiliser la seconde solution :)

n°1519375
timz
Posté le 24-02-2007 à 14:17:17  profilanswer
 

Cela marche très bien le memcpy! Merci
 
J'ai une autre question, ma matrice est pleine, je voudrais la réinitialiser entièrement, c'est à dire que tout les valeurs de la matrice soit à 0x00 par exemple.
 
Désolé d'être si "chiant".
 
Merci

n°1519425
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-02-2007 à 17:11:58  profilanswer
 

timz a écrit :

J'ai une autre question, ma matrice est pleine, je voudrais la réinitialiser entièrement, c'est à dire que tout les valeurs de la matrice soit à 0x00 par exemple.
 
Désolé d'être si "chiant".


Ce qui est 'chiant' c'est de répondre à des questions basiques... memset()...
 
Tu n'as donc pas de livre de C ? Tu codes au hasard ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1519461
Sve@r
Posté le 24-02-2007 à 19:09:51  profilanswer
 

timz a écrit :

Cela marche très bien le memcpy! Merci


En général, toutes les fonctions offertes font ce qu'elles sont sensées faire autrement dit toutes "marchent" très bien !!!
 

timz a écrit :

J'ai une autre question, ma matrice est pleine


Pleine ??? Une variable (ou un tableau de variables) ne sont jamais pleines (ni jamais vides). Toute variable contient toujours une valeur !!!
 

timz a écrit :

je voudrais la réinitialiser entièrement, c'est à dire que tout les valeurs de la matrice soit à 0x00 par exemple.


Bon, Emmanuel t'a répondu. Avant de venir demander qu'on te la tienne, essaye un peu de t'assumer. Regarde le "man", va sur google. Le pire, c'est que même s'il n'avait pas existé de fonction qui réponde à ton besoin, tu aurais pu y répondre tout seul avec

  • un peu de réflexion
  • deux boucles imbriquées

(et ceci dans l'ordre que tu préfères)


Message édité par Sve@r le 24-02-2007 à 19:11:52

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

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

  Tableau1 -> Tableau2

 

Sujets relatifs
Plus de sujets relatifs à : Tableau1 -> Tableau2


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)