Forum Programmation.c Pointeurs et gestion mémoire

Posté par  (site web personnel) .
Étiquettes :
0
8
jan.
2007
Bonjour à tous,
j'ai écris un code en fortran 90 et j'ai récemment décidé de lui ajouter une belle
interface gtk. Rien de plus simple pourrait on dire ... au détail près qu'il faut que je
'traduise' mon code fortran en C. Connaissant le langage C je ne m'inquiète pas
trop pour autant .. toute fois une question me démange:
Dans mon code en fortran j'alloue la mémoire dynamiquement de façon casi-systématique.
Ceci est très facile en fortran y compris pour les tableaux de dimensions multiples.
Je sais bien comment gérer mon déplacement dans
des tableaux à dimension multiples en fortran et/ou en C.
Par exemple pour un tableau déclaré de façon générique en C:
int TAB[100][100][100];
for (i=0;i<100;i++){
for (j=0;j<100;j++){
for (k=0;j<100;k++){
TAB[i][j][k]=1;
}
}
}

Toutefois j'ai observé que l'allocation dynamique de tableaux à dimension multiples en C
était un chouilla plus complexe que celle du fortran et en particulier consiste en une allocation successive de tableau de pointeurs:
int ***TAB;
CALLOC(TAB, int**, 100);
for (i=0; i<100; i++){
CALLOC(TAB[i],int*,100);
for (j=0; j<100; j++){
CALLOC(TAB[i][j],int,100);
}
}
(Je passe sur la définition de la macro CALLOC)

... ma question est la suivante l'allocation de mémoire ce fait elle comme dans le premier cas ?
c'est à dire dans des zones contigues, auquel cas puis-je donc me déplacer dans le tableau comme dans mon premier exemple ?
ou bien y a t'il une subtilité dans ce cas précis .. dans mon code je manipule de très gros tableaux un mauvaise manipulation
sur ces tableaux pourrait avoir un effet conséquent sur le temps de calcul.

Merci de votre aide
  • # Tu peut jouer avec la version rapide

    Posté par  . Évalué à 2.

    A tester cependant

    int ***TAB;

    TAB = (int ***) malloc (100 * 100 * 100 * sizeof(int));

    Ce dont je ne souviens plus, c'est si les données sont rangées horizontalement :

    TAB[0][0][0] || TAB[0][0][1] || TAB[0][0][2] ||

    ou verticalement :

    TAB[0][0][0] || TAB[1][0][0] || TAB[2][0][0] ||
    • [^] # Re: Tu peut jouer avec la version rapide

      Posté par  . Évalué à 3.

      Je m'auto-complète après vérification


      #define MAX_X 100
      #define MAX_Y 100
      #define MAX_Z 100

      int *TAB;
      int x, y, z;
      int a;

      TAB = (int *) malloc (100 * 100 * 100 * sizeof(int));

      a = TAB[x*(MAX_X*MAX_X) + y*MAX_Y + z]; // Equivalent à : a=TAB[x][y][z]


      Bien sûr le mieux c'est de créer des fonctions (ou macros) pour gérer ça
  • # pilib : binding Gtk/Fortran

    Posté par  . Évalué à 2.

    Un binding Gtk en Fortran est en cours de réalisation.
    http://sourceforge.net/projects/pilib
    http://pilib.beta-centauri.de/

    Avec une documentation en français:
    http://pilib.beta-centauri.de/index.php?title=French_Documen(...)

    Mais, car il y a toujours un "mais", ce projet n'est qu'au stade alpha, ce n'est peut-être donc pas assez stable/robuste pour ce que tu as à faire.

    Je ne développe pas en Fortran, donc je ne saurais te dire.
  • # Appeller le fortran depuis le C?

    Posté par  . Évalué à 5.

    Ne serait-il pas plus simple d'écrire ton interface en C et d'apeler tes fonctions fortran depuis le C...

    Je ne connais pas du tout le fortran et je n'ai aucune idée sur la faisabilité de la chose. Mais je pense que cette piste vaut le coup d'etre creusée. Cette solution permet de garder un code stable et validé tel quel sans devoir passer par la case écriture, déboguage, déboguage mémoire....

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.