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

  FORUM HardWare.fr
  Programmation
  C

  utilisation des pointeurs pour des matrices 2*2

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

utilisation des pointeurs pour des matrices 2*2

n°906332
GROFRED
Posté le 24-11-2004 à 10:10:13  profilanswer
 

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

mood
Publicité
Posté le 24-11-2004 à 10:10:13  profilanswer
 

n°906374
Fishes
Posté le 24-11-2004 à 11:03:23  profilanswer
 

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 :)

n°906376
Joel F
Real men use unique_ptr
Posté le 24-11-2004 à 11:03:34  profilanswer
 

..... 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*

n°906468
el muchach​o
Comfortably Numb
Posté le 24-11-2004 à 12:38:07  profilanswer
 

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.

n°907038
GuiYom_00
Posté le 24-11-2004 à 21:07:34  profilanswer
 

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
n°907242
darkoli
Le Petit Dinosaure Bleu
Posté le 24-11-2004 à 23:51:30  profilanswer
 

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
n°907507
GROFRED
Posté le 25-11-2004 à 11:10:40  profilanswer
 

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?  

n°907510
Joel F
Real men use unique_ptr
Posté le 25-11-2004 à 11:15:29  profilanswer
 

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

n°907517
cris56
Posté le 25-11-2004 à 11:22:47  profilanswer
 

et maintenant tu les liberes comment tes pointeurs ?


Message édité par cris56 le 25-11-2004 à 11:23:12
n°907520
GROFRED
Posté le 25-11-2004 à 11:26:15  profilanswer
 

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"
 
?

mood
Publicité
Posté le 25-11-2004 à 11:26:15  profilanswer
 

n°907521
GROFRED
Posté le 25-11-2004 à 11:28:45  profilanswer
 

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

n°907526
Lam's
Profil: bas.
Posté le 25-11-2004 à 11:31:01  profilanswer
 

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
n°907530
cris56
Posté le 25-11-2004 à 11:34:23  profilanswer
 

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 []

n°907533
cris56
Posté le 25-11-2004 à 11:38:13  profilanswer
 

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

n°907572
GROFRED
Posté le 25-11-2004 à 12:28:00  profilanswer
 

Merci pour toutes vos réponses

n°911308
Joel F
Real men use unique_ptr
Posté le 30-11-2004 à 15:45:06  profilanswer
 

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]


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

  utilisation des pointeurs pour des matrices 2*2

 

Sujets relatifs
Utilisation du TDBChart avec builder?utilisation et composants
[JSP] Utilisation de classes personnellesUtilisation de la librairie standard du C++ aevc pgf90
J'ai du mal avec les struct et les pointeurs ensemble !Petit probleme de pointeurs sur des tableaux d'une structure
[C]Pointeursutilisation fonction perso sous excel
Templates et pointeurs de fonctions membres?Utilisation des composants Indy 9 sous C++ Builder
Plus de sujets relatifs à : utilisation des pointeurs pour des matrices 2*2


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR