[C] manipulation de matrices binaires

manipulation de matrices binaires [C] - C++ - Programmation

Marsh Posté le 17-11-2002 à 14:48:59    

salut,  
 
je suis a faire un programme utilisant le code de Hamming et pour ce faire, il me faut des matrices binaires. Pour l'instant j'utilise des matrices de char.
 
y a t'il une meilleur solution ?  ( probablement :D)
 
merci


Message édité par Zaib3k le 17-11-2002 à 22:39:39

---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 14:48:59   

Reply

Marsh Posté le 17-11-2002 à 17:27:56    

Si tu mets 8 bits dans un char, non on peut pas faire mieux :D

Reply

Marsh Posté le 17-11-2002 à 17:32:35    

le probleme c que je ne veux qu'un bit par case
 
 :cry:


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 20:24:04    

Zaib3k a écrit a écrit :

le probleme c que je ne veux qu'un bit par case
 
 :cry:  




 
et alors faut le gérer et faire des fonctions set/get


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 20:28:06    

a, je connais pas ces fonctions :/
 
je debute en C .


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 20:30:28    

ben il faut faire de la programmation orientée objet si tu veux t'en sortir


Message édité par Taz@PPC le 17-11-2002 à 20:30:38

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 20:33:25    

arf


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 20:35:43    

de tout evidence tu n'est pas encore pret pour tout ca et en fonction de cet argument, je pense pas que tu manipules plusieurs Mégaoctets de données et qu'un stockage efficace t'es vitale.
 
on en reparlera plus tard. assure toi d'abord de bien manipuler les matrices bidimensionnelles (voire plus) et leurs allocations dynamiques


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 20:41:12    

en fait, tout fonctionne ca stock, ca affiche, c la fete
 
mais mon produit de matrice deconne  :/


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 20:43:51    

donne un bout de code...
 
 
http://www.ltam.lu/Tutoriel_Ansi_C/prg-c72.htm


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 20:43:51   

Reply

Marsh Posté le 17-11-2002 à 20:44:57    

lorsque j'affiche ma matrice, no probleme
 
mais :
 

Code :
  1. matrice mat_produit(matrice A, matrice B)
  2. {
  3.   int i, j, k;
  4.   matrice matp; /* resultat du produit */
  5.   if (A.n != B.p)
  6.     {
  7.       printf("\nErreur : produit de matrices de tailles incompatibles\n" );
  8.       matp.ad = NULL;
  9.       return(matp);
  10.     }
  11.     matp = mat_alloc(A.p,B.n);
  12.     for (i = 0; i < matp.p; i++)
  13.       {
  14.      for (j = 0; j < matp.n; j++)
  15.      {
  16.          for (k = 0; k < A.n; k++)
  17.          matp.ad[i*matp.n+j] ^= A.ad[i*matp.n+k] & B.ad[k*matp.n+j];
  18.      }
  19.       }
  20.     return(matp);
  21. }


 
deconne


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 20:47:14    

merci pour le lien, mais mon ami google me l'avais deja donné  :D


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 20:47:21    

pourquoi un ou exclusif?


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 20:52:35    

parce que c comme ca  [:zaib3k]  
 
plus serieusement, le produit de matrice binaire se calcul comme ca, d'apres mon cours
 
mon cours est peut etre faux :/


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 20:54:53    

ben en math, c'est Rij= Rij + Aik x Bkj
 
c'est donc bien un ou et pas un ou exclusif.
 
mefie toi des opérateurs binaires dans la mesure ou tu ne travaille pas avec des bits


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 20:56:12    

effectivement, je vais refaire ca


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 20:58:18    

Zaib3k a écrit a écrit :

effectivement, je vais refaire ca  




 
et magique ca marche. tout ca pour un simple problème de mise en pratique d'algo... :sarcastic:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:12:10    

soit pas aigri, tlm commence un jour
 
 
 
et non, ca ne marche tjr pas


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 21:12:43    

Zaib3k a écrit a écrit :

soit pas aigri, tlm commence un jour
 
 
 
et non, ca ne marche tjr pas




 
chui po aigir mais  :sarcastic:  
 
ca veut dire quoi "marche po" ?
 
et donnes ton nouveu code?
 
 
mon module de multiplication en C++
 

Code :
  1. Matrix_ad operator*(const Matrix_ad &m, const Matrix_ad &n) throw(invalid_argument)
  2. {
  3.   const unsigned m_cols(m.cols()), n_rows(n.rows());
  4.   if(m_cols!=n_rows) // check dims
  5.     {
  6.       throw(invalid_argument("Matrix_ad:: multiplication, matrices are not compatible" ));
  7.     }
  8.   const unsigned rows(m.rows()), cols(n.cols());
  9.   Matrix_ad res(rows, cols); // result matrix
  10.   bool value;
  11.   for(unsigned i=0, j, k; i<rows; ++i)
  12.     {
  13.       for(j=0; j<cols; ++j)
  14. {  
  15.   value=false;
  16.   for(k=0; k<m_cols; ++k)
  17.     {
  18.       value= value || (m(i, k) && n(k, j));
  19.     }
  20.   res.set(i, j, value);
  21. }
  22.     }
  23.   return res;      
  24. }


 
comme tu vois, ca ressemble enormement.... et ca marche


Message édité par Taz@PPC le 17-11-2002 à 21:15:10

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:13:56    

et bien, mon produit de matrice est tjr faux :/


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 21:17:35    

moi ce qui me choque c'est que tu retournes un truc qui semble interne a ta fonction, a moins que le type matrice soit un pointeur, mais vu que tu accedes aux membres par ".", c'est etrange.

Reply

Marsh Posté le 17-11-2002 à 21:18:55    

lorill a écrit a écrit :

moi ce qui me choque c'est que tu retournes un truc qui semble interne a ta fonction, a moins que le type matrice soit un pointeur, mais vu que tu accedes aux membres par ".", c'est etrange.  




 
euh pourquoi? matrice est une structure, no pb


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:20:04    

oui, matrice est une structure


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 21:22:14    

et retourner une structure qu'on a pas alloué soi-même, ca marche ?

Reply

Marsh Posté le 17-11-2002 à 21:25:23    

taz> j'ai modifié mon code en mettant la meme chose que ton code, et le resultat reste faux, je pense que mon probleme est uniquement due au fait que mes matrices sont binaires mais stockée ds des int.


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 21:25:36    

? heink? c'est une copie qui est renvoyée. je comprends pas encore tout a fait ta question


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:28:20    

Zaib3k a écrit a écrit :

taz> j'ai modifié mon code en mettant la meme chose que ton code, et le resultat reste faux, je pense que mon probleme est uniquement due au fait que mes matrices sont binaires mais stockée ds des int.




 
non, c'est pas ca. prends un exemple et on compare nos resulats
 


------
0 1 1
0 0 1
1 1 1
------
 
  X
 
------
0 1 0
1 0 1
0 1 0
------
 
  =
 
------
1 1 1
0 1 0
1 1 1
------


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:28:22    

excusez moi pour mon charabia :/
 
en fait mon programme doit permettre a l'utilisateur de :
saisir une matrice biniaire
faire un produit de matrice
 
le probleme est que mon produit se fait sur des int et non des bits.
 
la somme 1+1 me donne 2, et ca c pas bon
 
ca fait qq heure que je me prend la tete et j'en peux plus


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 21:30:08    

Taz@PPC a écrit a écrit :

 
 
non, c'est pas ca. prends un exemple et on compare nos resulats
 


------
0 1 1
0 0 1
1 1 1
------
 
  X
 
------
0 1 0
1 0 1
0 1 0
------
 
  =
 
------
1 1 1
0 1 0
1 1 1
------






 
mon prog multiplie des matrice 1*n avec des matrice n*n
 
et le modifié a cette heure me semble risqué  :whistle:


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 21:30:39    

Zaib3k a écrit a écrit :

excusez moi pour mon charabia :/
 
en fait mon programme doit permettre a l'utilisateur de :
saisir une matrice biniaire
faire un produit de matrice
 
le probleme est que mon produit se fait sur des int et non des bits.
 
la somme 1+1 me donne 2, et ca c pas bon
 
ca fait qq heure que je me prend la tete et j'en peux plus




 
et alors?
 
t'as la reponse dans ta question, on fait du binaire et pas du decimale.
 
1 | 1 == 1


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:31:46    

------
0 1 1
------
  X
------
0 0 1
1 1 1
0 1 0
------
  =
------
1 1 1
------


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:31:49    

Taz@PPC a écrit a écrit :

? heink? c'est une copie qui est renvoyée. je comprends pas encore tout a fait ta question




en fait y'a pas de question, je viens de dire une connerie plus grosse que moi, c'est tout  [:sinclaire]

Reply

Marsh Posté le 17-11-2002 à 21:34:07    

Taz@PPC a écrit a écrit :

------
0 1 1
------
  X
------
0 0 1
1 1 1
0 1 0
------
  =
------
1 1 1
------






 
la ca marche
 
mais je ne sais pas ce que j'ai changé :/
 
je refais un test avec mes ancienne valeur de test


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 21:34:37    

lorill a écrit a écrit :

 
en fait y'a pas de question, je viens de dire une connerie plus grosse que moi, c'est tout  [:sinclaire]  




 
je crois qu'en fait t'as question est:
 

Code :
  1. void* foo()
  2. {
  3.   return malloc(MAGIC_NUMBER);
  4. }


 
est ce valide? est ce que la zone allouée dans foo() est conservée.
 
la reponse est oui: les allocations dynamiques se font dans le tas et non pas dans la pile. il n'y a aucun problème a renvoyé un pointeur sur une zone allouée, c'est d'ailleurs ce que fait malloc. elle alloue et renvoie un pointeur. pas de problème.


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:36:31    

taz>  tu peu me dire ce que tu obtient en faisant :
 
1011  
 
*
 
111
101
110
011
 
merci


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 21:37:15    

Taz@PPC a écrit a écrit :

 
 
je crois qu'en fait t'as question est:
 

Code :
  1. void* foo()
  2. {
  3.   return malloc(MAGIC_NUMBER);
  4. }


 
est ce valide? est ce que la zone allouée dans foo() est conservée.
 
la reponse est oui: les allocations dynamiques se font dans le tas et non pas dans la pile. il n'y a aucun problème a renvoyé un pointeur sur une zone allouée, c'est d'ailleurs ce que fait malloc. elle alloue et renvoie un pointeur. pas de problème.




nan, ca je le sais, mais justement dans son programme y'a pas d'allocation, et il renvoit pas de pointeur. J'avais juste oublié que y'avait une copie au return.

Reply

Marsh Posté le 17-11-2002 à 21:38:48    

[1 1 1]


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:40:10    

Taz@PPC a écrit a écrit :

[1 1 1]




 
merci
moi aussi, j'obtient ca mais mon cours me donne 010
 
je vais verifier ca. deja je n'ai plus de 75 -1857 698  :D


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 17-11-2002 à 21:42:04    

sache que les operateurs bit a bit sont dangereux et indefinies sur les types signés.
 
si tu strocke dans un type entier, precise "unsigned" meme pour un char


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 21:44:51    

ok, je vais ajouter ca, par contre ds mon cours, sur le cours de mes potes, c'est bien un XOR et je ne sais pas pourquoi


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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