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

Fortran Discussion :

Problème de typeless et de compilation gfortran


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut Problème de typeless et de compilation gfortran
    Bonjour,

    J'ai récupéré un programme qui compile très bien avec g77.
    Cependant, en regardant d'un peu plus près le code, je me suis rendu compte qu'une ligne me paraissait assez obscure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CHARACTER*4   SALUT
    DATA     SALUT/X'00011000'/
    SALUT est ensuite utilisé plus tard dans le code pour effectuer une comparaison avec une autre chaine de 4 caractères.

    Mais je n'arrive pas trop à voir ce que va contenir SALUT. A priori, celà vaudrait 11000 en base héxadécimale mais comment celà est-ce "traduit" en chaine de 4 caractères? (En prenant les chiffres 2 à 2 peut etre...)

    De plus, je veux maintenant compiler mon code avec gfortran. Problème, il n'a pas l'air d'aimer la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATA  SALUT/X'00011000'/
    Voici le message d'erreur: "Cant' convert INTEGER(16) to CHARACTER(1)"
    Sauriez-vous ce qu'il se passe? gfortran ne saurait-il plus conertir des typeless? Si oui, comment procéder?

    J'ai bien tenter de changé la position du X, d'utiliser PARAMETER plutot que DATA, de mettre des double quote. Rien n'y fait...

    Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Le X veut dire hexadécimale, mais ce n'est pas standard. Essaies avec un Z à la place.

    Comment ça marche ? Ça affecte Z'00' à Salut(1:1), Z'01' à Salut(2:2), ...

    Si ça ne fonctionne pas avec Z, essaies avec :

    parameter, character(4) Salut = char(0) // char (1) // char (16) // char(0)

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Bonjour Sylvain,

    Tout d'abord, merci de t'attarder sur mon soucis

    J'ai effectivement essayer avec le Z mais ca ne fonctionne toujours pas. Ce qui m'inquiete, c'est le fait qu'il est l'impression que je veux que SALUT est une valeur entière...

    Pour ta deuxième solution, c'est un peu de la bidouille. Mais je pense qu'il va falloir que j'y songe si le soucis perdure.
    Tu pourrais m'expliquer ce que fait la solution que tu proposes? Je ne connais pas cette syntaxe avec les "//".

    Dernière chose: à votre avis, que devrais concrètement valoir SALUT (qui est je le rappelle une chaine de 4 caractères). J'ai pensé à 01A1' mais j'ai un doute:

    0 0 0 1 1 0 0 0
    0 1 A 0 (en regroupant les termes deux par deux 00 01 10 00 et en faisant une conversion en hexa)

    D'ailleurs, la syntaxe SALUT = '01A1' pourrait peut etre fonctionner à ce moment là non?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Tu y es presque. La chaîne 00011000 est en hexadécimal. Un hex définit 4 bits. Il faut 2 hex pour définir un octet, soit un caractère. La chaîne se décompose donc en 00 01 10 00 hexadécimal (soit 0, 1, 16 et 0 en décimal).

    Tu ne peux pas dire que 00 égal "0", ni que 10 vaut "A". Tu dois consulter une table ASCII (http://fr.wikipedia.org/wiki/ASCII). Tu verras que "0" vaut 48 décimal, soit 30 hexadécimal.

    Comment remplacer l'initialisation si la ligne data ne fonctionne pas ? Tu peux affecter les 4 caractères un par un :

    Salut(1:1) = char(0)
    Salut(2:2) = char(1)
    Salut(3:3) = char(16)
    Salut(4:4) = char(0)

    Tu peux concaténer les caractères et affecter d'un coup :

    Salut = char(0) // char(1) // char(16) // char(0)

    Cela dit, à la lecture du message d'erreur, je pense que la constante Z'00011000' est interprétée comme un entier, et qu'ensuite l'assignation d'entier à caractère est refusée.

    J'opterais donc pour une conversion comme suis :

    integer (4) iSalut
    character (4) Salut

    data iSalut / Z'00011000' /
    ...
    Salut = transfer( iSalut, Salut)

    Cette stratégie reste à surveiller à cause de l'«endianness» (http://fr.wikipedia.org/wiki/Endianness).

Discussions similaires

  1. Problème de link pour une compilation 64 bits
    Par vjbda dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 17/09/2008, 16h57
  2. Problème d'execution du prog compilé
    Par Driss35 dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 05/08/2007, 21h50
  3. [SQL2005][TSQL] Problème de curseur / Fonction ne "compile" pas
    Par Ivenoproblemwiththat dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/06/2007, 21h55
  4. Problème de chemin pour la compilation de JSP
    Par piloupy dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 21/03/2007, 07h56
  5. Problème à l'exécution avec wxWindows (compilé avec BCC55)
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 14/11/2003, 18h04

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