Ce forum est maintenant fermé, seule cette archive statique reste consultable.
  FORUM Matbe.com
  OS, Software, Réseaux
  Programmation

  Aide formalisme : Alloc Dynamique + Tableau + Fonction

Bas de page
Auteur Sujet :

Aide formalisme : Alloc Dynamique + Tableau + Fonction

n°73017
fredo490
Mais pourquoi donc ?
Posté le 10-06-2011 à 10:27:53  
 

Bonjour, j'ai un petit soucis de formalisme. Ca fait quelques années que j'ai plus touché à du C  :sweat:

 

En gros, j'ai un fichier du genre contenant deux colonnes de données. Exemple :

Citation :

0.0   1.0
0.2   1.2
0.4   1.1
0.6   1.3

 

Je souhaite faire un code pour une UDF (user defined function) sous Fluent qui puisse lire ce type de fichier. Je veux donc un tableau dont le nombre de ligne est variable (fonction de la taille du fichier) et ayant deux colonnes.

 

J'ai donc :
- un main qui va créer un tableau par allocation dynamique, exécuter une fonction "size" pour avoir le nombre de ligne, puis une fonction "ReadFile" qui va mettre les données du fichier dans le tableau.
- une fonction qui compte le nombre de ligne (non représenté ici)
- une fonction qui met les données du fichier dans mon tableau

 

Actuellement, j'ai ce genre de formalisme mais le compilateur ne semble pas apprécier.

 
Code :
  1. void ReadFile(double *data)
  2. {
  3.     FILE* file = NULL;
  4.     file = fopen("monfichier.txt", "r" );
  5.     if (file != NULL)
  6.     {
  7.         while (fscanf(file, "%f %f", *data[i][0], *data[i][1]) != EOF)
  8.         {
  9.            (affichage dans la console fluent);
  10.         }
  11.         fclose(file);
  12.     }
  13. }
  14. int main(int argc, char *argv[])
  15. {
  16.     int size = 10 ; // Nombre de ligne du fichier (donné par une fonction)
  17.     double *data = NULL ;
  18.     data = malloc(size * 2 * sizeof(double));
  19.     ReadFile(&data) ;
  20.    
  21.     (Je fais un traitement)
  22.    
  23.     free(data);
  24.     return 0;
  25. }
 

Est-ce que vous pouvez m'aider à corriger tout ça ?
Merci d'avance
(le code n'est pas complet et je cherche juste le formalisme du genre "*" ou "&" au bons endroits).


Message édité par fredo490 le 10-06-2011 à 10:30:32

---------------
Ha oui, c'est ici qu'on écrit notre signature.
mood
Pub
Posté le 10-06-2011 à 10:27:53  
 

n°73018
Ashe
reenignE esreveR
Posté le 10-06-2011 à 10:45:48  
 

C'est un peu dommage de lire le fichier 2x pour avoir le nombre de lignes :p
sinon faut pas de & a la ligne 22
et le fscanf pourrait pas fonctionner comme ca, c'est pas un tableau a 2 dimensions


---------------
pcx360 | Binary Genetics | Dreaming Prophet
“Entropy isn’t what it used to be.”
n°73019
Ashe
reenignE esreveR
Posté le 10-06-2011 à 10:47:18  
 

Code :
  1. void ReadFile(double (*data)[2])
  2. {
  3.     FILE* file = NULL;
  4.     file = fopen("monfichier.txt", "r" );
  5.     if (file != NULL)
  6.     {
  7.         while (fscanf(file, "%f %f", &data[i][0], &data[i][1]) == 2)
  8.         {
  9.            (affichage dans la console fluent);
  10.         }
  11.         fclose(file);
  12.     }
  13. }
  14. int main(int argc, char *argv[])
  15. {
  16.     int size = 10 ; // Nombre de ligne du fichier (donné par une fonction)
  17.     double (*data)[2] = NULL ;
  18.     data = malloc(sizeof * data * size);
  19.     ReadFile(data);
  20.     (Je fais un traitement)
  21.    
  22.     free(data);
  23.     return 0;
  24. }


edit: un ++i qq part dans cte boucle pourrait servir :p


Message édité par Ashe le 10-06-2011 à 10:48:31

---------------
pcx360 | Binary Genetics | Dreaming Prophet
“Entropy isn’t what it used to be.”
n°73020
fredo490
Mais pourquoi donc ?
Posté le 10-06-2011 à 10:50:04  
 

Je ne vois pas trop comment lire une seule fois le fichier. Car il faut bien avoir le nombre de ligne avant de déclarer le tableau ? Et si je fais tout dans une fonction, le tableau sera supprimé à la fermeture de la fonction (?!).
 
Tu veux dire qu'il n'est pas possible de créer un tableau de 2 dimensions en allocation dynamique ?

 
J'ai rien dis  :ange:  
Je vais étudier ton code, merci


Message édité par fredo490 le 10-06-2011 à 10:51:02

---------------
Ha oui, c'est ici qu'on écrit notre signature.
n°73021
Ashe
reenignE esreveR
Posté le 10-06-2011 à 10:55:45  
 

Tu pourrais le lire une seule fois en faisant un bon gros fread d'un coup (fseek/ftell pour connaitre la taille), ensuite suffit de parcourir le char[] qui contient le fichier
edit: genre

Code :
  1. FILE * fp = fopen( .. );
  2. size_t n;
  3. size_t lines = 0;
  4. fseek(fp,0,SEEK_END);
  5. n = ftell(fp);
  6. fseek(fp,0,SEEK_SET);
  7. char * buff = malloc(n);
  8. fread( buff, 1, n, fp );
  9. for (char * p = buff; p; p = strchr(++p,'\n'))
  10.   ++lines;
  11. malloc ici
  12. for (char * p = buff; p; p = strchr(++p,'\n'));
  13.     sscanf sur p


Message édité par Ashe le 10-06-2011 à 11:00:25

---------------
pcx360 | Binary Genetics | Dreaming Prophet
“Entropy isn’t what it used to be.”
n°73023
fredo490
Mais pourquoi donc ?
Posté le 10-06-2011 à 11:56:04  
 

Super, merci beaucoup ! Mon UDF marche au poil  :D


Message édité par fredo490 le 10-06-2011 à 11:56:15

---------------
Ha oui, c'est ici qu'on écrit notre signature.
  FORUM Matbe.com
  OS, Software, Réseaux
  Programmation

  Aide formalisme : Alloc Dynamique + Tableau + Fonction