Initialisation à zéro d'une grosse matrice en C

Initialisation à zéro d'une grosse matrice en C - C - Programmation

Marsh Posté le 01-02-2007 à 04:34:30    

Salut a tous,
 
Comment faire pour initialiser une matrice [1000]*[1000] avec des 0 en C?
 
Est ce que le fait de la déclarer, met ses éléments a zéro ou bien faut faire une double boucle pour mettre chaque element à zéro?
 
merci,
 

Reply

Marsh Posté le 01-02-2007 à 04:34:30   

Reply

Marsh Posté le 01-02-2007 à 06:01:57    

memset

Reply

Marsh Posté le 01-02-2007 à 08:34:42    

int mat[1000][1000] = {0};

Reply

Marsh Posté le 01-02-2007 à 09:15:17    

ce genre de saloperie alloué sur la pile, c'est la route vers l'échec. Fais une allocation dynamique avec calloc. Et si t'es intelligent, tu peux le faire avec 1 seul calloc

Reply

Marsh Posté le 03-02-2007 à 10:55:58    

Taz a écrit :

ce genre de saloperie alloué sur la pile, c'est la route vers l'échec. Fais une allocation dynamique avec calloc. Et si t'es intelligent, tu peux le faire avec 1 seul calloc


 
Tss tssss
ca aurai rien a voir avec de l'intelligence mais plutot avec une bonne connaissance de la reprensetation des tableaux en mémoire...
 
intelligence =/= de connaissance... arretons de snober ceux qui ne voit pas les optimisations

Reply

Marsh Posté le 03-02-2007 à 11:04:07    

euh je snob personne. C'était le ton du défi.  'est un fait, il y a une manière plus chouette que l'autre de le faire. Seulement il faut se creuser un peu les méninges.

Reply

Marsh Posté le 03-02-2007 à 12:55:47    

Taz a écrit :

Fais une allocation dynamique avec calloc. Et si t'es intelligent, tu peux le faire avec 1 seul calloc


Est-ce vraiment important de se forcer à travailler en 1 dim si le C nous offre la possibilité de travailler en 2 dim ? On sait très bien qu'au bout du compte il n'y a qu'une dim finale mais puisque c'est le compilo qui fait la translation pour nous...?


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

Marsh Posté le 03-02-2007 à 14:35:55    

Sve@r a écrit :

Est-ce vraiment important de se forcer à travailler en 1 dim si le C nous offre la possibilité de travailler en 2 dim ? On sait très bien qu'au bout du compte il n'y a qu'une dim finale mais puisque c'est le compilo qui fait la translation pour nous...?


La taille étant fixe, on peut très bien définir un tableau à 2 dimensions en 1 seul malloc() (ou calloc). Il suffit d'utiliser le bon type... (tableau de tableau...)

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef int T[10];
  5. void print (T * p, size_t n)
  6. {
  7.    size_t i;
  8.    for (i = 0; i < n; i++)
  9.    {
  10.       size_t j;
  11.       for (j = 0; j < n; j++)
  12.       {
  13.          printf ("%3d", p[i][j]);
  14.       }
  15.       printf ("\n" );
  16.    }
  17.       printf ("\n" );
  18. }
  19. int main (void)
  20. {
  21.    T *p = NULL;
  22.    size_t n = sizeof *p / sizeof **p;
  23.    p = calloc (sizeof *p, n);
  24.    if (p != NULL)
  25.    {
  26.       print (p, n);
  27.       memset (p, -1, sizeof *p * n);
  28.       print (p, n);
  29.    }
  30.    return 0;
  31. }


Je ne suis pas sûr que ce code soit portable, mais ça donne l'idée...


Message édité par Emmanuel Delahaye le 03-02-2007 à 14:53:02

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

Marsh Posté le 04-02-2007 à 11:54:06    

Sve@r a écrit :

Est-ce vraiment important de se forcer à travailler en 1 dim si le C nous offre la possibilité de travailler en 2 dim ? On sait très bien qu'au bout du compte il n'y a qu'une dim finale mais puisque c'est le compilo qui fait la translation pour nous...?


En terme de localité de référence, j'ai eu l'occasion de comparer et la différence est très visible.
 
Et le code d'Emmanuel est crucial. Imagine une vecteur de 10000 {x, y z}. Si tu alloues 10000 pointeurs puis 10000 * 12aine d'octets, tu fais un massacre.  En localité de référence et parce que dans un cas, l'adressage est direct et dans l'autre non.
 
Enfin c'est juste de l'expérience. Et le code d'Emmanuel est plus simple je trouve toutes façons quand on connaît une dimension.

Reply

Marsh Posté le 04-02-2007 à 12:53:36    

Taz a écrit :

...et parce que dans un cas, l'adressage est direct et dans l'autre non.


C'est vrai que si l'ensemble est contiguë ça doit être plus rapide que si l'ensemble à la forme d'un plat de nouilles...


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

Marsh Posté le 04-02-2007 à 12:53:36   

Reply

Marsh Posté le 04-02-2007 à 13:54:40    

Sve@r a écrit :

C'est vrai que si l'ensemble est contiguë ça doit être plus rapide que si l'ensemble à la forme d'un plat de nouilles...


Pas sûr...
 


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

Marsh Posté le 04-02-2007 à 22:35:24    

Reply

Marsh Posté le 04-02-2007 à 23:54:20    

Trap D a écrit :

Developpe ...


Il faut faire des mesures, mais entre indirections et calculs d'adresses, je ne sais pas quel est le pire....
 


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

Marsh Posté le 05-02-2007 à 08:33:45    

Ca dépend fortement des architectures.

Reply

Marsh Posté le 05-02-2007 à 09:04:14    

Euh dans un cas, c'est un calcul d'adresse et une indirection et dans l'autre c'est juste un calcul d'adresse.
 
Mais en cache trashing, y a pas photo. Et en consommation mémoire aussi.

Reply

Sujets relatifs:

Leave a Replay

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