Pb : tableau[ ][ ] de taille non déclaré dans une fonction

Pb : tableau[ ][ ] de taille non déclaré dans une fonction - C++ - Programmation

Marsh Posté le 12-08-2004 à 01:11:55    

en fait g deja demandé ca, mais on ma répondu d'utiliser les pointeurs :
je cherche a faire ca :
 
int a[4][5]={...etc...}
int fonction(a){}
 
et je veux ne pas a avoir a donné la taille du tableau dans la fonction... car il faut toujours donner genre a[][56] et je veux que ca marche avec un tableau de n importe quel grandeur pas forcement 5... et surcharger la fonction c'est un peu con ...  
en fait mon but est de simplement remplir un tableau existant (vide et faisant parti des données membres d'une classe) par un remplis...  
 
mici

Reply

Marsh Posté le 12-08-2004 à 01:11:55   

Reply

Marsh Posté le 12-08-2004 à 02:02:24    

bon alors en fait g la classe:
class Matrice{
 private:
  int nc,nl;
  int num[MAXMATRICE][MAXMATRICE];
  int den[MAXMATRICE][MAXMATRICE];
};
 
et je veux une fonction membre qui permette de mettre le tableau a[2][3] ou b[6][7] dans num (l'array donnée membre) ... comment on fait???
parce que la fonction est du genre :
void Matrice::aa(int a[][]){
    num=aa;
}
mais ce #°§¢¬# d'argument de la fonction aa doit avoir sa deuxieme partie donc le [x] de a[][x] définit constant ...

Reply

Marsh Posté le 12-08-2004 à 02:11:17    

Waouh g trouvé un truc vraiment tout con pour que ca marche, utilisé un tableau a une seule dimension ;-( pourquoi n'y est je pas pensé avant ...

Reply

Marsh Posté le 12-08-2004 à 07:43:27    

Le passage d'un tableau C par copie n'existe pas. Un passage par pointeur est plus approprié -> (int* a).
 
Tu t'embetes bcp, un simple std::vector fera l'affaire. Il existe une classe matrice dans boost:: d'ailleurs.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 12-08-2004 à 08:14:18    

xterminhate a écrit :

Le passage d'un tableau C par copie n'existe pas. Un passage par pointeur est plus approprié -> (int* a).

par référence ça marche très bien

Reply

Marsh Posté le 12-08-2004 à 12:28:13    

euh pour la classe deja toute fait ca me dit rien parce que mon but c justement de faire la classe compléte!!!!
mais sinon par pointeur je n'arrive pas a comprendre comment ca marche avec un tableau a 2 dimensions ... si c t possible de me donner un ptit exemple!!!!

Reply

Marsh Posté le 13-08-2004 à 16:18:29    

Ben ton pointeur est le début de ton tableau !
si tu as
int tab[4][4];
 
et une fonction
void ProcessTab( int* pTab );
 
tu appelles ProcessTab( tab );
c'est tout
 
et dans ta fonction, tu parcours le tableau à la main...
par example
for ( in i = 0 ; i < 4 ; i++ )
{
  for ( int j = 0 ; j < 4 ; j++ )
    tab+i*4+j te donne ton élément du tableau
}

Reply

Marsh Posté le 13-08-2004 à 16:26:55    

et void ProcessTab( int (*pTab)[4] ); ?


Message édité par cris56 le 13-08-2004 à 16:27:25
Reply

Marsh Posté le 13-08-2004 à 17:16:55    

void P..T..(int* pTab) est correct.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-08-2004 à 17:44:37    

oui mais  avec  
 
void ProcessTab( int (*pTab)[4] );  
(ou void ProcessTab( int pTab[][4] );  
 
tu peux indexer le tableau en 2d

Reply

Marsh Posté le 13-08-2004 à 17:44:37   

Reply

Marsh Posté le 13-08-2004 à 17:45:32    

c'est mieux les référence :o

Reply

Marsh Posté le 13-08-2004 à 17:47:42    

desolé, je sais jamais si on parle de c ou c++

Reply

Marsh Posté le 13-08-2004 à 17:57:53    

C++

Reply

Marsh Posté le 13-08-2004 à 19:29:56    

Ok. Par défaut, void F..T..( int p[][4] ) est plus simple.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-08-2004 à 19:31:40    

tu vois une différence ?

Reply

Marsh Posté le 13-08-2004 à 19:43:23    

A l'utilisation, c'est qd même plus pratique.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-08-2004 à 19:53:01    

c'est quoi la différence ?

Reply

Marsh Posté le 13-08-2004 à 19:55:43    

Quelle différence, entre quoi et quoi ?


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-08-2004 à 19:58:26    

Bon, et si tu nous proposais ta solution Taz ? ;)

Reply

Marsh Posté le 13-08-2004 à 20:06:21    

Taz a écrit :

c'est mieux les référence :o

Reply

Marsh Posté le 13-08-2004 à 20:08:20    

c'est pas un passage par référence, ce que j'ai filé en dernier ? On m'aurait menti ! J'aurais dit aucune différence...


Message édité par xterminhate le 13-08-2004 à 20:11:03

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-08-2004 à 22:22:25    

xterminhate a écrit :

c'est pas un passage par référence, ce que j'ai filé en dernier ? On m'aurait menti ! J'aurais dit aucune différence...


 

Citation :

void ProcessTab( int (*pTab)[4] );  
(ou void ProcessTab( int pTab[][4] );  
 


 
pointeur...


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-08-2004 à 23:26:34    

Une chose est sure, je me melange les pinceaux... j'aurais mieux fait de me taire :/ Le passage par référence d'un tableau s'ecrit comment alors ?


Message édité par xterminhate le 13-08-2004 à 23:27:11

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-08-2004 à 23:41:33    

comme ca ?
 

Code :
  1. typedef double matrix_4x4 [4][4];
  2. void set_identity( matrix_4x4& m );

Reply

Marsh Posté le 14-08-2004 à 01:14:53    

Sans doute, je n'ai pas trouvé d'ecriture sans le typedef.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 14-08-2004 à 03:20:03    

ouai en fait comme on doit utiliser le  
tab+i*4+j  
ben c comme si on avé un tableau a une dimension que l on transformé en 2 dimensions, ce que j ai fait, c juste une autre forme mais ca doit avoir de l'interet pour autre chose lol !! merci en tout cas o moins g une autre solution!  

Reply

Marsh Posté le 14-08-2004 à 04:41:57    

void fonction(type (&tab)[dimension]);


Message édité par blackgoddess le 14-08-2004 à 04:45:16

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 14-08-2004 à 09:55:11    

Ok, merci.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 14-08-2004 à 19:12:30    

Code :
  1. #include <cstddef>
  2. template<typename T>
  3. T mean(const T *a, size_t n)
  4. {
  5.   T s = T(0);
  6.   for(size_t i = 0; i < n; ++i)
  7.     s += a[i];
  8.   return s / n;
  9. }
  10. template<typename T>
  11. T mean(const T *a, size_t n, size_t m)
  12. {
  13.   T s = T(0);
  14.   for(size_t i = 0; i < n; ++i)
  15.     s += mean(&a[i *  m], m);
  16.   return s / n;
  17. }
  18. template<typename T, size_t N>
  19. inline T mean(const T (&a)[N])
  20. {
  21.   return mean(&a[0], N);
  22. }
  23. template<typename T, size_t N, size_t M>
  24. inline T mean(const T (&a)[N][M])
  25. {
  26.   return mean(&a[0][0], N, M);
  27. }
  28. #include <iostream>
  29. int main()
  30. {
  31.   double t1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  32.   double t2[][2] = { {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10} };
  33.   std::cout << mean(t1) << '\n'
  34.     << mean(t2) << '\n';
  35. }


 
le mieux c'est encore de fournir toutes les versions. ici le calcul de la moyenne pour un vecteur et une matrice. on a les versions classiques à base de pointeur et les versions template qui permettent une syntaxe d'appel naturel. tout ça dans le but déviter de générer une définition pour chaque (N,) ou (N, M)

Reply

Marsh Posté le 21-08-2004 à 11:27:28    

tvmet et zou .... :sarcastic:


Message édité par Joel F le 21-08-2004 à 11:27:47
Reply

Marsh Posté le 21-08-2004 à 11:30:40    

carrément, mais déjà que la plus part son pas près pour boost ... quoi que tu commences à t'y mettre :p

Reply

Marsh Posté le 21-08-2004 à 11:45:12    

ben je connaissais po avant :p

Reply

Marsh Posté le 25-08-2004 à 02:28:05    

Code :
  1. template<typename T, size_t N, size_t M>
  2.   inline T mean(const T (&a)[N][M])
  3.   {
  4.       return mean(&a[0][0], N, M);
  5.   }


evidement avec ma chance ca marche pas...
bon comment je peux faire tout bétement en ayant une class Fr et une Matrice???

Code :
  1. void Matrice::assignertableau(Fr (&a)[][]){}


ca s'utilise comment???
Merci encore...


---------------
!jb!
Reply

Marsh Posté le 25-08-2004 à 02:56:30    

ARRRGh... lol... ca va faire plus de 4h que je suis bloquer sur ce probleme :cry:  :cry:  :cry:


Message édité par lunarnet76 le 25-08-2004 à 03:00:56

---------------
!jb!
Reply

Marsh Posté le 25-08-2004 à 07:47:28    

en faisant comme je t'ai montré

Reply

Marsh Posté le 25-08-2004 à 17:25:52    

s += mean(&a[i *  m], m);
 
=> tous les compilos implémentent les tableaux a plusieurs dimensions comme ca ?
( case1.1, case1.2, case1.3, case2.1, case2.2, case2.3 )


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 25-08-2004 à 17:55:45    

oui, je ne vois pas comment il pourrait en être autrement. réfléchis y (contiguité mémoire et ordre)

Reply

Marsh Posté le 25-08-2004 à 17:58:17    

En Fortran, c'est le premier indice qui s'incrémente en premier.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 25-08-2004 à 20:48:18    

là n'est pas la question. mais vu les propriétés d'un tableau en C++ il ne pourrait en être autrement

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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