IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Conversion d'un code FORTRAN en C


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 59
    Par défaut Conversion d'un code FORTRAN en C
    Bonjour,
    D'abord je suis pas informaticien mais j'utilise les outils informatique dans mon boulot, je travaille normalement sur fortran mais là je dois faire un petit programme sur C et je connais rien dans le monde de C, est ce que ya quelqun qui peut me convertir mon programme fortran en C :

    Code fortran : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    OPEN (UNIT=50,FILE='sourceO.txt') 
        		DO 1001 S=1,280
        		READ (50,*)LTEST, ATEST
    	IF ((L.NE.LTEST).AND.(NUMSPC.EQ.3)) GOTO 1001
    	ATERM = 0.0
    	BTERM = 0.0
    	GOTO 1002
    1001	CONTINUE
    1002	CLOSE(50)

    merci

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Ben déjà si tu nous disait ce qu'il fait ce programme ? On sent bien qu'il y a un truc de lecture de fichier mais c'est pas parce qu'on est bons en C qu'on est forcément bons en Fortran !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Code FORTRAN : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    OPEN (UNIT=50,FILE='sourceO.txt') 
        		DO 1001 S=1,280
        		READ (50,*)LTEST, ATEST
    	IF ((L.NE.LTEST).AND.(NUMSPC.EQ.3)) GOTO 1001
    	ATERM = 0.0
    	BTERM = 0.0
    	GOTO 1002
    1001	CONTINUE
    1002	CLOSE(50)


    Deviendrait (si transformée en procédure) :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <stdlib.h>
    #include <stdio.h>
     
     
    void MaFonction ( int L, int NUMSPC, double *ATERM, double *BTERM )
    {
    FILE *Fichier= NULL ;
    char Ligne[1000] ;
    int i ;
    int LTEST ;
    float ATEST ;
     
    Fichier = fopen ( "sourceO.txt", "r" );
    if ( Fichier != NULL )
      {
           while ( fgets ( Ligne, 999, Fichier) != NULL )
             {
                if ( sscanf ( Ligne,  "%d %g", &LTEST, &ATEST ) == 2 )
                  {
                      if ( ! ((LTEST != L) && (NUMSPC == 3)) )
                        {
                            *ATERM = 0.0 ;
                            *BTERM = 0.0 ;
                            break ;
                        }
                  }
             }
     
           fclose ( Fichier );  
      }

    Fonction qui doit être appelée comme :


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    MaFonction ( L, NUMSPC, &ATERM, &BTERM );


    Par contre :

    a) il est possible d'optimiser le if...
    b) il serait souhaitable de passer le nom du fichier en paramètre...


    du style :


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    MaFonction ( "source0.txt", L, NUMSPC, &ATERM, &BTERM );

    Avec une définition comme :


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void MaFonction ( char *Filename, int L, int NUMSPC, double *ATERM, double *BTERM )
    {
    FILE *Fichier= NULL ;
    char Ligne[1000] ;
    int i ;
    int LTEST ;
    float ATEST ;
     
    Fichier = fopen ( Filename, "r" );
    if ( Fichier != NULL )
    ..

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 59
    Par défaut à Sve@r et autres
    Pour répondre à ta question:
    ce que je voudrais faire dans ce programme c'est d'ouvrir un tableau qui s'appelle "sourceO.txt", ce tableau il contient deux colonnes que j'ai nommé (LTEST: première colonne et ATEST: deuxièmement colonne) et chaque valeur de la deuxieme colonne correspond au maille de la premiere colonne et le but c'est d'injecter chaque valeur de la deuxieme colonne dans le numero de maille de la première colonne voilà j'espere que j'ai bien expliquer le probleme

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stage75 Voir le message
    et le but c'est d'injecter chaque valeur de la deuxieme colonne dans le numero de maille de la première colonne voilà j'espere que j'ai bien expliquer le probleme
    Presque. C'est quoi le séparateur qui sépare la colonne 1 de la colonne 2 ?
    Les nombres sont-ils des entiers ou ont-ils une virgule ?
    C'est quoi un "maille" ??? T'aurais-pu rajouter le début de ton fichier qu'on voit mieux.

    Bon, déjà le code pour ouvrir le fichier et le lire ligne à ligne
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <stdio.h>
    #include <errno.h>
     
    int main()
    {
        FILE *fp;
        char ligne[81];
     
        fp=fopen("sourceO.txt", "r");
        if (fp == NULL)
        {
             perror("Erreur ouverture sourceO.txt");
             exit(1);
        }
     
        while (fgets(ligne, 81, fp) != NULL)
        {
             printf("Ligne lue: %s", ligne);
        }
     
        fclose(fp);
    }

    Bon, j'ai tapé à capella donc peut-être que j'ai oublié un include mais j'espère que tu vois l'idée...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 59
    Par défaut plus d'explication du prob
    Merci Sve@r,

    EN FAIT MON JE SUIS PAS INFORMATICIEN C'EST POUR çA J'EXPLIQUE MAL, MOI J4UTILISE JUSTE LES OUTILS INFORMATIQUE POUR FAIRE DE LA SIMULATION

    1 maille ça vient du maillage par exemple je devise mon domaine de calcul à 200 petit carreau et moi je veux injecter des termes sources que dans des cellules définies, c'est pour ça mon tableau il contient deux colonnes la 1ere colonnes contiens des entiers (1, 2, 3,....100) et en face dans la 2éme colonne j'ai les valeurs de termes sources corresponds à chaque cellule (1E-12, 2E-11,...2.4E-10) et moi ce que je veux c'est de faire un petit programme qui permis de lire ce tableau et de dire a ce programme que la valeur 1E-12 il faut la mettre dans la cellule 1 et la valeur 2E-11 faut la mettre dans la cellule 2....et la valeur 2.4E-10 faut la mettre dans la cellule 100.. voilà, voiçi une partie de mon programme fortran

    Code fortran : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
                                                                       C
    C----------------------------------------------------------------------C
    C
    #include "IMPLICIT.INC"
    C
    #include "SIZE.INC"
    #include "SPECSZ.INC"
    C
    C----------------------------------------------------------------------C
    C     COMMON BLOCKS...                                                 C
    C----------------------------------------------------------------------C
    C
    #include "BOUNDS.INC"
    #include "GRID.INC"
    #include "FLOVEL.INC"
    #include "FLOPRO.INC"
    #include "FLPEXV.INC"
    #include "FLPGEO.INC"
    #include "SPCONS.INC"
    #include "FTURB.INC"
    #include "MPHASE.INC"
    #include "MPPROP.INC"
    #include "MPVOF.INC"
    #include "CSHEAR.INC"
    #include "DNITER.INC"
    #include "TDFLOW.INC"
    #include "USFUNS.INC"
    #include "POLAR.INC"
    #include "GAPS.INC"
    #include "AREAS.INC"
    #include "LOCATE.INC"
    #include "LOCATV.INC"
    #include "LCTYPE.INC"
    #include "LBOUND.INC"
    #include "WSFLOW.INC"
    #include "TDTEMP.INC"
    #include "CHANEL.INC"
    #include "NCHANL.INC"
    C
    C----------------------------------------------------------------------C
    C     ARGUEMENT TYPE DECLARATIONS...                                   C
    C----------------------------------------------------------------------C
    C
          INTEGER IVBLE
          INTEGER IPHASE
          REAL    ATERM
          REAL    BTERM
    C
    C----------------------------------------------------------------------C
    C     LOCAL VARIABLE TYPE DECLARATIONS...                              C
    C----------------------------------------------------------------------C
    C
          INTEGER NUMSPC
          INTEGER NUMVOF
          INTEGER LTEST,S
          REAL  ATEST,A_N
          REAL  A_T,A_T2
          REAL  A_V
     
    SINGLE PHASE FLOW :
    C
     
         	OPEN (UNIT=40,FILE='source.txt') (#source.txt c'est mon fichier tableau#)
     
         		DO 1005 S=1,276  (# S sont le nombre des ligne (de 1 jusqu'a 276#)
         		READ (40,*)B, A_T (# B c'est le nom de la 1ere colonne et A_T c'est le nom de la 2eme colonne#)
     
    	IF (L.NE.B) GOTO 1005  (# L c'est le nom du maille (chaque petite cellule s'appel L #)
     
    	ATERM = A_T*YACOB(L)   (# ATERM represente le parametre terme source#)
     
    	GOTO 1006
     
    1005	CONTINUE

  7. #7
    Membre confirmé Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    Par défaut
    Salut,

    Je passe par hasard, et j'ai deux questions :

    @stage75 (et aussi Sve@r) :
    Le code de souviron34 ne te convient-il pas ? Pourquoi ?

    @tous :
    Avez-vous connaissance de "moulinettes" (certains appellent cela, à tort je pense, "transcompilateur") pour passer d'un langage à un autre comme c'est le cas ici ?

    GWT permet par exemple de transformer du java en javascript. En existe-t-il pour d'autres couples de langages ?

    (seconde question un peu hors sujet, mais quand même en rapport avec ce topic et susceptible d'intéresser stage75... Si je gêne, qu'on me le dise et j'ouvrirai un autre sujet )

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    f2c

    http://www.netlib.org/f2c/


    @stage75 :

    • qu'est l'étiquette 40 (correspondant à READ ( 40, *)) ?
    • Ce serait bien d'avoir un peu plus de code, en particulier le début de la procédure en question...
    • Tes commentaires ne correspondent en rien au code correspondant.. Alors on a de la difficulté à t'aider..

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stage75 Voir le message
    Merci Sve@r,

    EN FAIT MON JE SUIS PAS INFORMATICIEN C'EST POUR çA J'EXPLIQUE MAL, MOI J4UTILISE JUSTE LES OUTILS INFORMATIQUE POUR FAIRE DE LA SIMULATION

    1 maille ça vient du maillage par exemple je devise mon domaine de calcul à 200 petit carreau et moi je veux injecter des termes sources que dans des cellules définies, c'est pour ça mon tableau il contient deux colonnes la 1ere colonnes contiens des entiers (1, 2, 3,....100) et en face dans la 2éme colonne j'ai les valeurs de termes sources corresponds à chaque cellule (1E-12, 2E-11,...2.4E-10) et moi ce que je veux c'est de faire un petit programme qui permis de lire ce tableau et de dire a ce programme que la valeur 1E-12 il faut la mettre dans la cellule 1 et la valeur 2E-11 faut la mettre dans la cellule 2....et la valeur 2.4E-10 faut la mettre dans la cellule 100..
    Ok. Voici ce que j'ai compris: t'as un tableau 2 colonnes. la première colonne contient le n° de la case ciblée et la seconde contient la valeur à mettre dans ce n°.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1              1E-12
    5              2E-14
    4              3E-10
    2              2E-27
    ...
    Je suppose que le séparateur entre c1 et c2 est la tabulation. Bon ben un programme de ce style devrait faire l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #include <errno.h>
     
    int main()
    {
        FILE *fp;
        char ligne[81];
        float maille[200];
        unsigned int ind;
        float valeur;
     
        // Ouvrir fichier
        fp=fopen("sourceO.txt", "r");
        if (fp == NULL)
        {
             perror("Erreur ouverture sourceO.txt");
             exit(1);
        }
     
        // Lire fichier ligne à ligne
        while (fgets(ligne, 81, fp) != NULL)
        {
             // Récupérer indice et valeur
             if (sscanf(ligne, "%u\t%f", &ind, &valeur) != 2)
             {
                     char *pt;
     
                    // Suppression retour charriot s'il y est (juste pour l'affichage de la ligne)
                    if ((pt=strchr(ligne, '\n')) != NULL)
                         *pt='\0';
                    fprintf(stderr, "Erreur analyse ligne [%s]", ligne);
                    continue;
             }
     
             // Positionnement valeur dans maille[indice] - Attention, en C un tableau commence à 0 alors que le fichier semble faire commencer l'indice à 1...
            maille[ind - 1]=valeur;
        }
     
        // Fermeture fichier
        fclose(fp);
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    • qu'est l'étiquette 40 (correspondant à READ ( 40, *)) ?
    Désolé j'étais dans les choux hier, ne tient pas compte de cette remarque...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 59
    Par défaut
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1              1E-12
    5              2E-14
    4              3E-10
    2              2E-27
    ...
    Je suppose que le séparateur entre c1 et c2 est la tabulation. Bon ben un programme de ce style devrait faire l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #include <errno.h>
     
    int main()
    {
        FILE *fp;
        char ligne[81];
        float maille[200];
        unsigned int ind;
        float valeur;
     
        // Ouvrir fichier
        fp=fopen("sourceO.txt", "r");
        if (fp == NULL)
        {
             perror("Erreur ouverture sourceO.txt");
             exit(1);
        }
     
        // Lire fichier ligne à ligne
        while (fgets(ligne, 81, fp) != NULL)
        {
             // Récupérer indice et valeur
             if (sscanf(ligne, "%u\t%f", &ind, &valeur) != 2)
             {
                     char *pt;
     
                    // Suppression retour charriot s'il y est (juste pour l'affichage de la ligne)
                    if ((pt=strchr(ligne, '\n')) != NULL)
                         *pt='\0';
                    fprintf(stderr, "Erreur analyse ligne [%s]", ligne);
                    continue;
             }
     
             // Positionnement valeur dans maille[indice] - Attention, en C un tableau commence à 0 alors que le fichier semble faire commencer l'indice à 1...
            maille[ind - 1]=valeur;
        }
     
        // Fermeture fichier
        fclose(fp);
    }
    [/QUOTE]


    Ce que tu ma donné me semble cohérent avec ce que je veux faire mais vu que je connais pas C, je voudrais savoir [81] correspond à quoi?

    Cette ligne vaut dire quoi: "while (fgets(ligne, 81, fp) != NULL)"

    if (sscanf(ligne, "%u\t%f", &ind, &valeur) != 2): pourquoi le chiffre 2

    " maille[ind - 1]=valeur;" je dois mettre la valeur correspondante ou je laisse "valeur"?

    Merci bcp

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 59
    Par défaut
    @ souviron34 Ce n'ai pas grave j'espere que j'arriverai a trouver la solution de tout cela... en fait est ce que y a quelqu'un qui connait le logiciel FLUENT??

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stage75 Voir le message
    Ce que tu ma donné me semble cohérent avec ce que je veux faire mais vu que je connais pas C, je voudrais savoir [81] correspond à quoi?
    C'est une décision perso. Je présume de façon arbitraire et gratuite que chaque ligne (une ligne est matérialisée par une suite de caractères terminée par un '\n') du fichier ne fera pas plus de 80 caractères. Je taille donc ma zone pour en stocker 80 + 1 pour le '\0' qui termine toute chaine en C.
    Si jamais je me suis planté et qu'une des lignes du fichier fait plus de 80c, alors cette ligne sera incomplètement traitée.

    Citation Envoyé par stage75 Voir le message
    Cette ligne vaut dire quoi: "while (fgets(ligne, 81, fp) != NULL)"
    La fonction fgets() permet de récupérer une ligne du fichier (estimée à 80 caractères + 1 pour le '\0') et la stocke dans ma variable "ligne". Si elle réussit (qu'on n'a pas atteint la fin du fichier) elle renvoie le pointeur sur le début de ligne. Si elle échoue (parce qu'on a atteint la fin du fichier ou pour toute autre raison telle que disque dur en panne ou autre) elle renvoie NULL. Donc ici je boucle tant que j'ai pu lire une ligne.

    Citation Envoyé par stage75 Voir le message
    if (sscanf(ligne, "%u\t%f", &ind, &valeur) != 2): pourquoi le chiffre 2
    Parce que sscanf va analyser la variable ligne selon le schéma demandé (un unsigned int %u suivi d'une tabulation \t suivi d'un flottant %f) et stocker les éléments récupérés dans les 2 variables ind et valeur. Et il renvoie le nombre d'éléments correctement récupérés. Si ce nb n'est pas 2, c'est que une des deux variables n'a pas la bonne valeur.

    Citation Envoyé par stage75 Voir le message
    " maille[ind - 1]=valeur;" je dois mettre la valeur correspondante ou je laisse "valeur"?
    Ben ici la variable "valeur" contient le nombre 2E-10. Donc je stocke ce nombre dans l'indice qui va bien du tableau "maille". Je suis obligé de passer par une variable intermédiaire car je ne sais pas, au moment où je récupère la valeur, à quel endroit je vais devoir la mettre...

    Tu peux rajouter en fin de programme pour vérifier ton tableau
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (ind=0; ind < 200; ind++)
        printf("élément maille[%d]=%f\n", ind, maille[ind]);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 59
    Par défaut
    A Sve@r: Merci infiniment , je vais tester ce programme demain lundi au stage et je te tiens au courant mais je pense que ça doit marché

    Une autre question Est ce que tu as déja travaillé sur un logiciel de simulation numérique qui s'appel Fluent??
    passe un bon dimanche

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stage75 Voir le message
    A Sve@r: Merci infiniment , je vais tester ce programme demain lundi au stage et je te tiens au courant mais je pense que ça doit marché
    Si tu avais un linux sous la main, tu pourrais essayer de suite.
    Tu connais vmVirtualBox ??? Un logiciel de machine virtuelle. Ca te permet d'installer, dans ta machine réelle, un ou plusieurs ordi virtuels. Tu leurs donne un fichier qui leur servira de disque dur, tu leur mets un OS, bref tu fais tout comme s'il s'agissait d'un vrai ordi vierge. Et ensuite, quand t'as un truc rapide à tester, ben tu peux le tester dans l'ordi virtuel ce qui te permet de ne pas installer n'importe quoi dans ton ordi réel
    Et si t'as pris la précaution de sauvegarder le fichier qui sert de disque dur à l'ordi virtuel, tu peux restaurer très rapidement ton OS virtuel dans un état de base que tu considères correct.
    Chez-moi, j'ai une machine virtuelle qui tourne sous XP, une autre sous Debian, une autre sous Seven et je m'en sers comme je te l'ai décrit...

    Apparemment mon pgm (tapé à capella et sans le tester réellement) semblerait te convenir.
    Je l'ai donc tapé pour de vrai et compilé sur un Linux pour lui enlever ses qq imperfections

    Voici le code finalisé
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <stdio.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
    	FILE *fp;
    	char ligne[81];
    	float maille[200];
    	unsigned int ind;
    	float valeur;
     
    	// Ouvrir fichier
    	fp=fopen("sourceO.txt", "r");
    	if (fp == NULL)
    	{
    		 perror("Erreur ouverture sourceO.txt");
    		 exit(1);
    	}
     
    	// Lire fichier ligne à ligne
    	while (fgets(ligne, 81, fp) != NULL)
    	{
    		 // Récupérer indice et valeur
    		 if (sscanf(ligne, "%u\t%g", &ind, &valeur) != 2)
    		 {
    				 char *pt;
     
    				// Suppression retour charriot s'il y est (juste pour l'affichage de la ligne)
    				if ((pt=strchr(ligne, '\n')) != NULL)
    					 *pt='\0';
    				fprintf(stderr, "Erreur analyse ligne [%s]", ligne);
    				continue;
    		 }
     
    		 // Positionnement valeur dans maille[indice] - Attention, en C un tableau commence à 0 alors que le fichier semble faire commencer l'indice à 1...
    		maille[ind - 1]=valeur;
    	}
     
    	// Fermeture fichier
    	fclose(fp);
     
    	// Vérification contenu du tableau
    	for (ind=0; ind < 200; ind++)
    		printf("maille[%d]=%g\n", ind, maille[ind]);
    }
    J'y ai rajouté 2 includes, l'un pour pouvoir utiliser la fonction exit() et l'autre pour strchr().
    J'ai aussi remplacé les "%f" par des "%g". En effet, je connais pas tous les formats de printf et scanf par coeur et pour pouvoir gérer de la notation scientifique style 1E-4, faut utiliser "%g" et non "%f" (surtout au scanf car c'est lui qui analyse l'info)

    J'ai testé ce programme sur le fichier suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1	1E-12
    5	2E-14
    4	3E-10
    2	2E-27
    Avec une tabulation entre l'indice et la valeur.
    Voici son résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    maille[0]=1e-12
    maille[1]=2e-27
    maille[2]=0
    maille[3]=3e-10
    maille[4]=2e-14
    maille[5]=3.98763e-34
    maille[6]=0
    maille[7]=0
    maille[8]=0
    maille[9]=0
    Tu remarqueras de suite que je ne stocke que les indices 1; 2; 4 et 5 (ou 0; 1; 3 et 4 en C). Et donc les autres valeurs du tableau maille (je me suis arrêté à 10 dans mon test) sont absolument aléatoires. Te faudra prendre en compte ce fait. Une variable qui n'est pas initialisée contient toujours absolument n'importe quoi. Donc soit ton fichier contient absolument tous les indices possibles, soit tu devras initialiser ton tableau avant de le remplir afin de pouvoir détecter, à l'issue du traitement, quel indice a été rempli et lequel ne l'a pas été. Et il faudra que ta valeur d'initialisation ne soit pas une des valeurs présentes dans le fichier. Bref, bienvenue dans le monde du C...

    Citation Envoyé par stage75 Voir le message
    Une autre question Est ce que tu as déja travaillé sur un logiciel de simulation numérique qui s'appel Fluent??
    Désolé. Il semble que ce soit un outil de haut niveau utilisé uniquement par les pros de la mécanique des fluides ce qui n'est pas mon domaine... http://www.fluent.fr
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 59
    Par défaut
    Merci infiniment, et non sur mon ordi j'ai le windows 7 pas de linux pour la machine virtuel dont tu ma parlé je vais d'installer ça si c'est pas trop complique lol

    Merci bcp pour ton test et pour l'aide, oui comme j'ai vu le code tourne correctement sans faute juste pour le maille 5 il a donner une valeur de 3E-34 mais ce n'est pas genant c'est zero normalement je vais adapter ça avec mes conditions aux limites que je vais imposer à mon modèle.

    et oui comme tu la bien dit bienvenu au monde C

    avant j'utilise la version 4 de Fluent et ses user defined subroutine (uds) en les programme par fortran et là je suis obligé de migré vers la version 6 ils ont tout changer pour les UDF et on peut plus utiliser le fortran il se mettre en C Fortran c'est du passé lol

    merci bcpp

  17. #17
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stage75 Voir le message
    Merci infiniment, et non sur mon ordi j'ai le windows 7 pas de linux pour la machine virtuel dont tu ma parlé je vais d'installer ça si c'est pas trop complique lol
    http://www.virtualbox.org


    Citation Envoyé par stage75 Voir le message
    juste pour le maille 5 il a donner une valeur de 3E-34 mais ce n'est pas genant c'est zero normalement
    Il n'y a pas de "c'est zéro normalement" !!!
    Mon fichier exemple n'a pas d'indice 6. La valeur maille[5] (car l'indice 6 du fichier correspond à l'indice[5] du tableau) n'est donc pas initialisée et contient donc n'importe quoi d'où ma dernière remarque dans mon post précédent...

    Si tu veux que "ce soit zéro normalement" alors à toi de commencer par tout mettre le tableau à 0 avant de le remplir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 59
    Par défaut
    Si tu veux que "ce soit zéro normalement" alors à toi de commencer par tout mettre le tableau à 0 avant de le remplir...[/QUOTE]

    OK!! ta vu que je suis nul en C!!

    J'essaie de compiler le programme, Fluent me signale un erreur dans la ligne 35 c'est à dire la ligne ou ya le crochet en bas:


    {
    char *pt;

    // Suppression retour charriot s'il y est (juste pour l'affichage de la ligne)
    if ((pt=strchr(ligne, '\n')) != NULL)
    *pt='\0';
    fprintf(stderr, "Erreur analyse ligne [%s]", ligne);
    continue;
    ligne 35........... }

    // Positionnement valeur dans maille[indice] - Attention, en C un tableau commence à 0 alors que le fichier semble faire commencer l'indice à 1...
    maille[ind - 1]=valeur;

  19. #19
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stage75 Voir le message
    J'essaie de compiler le programme, Fluent me signale un erreur dans la ligne 35 c'est à dire la ligne ou ya le crochet en bas:


    {
    char *pt;

    // Suppression retour charriot s'il y est (juste pour l'affichage de la ligne)
    if ((pt=strchr(ligne, '\n')) != NULL)
    *pt='\0';
    fprintf(stderr, "Erreur analyse ligne [%s]", ligne);
    continue;
    ligne 35........... }

    // Positionnement valeur dans maille[indice] - Attention, en C un tableau commence à 0 alors que le fichier semble faire commencer l'indice à 1...
    maille[ind - 1]=valeur;
    Euh oui mais bon, Fluent n'est pas un compilateur !!!
    Le code que j'ai donné est 100% compilable sur un Linux avec gcc. Il devrait aussi être compilable sur un Windows avec mingw ou codeblocks (qui sont deux compilateurs C gratuits) mais j'ai pas testé.
    En tout cas, la ligne 35 termine un bloc qui n'est exécuté que si la ligne lue dans le fichier n'a pas pu être analysée.
    La seule chose exotique que j'y ai fait a été de définir la variable "char *pt" car elle n'est utilisée que dans ce bloc. Théoriquement, c'est autorisé de définir une variable en début de tout bloc quel qu'il soit (un bloc est délimité par des accolades {}) mais si Fluent n'est qu'un ersatz de compilo, ptet qu'il n'aime pas et qu'il veut que les variables soient définies en début de fonction.
    Donc, bien que cette variable ne soit pas utilisée ailleurs que dans le bloc gérant l'erreur, tu peux essayer de déplacer cette ligne "char *pt;" avec les autres variables du début. L'important est qu'elle soit définie avant d'être utilisée...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 59
    Par défaut
    Et ça marcheeeeeeeee.....Et oui comme tu la bien décrit il faut le définir au tout début!

    merci

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/01/2009, 14h10
  2. Réponses: 1
    Dernier message: 18/12/2008, 13h43
  3. Problème de conversion d'un code de AS2 en AS3
    Par platondog dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 20/11/2008, 01h30
  4. [MEX] Problème avec le code Fortran yprimef.F
    Par ZeFMG dans le forum MATLAB
    Réponses: 5
    Dernier message: 13/11/2008, 10h36
  5. Réponses: 8
    Dernier message: 15/03/2008, 20h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo