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

Ada Discussion :

Me risquer à modifier les sources ?


Sujet :

Ada

  1. #1
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut Me risquer à modifier les sources ?
    Salut,

    J'essaye de compiler la branche expérimentale (4.6.0) de Gcc avec le support de Ada sous MinGW.

    Cependant, la compilation sort sur une erreur au prétexte que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g-socthi.adb:280:45 value not in range of type "Interfaces.C.unsigned"
    g-socthi.adb:280:45 static expression fails Constraint-check
    Je vais vous faire grâce de l'ordre de mes recherches, mais, l'erreur indiquée est due à au code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       function C_Recvmsg
         (S     : C.int;
          Msg   : System.Address;
          Flags : C.int) return System.CRTL.ssize_t
       is
          use type C.size_t;
     
          Fill  : constant Boolean :=
                    (C.unsigned (Flags) and SOSC.MSG_WAITALL) /= 0;
          --  Is the MSG_WAITALL flag set? If so we need to fully fill all vectors
    (à la ligne qui précède le commentaire, pour être précis), dans un fichier qui est utilisé exclusivement pour MinGW (g-socthi-mingw.adb pour ceux que cela intéresse) et MSG_WAITALL dont il est question est défini sous la forme de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       Flags : constant array (0 .. 3) of C.int :=
                 (0 => SOSC.MSG_OOB,     --  Process_Out_Of_Band_Data
                  1 => SOSC.MSG_PEEK,    --  Peek_At_Incoming_Data
                  2 => SOSC.MSG_WAITALL, --  Wait_For_A_Full_Reception
                  3 => SOSC.MSG_EOR);    --  Send_End_Of_Record
    dans un fichier qui est destiné à être utilisé par l'ensemble des systèmes ( g-socket.adb, pour ceux que cela intéresse).

    Le plus intriguant, c'est que FLags me semble être défini comme étant de type C.int, ce qui me fait me poser la question de l'intérêt de j'assimile à une conversion !.

    Enfin bref, ma première idée serait de remplacer la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (C.unsigned (Flags) and SOSC.MSG_WAITALL) /= 0;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Flags and SOSC.MSG_WAITALL) /= 0;
    Ma question est, en déinitive toute bête : Croyez vous que je puisse effectuer cette modification sans que cela ne vienne "tout casser" par la suite

    Question subsidiaire : si j'ai confirmation que cette modification résout le problème et n'en pose pas d'autre, quelqu'un sait il à qui adresser le patch

    J'ai en effet en tête que ce n'est pas l'équipe de Gcc qui s'occupe du suivi et des bug dans Ada
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  2. #2
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    J'aurais tendance à dire que si ça compile, ça casse pas tout... c'est de l'Ada quand même
    Sinon, effectivement, la conversion est un peu bizarre compte tenu des définitions de Flags et des SOSC.*. Ceci dit, dans le code C qui contient les SOSC.* ( s-oscons-tmplt.c ), MSG_WAITALL est un define à -1. J'y perd mon latin !

    Si tout ça fonctionne, pour ce qui est de la soumission du patch, je te conseille quand même de t'adresser à l'équipe Gcc car c'est de là que provient ton code source, même s'il vient peut-être à l'origine d'un reversement d'AdaCore.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Blackknight Voir le message
    J'aurais tendance à dire que si ça compile, ça casse pas tout... c'est de l'Ada quand même
    Effectivement... J'en oubliais presque que Ada le laissera pas passer grand chose en terme de conversion foireuse
    Sinon, effectivement, la conversion est un peu bizarre compte tenu des définitions de Flags et des SOSC.*. Ceci dit, dans le code C qui contient les SOSC.* ( s-oscons-tmplt.c ), MSG_WAITALL est un define à -1. J'y perd mon latin !
    J'ai suivi ma première intuition et j'ai essayé de supprimer purement et simplement la conversion, et il apparait que FLAGS est en réalité du type Interface.C.int alors que MSG_WAITALL est de type "universal int".

    Dois-je en déduire que je devrais en réalité convertir MSG_ALL en Interface.C.int

    Si tout ça fonctionne, pour ce qui est de la soumission du patch, je te conseille quand même de t'adresser à l'équipe Gcc car c'est de là que provient ton code source, même s'il vient peut-être à l'origine d'un reversement d'AdaCore.
    On va déjà essayer de faire que cela fonctionne
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Dois-je en déduire que je devrais en réalité convertir MSG_ALL en Interface.C.int
    Ça semble pas mal comme idée. A essayer donc ! ;-)

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Je dois avouer que, si je sais suis capable de comprendre à peu près n'importe quel langage, Ada est un des langages que je ne connais absolument pas pour ne l'avoir pas encore utilisé...

    Peux tu me confirmer que cette conversion se ferait sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Flags and Interface.C.int(SOSC.MSG_WAITALL)) /= 0;
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Compte tenu des différents include (pour parler en programmeur C ;-)), je dirais que ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Flags and C.int(SOSC.MSG_WAITALL)) /= 0;
    devrait suffire.

    Allez, pour essayer de te convertir un peu, lis donc cette petite intro

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Blackknight Voir le message
    Compte tenu des différents include (pour parler en programmeur C ;-)), je dirais que ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Flags and C.int(SOSC.MSG_WAITALL)) /= 0;
    devrait suffire.

    Allez, pour essayer de te convertir un peu, lis donc cette petite intro
    Promis, je vais lire l'article, mais en attendant...

    En ayant effectivement remplacé le code tel que tu le donne, il me dit qu'il n'y a pas d'opérateur AND pour Interfaces.C.int

    Dés lors, pourrais-je me contenter de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F(lags =  C.int(SOSC.MSG_WAITALL));
    vu que les différentes valeurs possibles sont définies sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       Flags : constant array (0 .. 3) of C.int :=
                 (0 => SOSC.MSG_OOB,     --  Process_Out_Of_Band_Data
                  1 => SOSC.MSG_PEEK,    --  Peek_At_Incoming_Data
                  2 => SOSC.MSG_WAITALL, --  Wait_For_A_Full_Reception
                  3 => SOSC.MSG_EOR);    --  Send_End_Of_Record
    et qu'il me semble impossible d'avoir deux valeurs en même temps
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    En fait, le Flags dont tu parles est défini là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     function C_Recvmsg
         (S     : C.int;
          Msg   : System.Address;
          Flags : C.int) return System.CRTL.ssize_t
    et c'est juste un paramètre de la fonction de type C.int.
    L'autre Flags dont tu parles est une définition de tableau constant et je n'ai pas regardé le lien qu'il peut y avoir entre les deux.

    Ensuite pour le problème de l'opérateur AND, j'ai trouvé ici que celui-ci ne peut s'appliquer qu'aux types modulaires, booléens ou tableaux à une dimension.
    Du coup, en regardant , j'ai vu que C.unsigned rentre lui dans la catégorie modular.

    En conclusion, le cast en C.unsigned de Flags et de SOSC.MSG_WAITALL devrait marcher mais c'était ton problème de départ. Je suis donc bien désappointé
    En plus, j'ai pas de quoi tester actuellement. J'essaierai de jeter un œil là-dessus sur une plateforme adéquate

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Ceci dit, comme c'est pour l'initialisation de Fill, qui n'est qu'un booléen (constant, qui plus est), ne pourrais-je pas me "contenter" d'un simple test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fill : consant Boolean :=  Flag =C.int (SOSC.MSG_WAITALL));
    Parce que, sauf erreur, il me semble peu vraisemblable que Flag puisse valoir deux valeurs parmi MSG_OOB, MSG_PEEK, MSG_WAITALL, -MSG_EOR...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Ça se tente

    Sinon, tu peux toujours te fendre d'un mail à Pascal Obry car la modif vient de lui (cf. ça)... Ceci dit, c'est pas son style de pondre un truc qui compile pas.... De plus en plus bizarre cette affaire !!

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Effectivement

    Mais le fait est que, normalement, ce fichier est compilé uniquement lors... de la troisième passe d'un bootstrap du compilateur

    En théorie, cela fait donc qu'il faut à peut de chose près chaque fois deux heures avant de constater si la modification ne provoque pas d'erreur

    Enfin, je reviens ici dans quelques heures pour te dire si ca a marché
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Bon, ben il semble que le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          Fill  : constant Boolean := Flags =  C.int (SOSC.MSG_WAITALL);
          --  Is the MSG_WAITALL flag set? If so we need to fully fill all vectors
    fonctionne... Oufff

    Je place donc le sujet en résolu, en attendant de me mettre réellement à Ada

    Un grand merci à toi
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    C'est quand même pas très sain tout ça :-)

  14. #14
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Oui, je sais bien que l'idéal reste toujours qu'un compilateur compile parfaitement... Mais bon, si je peux faire avancer le shmilblick
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  15. #15
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Bon...

    J'ai envoyé un message à la ML, et j'ai eu droit à l'ensemble des explications:

    MSG_WAITALL est une valeur non définie sous MinGW, car apparue avec windows 2003 server.

    Il semblerait que sa valeur officielle soit 8.

    De ce fait, le fichier généré s-oscons.ads définit cette valeur à... -1 qui, comme tout le monde le sait, n'est pas un entier positif , et c'est ce qui finit par poser problème

    La personne qui s'est occupée de ce cas a donc de modifier le code pour qu'il ressemble à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Fill  : constant Boolean :=
    	SOSC.MSG_WAITALL /= -1
    	and then (C.unsigned (Flags) and SOSC.MSG_WAITALL) /= 0;
     
          --  Is the MSG_WAITALL flag set? If so we need to fully fill all vectors
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #16
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    C'est mieux.
    Tout est bien qui finit bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] modifier les liaisons erreur : source introuvable
    Par Lune1 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/06/2015, 15h14
  2. Réponses: 3
    Dernier message: 16/05/2011, 09h54
  3. Modifier code source Nutch afin de stocker les indexes dans un SGBD
    Par megaloplex dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 18/04/2011, 17h15
  4. Réponses: 1
    Dernier message: 11/03/2009, 11h52
  5. Réponses: 3
    Dernier message: 17/07/2006, 17h04

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