utilisation des pointeurs pour des matrices 2*2

utilisation des pointeurs pour des matrices 2*2 - C - Programmation

Marsh Posté le 24-11-2004 à 10:10:13    

Bonjour,
 
pour faire du calcul matriciel il semble naturel d'utiliser des tableaux. Toutefois, un tableau de dimension n voit ses indices appartenir à l'ensemble {0,...,n-1}. Pour le calcul matriciel, il n'est pas commode d'utiliser cette notation en général si on parle d'un élément on utilise M[1][1] pour désigner le premier élément d'une matrice 2*2 et non M[0][0]. Dans le bouquin numerical recipes in C, les auteurs proposent d'utiliser un pointeur et donne l'exemple d'un vecteur à une dimension:
 
double TAB[10], *POINTEUR;
POINTEUR=TAB-1;
 
dans ce cas *POINTEUR[1] désigne la valeur TAB[0]. Je ne vois pas comment faire pour faire la même chose en 2 dimensions...

Reply

Marsh Posté le 24-11-2004 à 10:10:13   

Reply

Marsh Posté le 24-11-2004 à 11:03:23    

Le problème c'est de remplacer ton tableau par un pointeur ?
 
Dans ce cas, tu peux utiliser ça: *ptr = NumCol+(NbrCol*(NumLigne-1)).
 
Ca marche pour les autres formats de matrice aussi :)

Reply

Marsh Posté le 24-11-2004 à 11:03:34    

..... encapsule ta matrice dans un objet de bon [:aloy] et surcherge l'operateur () pour qu'il gére ca à ta place.
 
*subluminal* utilise TVMET *subluminal*

Reply

Marsh Posté le 24-11-2004 à 12:38:07    

Le code des Numerical Recipes est une adaptation du code Fortran d'origine. Si tu veux utiliser les algos des Numerical Recipes portant sur des tableaux, il faut utiliser leur librairie de matrices dont on doit pouvoir trouver le source sur le site, je suppose.

Reply

Marsh Posté le 24-11-2004 à 21:07:34    

C'est vrai que le code du numerical est basé sur le code Fortran "d'origine" d'ou cette difference de numerotation des tableaux, ( d'ailleur remarque au passage TOUT les algo que j'ai utilisé dans ce livre ne se servent pas des elements [0]) et donc la methode la "plus rapide" pour faire ca semble etre de faire un -1 dans lse algo proposés...
Ou alors faire une allocation de 1 element de plus par dimension pour pouvoir faire commencer les tableaux a 1.
Ensuite faire une modification du style

Code :
  1. double TAB[10], *POINTEUR;
  2. POINTEUR=TAB-1;


Dans un tableau a plusieurs dimensions necessite de connaitre la maniere dont se fait l'allocation donc je pense qu'on petit morceau de code serait le bienvenue :)
 
Sinon concernant la disponibilité du numerical il est disponible gratuitement sous forme electronique pour l'edition en C donc unerecherche sur google et hop voila tout  est dispo ;)
 
Edit : si c "juste" des matrice 2*2 (avais mal lu le titre, je pense que la technique d'allouer des mat 3*3 est la methode la plus simpleet la plus rapide aussi, y a juste a recopier l'algo ds ce cas :)


Message édité par GuiYom_00 le 24-11-2004 à 21:19:37
Reply

Marsh Posté le 24-11-2004 à 23:51:30    

Je vais peut être dire une connerie (je ne connais pas les algorithmes utilisés) !
C'est pas très compliqué de faire "-1" à tous les indices ou de modifier un peu l'algorithme pour que cela fonctionne ? :??:


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 25-11-2004 à 11:10:40    

Effectivement on fait -1 et c'est bon. On peut travailler aussi avec  les tableaux qui commencent à 0 c'est pas la mort non plus. Mais bon pour moi c'était une bonne façon de me familiariser avec les pointeurs que je ne maîtrise pas encore. Je devine le concept de travailler sur les adresses, mais je ne perçoit pas encore l'intérêt de les utiliser pour mes algo de calculs. Dans mes calculs par contre les tableaux sont irremplaçables et super-pratiques. Peut-être pouvez-vous m'éclairer. Si par exemple je définis un gros tableau genre:
 

Code :
  1. double TAB1[10000];


 
Supposons que je souhaite créer un tableau n°2 qui est le double du tableau n°1, moi je fais comme ça:
 

Code :
  1. double TAB2[10000];
  2. int i;
  3. for(i=0;i<10000;i++)
  4. {
  5. TAB2[i]=2*TAB1[i];
  6. }


 
Est-ce que l'utilisation des pointeurs me permettent de faire mieux que ça, d'améliorer quelquechose, le temps de calcul peut-être?  

Reply

Marsh Posté le 25-11-2004 à 11:15:29    

Code :
  1. double* TAB1,*TAB2;
  2. TAB1 = malloc( sizeof(double)*10000 );
  3. TAB2 = malloc( sizeof(double)*10000 );
  4. for(i=0;i<10000;i++)
  5. {
  6.   *TAB2++ = 2* (*TAB1++);
  7. }


 
ca change rien quoi ... mais je te predit bien des soucis avec tes Tab[N] quand N deviendra tres grand ...

Reply

Marsh Posté le 25-11-2004 à 11:22:47    

et maintenant tu les liberes comment tes pointeurs ?


Message édité par cris56 le 25-11-2004 à 11:23:12
Reply

Marsh Posté le 25-11-2004 à 11:26:15    

Wai à cause de l'histoire de la pile et du tas que la pile a une mémoire limitée donc si je mets cette déclaration dans la pile ça va merder et si je mets ça dans le tas non. Est-ce que si je dis ça c'est n'importe quoi:
 
"Les déclarations faites dans le main ont leur allocation mémoire dans la pile et celles qui sont faites avant le main sont des variables globales avec allocation mémoire dans le tas"
 
?

Reply

Marsh Posté le 25-11-2004 à 11:26:15   

Reply

Marsh Posté le 25-11-2004 à 11:28:45    

Heu, d'après ce que j'ai lu, pour libérer le pointeur il faut faire: free(pointeur).

Reply

Marsh Posté le 25-11-2004 à 11:31:01    

GROFRED a écrit :

Wai à cause de l'histoire de la pile et du tas que la pile a une mémoire limitée donc si je mets cette déclaration dans la pile ça va merder et si je mets ça dans le tas non. Est-ce que si je dis ça c'est n'importe quoi:
 
"Les déclarations faites dans le main ont leur allocation mémoire dans la pile et celles qui sont faites avant le main sont des variables globales avec allocation mémoire dans le tas"
 
?


Y a du vrai. On peut généraliser en disant:
les déclarations faites dans une fonction (y compris main()) sont faites dans la pile, sauf si elle sont statiques:
 
int main()
{
 int dansLaPile[300];
 static int dansLeTas[300];
 int * pointeurDansLaPile_MaisMemoireAlloueeDansLeTas = calloc(300, sizeof(int));
}


Message édité par Lam's le 25-11-2004 à 11:31:16
Reply

Marsh Posté le 25-11-2004 à 11:34:23    

GROFRED a écrit :

Heu, d'après ce que j'ai lu, pour libérer le pointeur il faut faire: free(pointeur).


 
oui, mais pas dans l'exemple de Joel F, il faudrais sauvegarder la valeur des pointeurs avant de les incrementer, ou mieux, utiliser l'operateur []

Reply

Marsh Posté le 25-11-2004 à 11:38:13    

Lam's > un variable static ou globale ne serais pas plutot dans le segment de données ?

Reply

Marsh Posté le 25-11-2004 à 12:28:00    

Merci pour toutes vos réponses

Reply

Marsh Posté le 30-11-2004 à 15:45:06    

cris56 a écrit :

oui, mais pas dans l'exemple de Joel F, il faudrais sauvegarder la valeur des pointeurs avant de les incrementer, ou mieux, utiliser l'operateur []


 
Effectivement [:dawa]

Reply

Sujets relatifs:

Leave a Replay

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