matrices en C

matrices en C - C - Programmation

Marsh Posté le 23-06-2004 à 18:06:36    

Bonsoir à tous !
 
Voilà, je sors d'une période de prog prolongée sous Fortran, et là, la gestions des tableaux est vraiment nickel (les fichiers bcp moins mais bon ... :pt1cable: ). Par contre, en C, ça me semble beaucoup plus bizarre, notamment pour les allocations dynamiques ...  :heink:  enfin bref, j'aimerais savoir s'il est possible de déterminer les dimensions d'un argument qui serait une matrice (pour les vecteurs, j'ai honte, mais j'ai rien trouvé de mieux que sizeof(vecteur)/sizeof(type de donnée dedans) ), un truc du genre size  :love:  
 
Ah oui, est-il possible d'avoir plusieurs arguments de sortie pour une fonction C ??? Et si ce n'est pas le cas, comment peut on faire pour renvoyer plus d'une variable ?

Reply

Marsh Posté le 23-06-2004 à 18:06:36   

Reply

Marsh Posté le 23-06-2004 à 18:08:42    

sizeof va marcher comme tu le pense avec les tableaux
avec tout ce qui est pointeur, garde dans des varaibles les dimensions
 
on te peut renvoyer qu'une seule variable, mais ça peut être une structure. ou passer des paramètres par pointeur

Reply

Marsh Posté le 23-06-2004 à 18:09:11    

pour retourner plus d'une variable, tu la passes par un pointeur...
 
style
 
void ftest( float a, float b, float *v1, float *v2 )
{
   *v1=a+b;
   *v2=a-b;
}
 
fonc1()
{
  float add,sub;
 
  ftest( 10, 2, &add, &sub );
}

Reply

Marsh Posté le 23-06-2004 à 18:11:47    

Ca veut dire que je devrais par exemple faire un truc du genre :
 
typedef struct matrice {
int[2] taille;
**double data;
} Matrice
 
pour avoir accès aux tailles ???

Reply

Marsh Posté le 23-06-2004 à 18:16:32    

oui, et plustôt:
 
double *data;  
 

Reply

Marsh Posté le 23-06-2004 à 18:17:53    

oups, j'avais pô vu ... :D

Reply

Marsh Posté le 23-06-2004 à 18:21:28    

et un * pas deux, sinon c'est un pointeur sur une liste de pointeurs que tu déclares...

Reply

Marsh Posté le 23-06-2004 à 18:27:02    

ah, bizarre, pour un tableau, j'aurais fait double **data :
comme ça pour chaque ligne, j'aurais eu un type double* associé, que j'aurais fait pointer au début de chaque ligne
 
data=calloc(ni,sizeof(float*));
tab[0]=calloc(ni*nj,sizeof(float));
for(int i=1;i<ni;++i) data[i]=tab[i-1]+nj;
 
C'est pas de moi, on me l'a filé, mais je trouvais ça joli

Reply

Marsh Posté le 23-06-2004 à 18:46:52    

pourquoi tu utilises calloc ? et surtout avec des flottants...

Reply

Marsh Posté le 23-06-2004 à 18:59:11    

les float, c'est parce que c'est du copier-coller  :whistle:  
par contre, pour calloc, je ne suis pas sûr de comprendre la question (pourquoi calloc plutôt que malloc c'est ça ?). Moi j'aime bien calloc, vu qu'il met tous les coeffs à zéros dedans. Comme je bosse sur de grosses matrices bien creuses, ça évite de se fatiguer  :love:

Reply

Marsh Posté le 23-06-2004 à 18:59:11   

Reply

Marsh Posté le 23-06-2004 à 18:59:56    

En tout cas, je commence à me demander si le C est fait pour les matheux :(

Reply

Marsh Posté le 23-06-2004 à 19:01:24    

calloc mets à 0, certes, mais 0 binaire, pas 0.0. et 0 binaire n'est pas flottant valide

Reply

Marsh Posté le 23-06-2004 à 19:13:21    

bibi218 a écrit :

En tout cas, je commence à me demander si le C est fait pour les matheux :(


 
non, c'est plus adapté pour les développements oû il faut bien prendre en compte les contraintes architecturelles....  
du moins tu as trop de contrôle sur l'implémentation de tes algo, si tu cherches plus à avoir un truc math qui marche direct. (ie c'est pas maple)


Message édité par bjone le 23-06-2004 à 19:13:35
Reply

Marsh Posté le 23-06-2004 à 19:14:31    

ceci dit, tu prends du C++ avec des classes déjà existantes, ça te simplifiera énormément la vie si tu commences en C, et qu'il te faut un truc abouti rapidement.

Reply

Marsh Posté le 23-06-2004 à 19:17:18    

mais y a plein de trucs qui existe pour le C aussi
 
 
mais pourquoi changer du fortran si tu ne sais te servir que de ça ?

Reply

Marsh Posté le 23-06-2004 à 19:19:08    

Disons que ce qu'il nous faut à nous autres, c'est surtout de quoi mouliner les calculs à vitesse grand V. Maple a beau être très bien (Matlab est pas mal non plus), ça rame sec dès qu'on rentre dans de gros problèmes ...
Fortran se comporte plus qu'honorablement (enfin je trouve) ... mais je ne sais pas ce qu'il en est vraiment du C. J'ai entendu dire que quand c'était bien fait, ça allait plus vite, mais ma faible expérience ne me permet pas de juger là dessus :)

Reply

Marsh Posté le 23-06-2004 à 19:20:28    

vu comment vous programmez comme des pieds, c'est pas la peine de faire du C. maitrise fortran, comprends bien ce que chaque écriture implique, et voilà, ça sera déjà beaucoup

Reply

Marsh Posté le 23-06-2004 à 19:20:56    

et assurez vous d'avoir un compilo récent, celui d'intel pour f90 est très puissant par exemple

Reply

Marsh Posté le 23-06-2004 à 19:26:24    

Je veux bien qu'on programme comme des pieds, après tout, c'est pas notre formation première non plus  :ange:  
Au moins ça donne du boulot aux informaticiens et ça fait vendre des bouquins  :lol:
Histoire de vous faire peur, ils essaient de nous apprendre la prog parallèle en ce moment  :D (heu ... oui, en C ...)

Reply

Marsh Posté le 23-06-2004 à 19:34:41    

1) maitrise ton compilateur pour être sur d'en tirer le maximum
2) maitrise fortran pour les memes raisons
3) assure toi que ton programme est ok : tu fais le malin avec ton algo en n log(n) seulement une fois implémenté, ton programme il est en n² log(n) ... crois moi, je suis sur que tu en as plein des trucs comme ça.
4) c'est bien le comble tiens que vous connaissiez pas la programmmation paralèle, y a des putains de théories matheuses la dessus, nous on a rien inventer. et la prog // ça se fait sans problème en fortran

Reply

Marsh Posté le 23-06-2004 à 19:36:02    

+1 pour le compilo Intel cité par Taz.
 
le compilo Fortran d'Intel bénéficie certainement des mêmes techniques d'optimisation que le compilo C/C++.
 
il vaut mieux écrire du Fortran propre, que le compilo pourra déjà optimiser un peu, que du C mal maitrisé qui donnera un truc ultra-dégueulasse et instable....

Reply

Marsh Posté le 23-06-2004 à 19:54:41    

Tiens, tant que j'y suis, ça me fait penser à quelque chose. J'ai vu que Matlab et Maple intégraient de la génération de code. Vous en pensez quoi personnellement ? Je me doute que c'est largement moins bien qu'un code bien fait (d'ailleurs, les fichiers générés par Matlab sont illisibles ... on reconnait que dalle), mais est-ce que ça vaut le coup côté perfs de passer de l'interprété à du compilé pas beau ??? loll

Reply

Marsh Posté le 23-06-2004 à 20:08:33    

C/C++ cai le mal :jap:

Reply

Marsh Posté le 23-06-2004 à 20:26:58    

:D

Reply

Marsh Posté le 23-06-2004 à 22:29:31    

en C++, y a des moyens simples et efficaces de générer du code matriciel aussi efficace que du C (Blitz++,POOMA,TVMET, EVE)


Message édité par Joel F le 23-06-2004 à 22:29:43
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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