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

Langage Pascal Discussion :

Traduction de C vers Pascal


Sujet :

Langage Pascal

  1. #1
    Membre actif Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Points : 299
    Points
    299
    Par défaut Traduction de C vers Pascal
    Bonjour,
    j'essai de faire cohabiter une dll ecrite en C dans un programme en pascal (pour un script inno setup).
    La signature de la function que je souhaite utiliser est la suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int function(unsigned short, unsigned short*, unsigned long*, unsigned long*, unsigned short*, unsigned short*, unsigned short*, unsigned short*, unsigned char *);
    Les conversion de type me donnent pas mal de soucis.

    unsigned short -> word ?
    unsigned short* -> ?
    unsigned long* -> ?
    unsigned char* -> ?


    Merci de votre aide.
    Si tu ne te plantes pas, comment veux tu pousser?

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Wie,

    Tous les paramètres avec une étoile * dans leur définition sont des pointeurs, l'équivalent pour Pascal est d'ajouter le mot-clé Var.

    unsigned short -> word ? ==> oui
    unsigned short* -> ? ==> Var a : Word
    unsigned long* -> ? ==> Var b : Integer
    unsigned char* -> ? ==> Var c : Char

    Les correspondances sont celles qu'on trouve le plus souvent, ce n'est pas absolu, car, à part le type char, la norme du C n'impose pas la taille des types, mais seulement leurs tailles relatives (si on parle de comparer les tailles, on doit avoir char<=short<=int<=long etc.)

    Et attention, le passage des paramètres en C et en Pascal est inversé !
    Par exemple, si en C on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fct(int n, char *c)
    on va passer les paramètres de la droite vers la gauche,
    alors qu'en Pascal on les passe de la gauche vers la droite

    L'équivalent Pascal sera donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function fct_En_Pascal(Var c : Char; Integer : n) : Integer;
    N'hésite pas à demander des éclaircissements.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Citation Envoyé par droggo
    alors qu'en Pascal on les passe de la gauche vers la droite
    L'équivalent Pascal sera donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function fct_En_Pascal(Var c : Char; Integer : n) : Integer;
    N'hésite pas à demander des éclaircissements.
    Bonjour
    1-Tu es sûr de cet ordre en Pascal
    2-Je ne suis pas sûr que une telle declaration de fonction passe en Pascal
    je dirai plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function fct_En_Pascal(Var c : Char;  n:Integer ) : Integer;
    toujours Variable :Type
    @+
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Fio,

    1) Oui, sans le moindre doute.

    2) Bien entendu, l'habitude du C++ liée à une réponse rapide
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Citation Envoyé par droggo Voir le message
    Fio,
    1) Oui, sans le moindre doute.
    2) Bien entendu, l'habitude du C++ liée à une réponse rapide
    1- Il existe une spec de Pascal qui le dit ? parce que par exemple le compilateur de TP ne dit rien en ce qui concerne l'ordre de passage des parametres ni d'ailleurs l'aide.J'ai testé un programme suivant differents ordres ,ça marché sans probleme et avec les memes resultats alors .
    Pour le moment ce que j'ai réussi à trouver
    ==> La convention PASCAL utilise la pile, empile de la gauche vers la droite, et nettoie la pile automatiquement.
    2-Eh oui le langage qu'on a le plus utilisé laisse des fois de petites traces dans les autres langages qu'on a fait .
    @+
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Fio,

    Pour le passage de paramètres du Pascal standard, c'est bel et bien comme je l'affirme : on passe les paramètres de gauche à droite, et c'est sandard depuis la création du Pascal.
    Ta citation le dit d'ailleurs bien.

    Qu'as-tu fait comme tests ?

    Pour voir ça, il faut aller voir le code généré, ou écrire une partie de la fonction en assembleur, en adressant les paramètres au format assembleur, c'est à dire avec un adressage dans la pile, pas avec leur nom symbolique dans la déclaration de la fonction.

    Cependant, les compilateurs plus modernes que TP disposent de directives pour changer l'ordre de passage (Delphi, par exemple, dispose de cdecl, justement pour passer les paramètres comme le C, de droite à gauche), et c'est peut-être la meilleure solution pour adapter dans le cas présent, mais ce n'est pas standard, et les compilateurs ne sont donc pas obligés de disposer de ces directives.
    Mais cela garantit sans doute une meilleure compatibilité, car les problèmes de pile ne sont pas gérés de même manière ne Pascal et en C : comme le rappelle la citation que tu fais, en Pascal, c'est la fonction qui restaure la pile, alors qu'en C, c'est le programme appelant.
    J'ai pour ma part toujours évité de faire le mélange direct Pascal/C, et les 2 ou 3 fois ou j'ai été obligé de le faire, j'ai utilisé en intermédiaire une fonction entièrement écrite en assembleur pour être sûr que le tout ferait bien ce qu'il faut (à l'époque, c'était avec du TP).
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut

    Pour bien comprendre il faut lire le lien que j'ai donné de A à Z et je vois de quoi tu parles ,c'est Ok. (Merci à toi)
    Pour les tests que j'ai fait ,tiens voila un exemple:

    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
     
        var i:integer;
              chaine:string;
     
        procedure testGaucheDroite(var ch:string;i:integer);
        begin
             i:=0;
             ch:='changéGaucheDroite';
        end;
     
        procedure testDroiteGauche(i:integer;var ch:string);
        begin
             i:=0;{Initialisation aleatoire}
             ch:='changeDroiteGauche';
        end;
     
        begin
             i:=1;
             chaine:='chaineInitial';
             testGaucheDroite(chaine,i);
             writeln(i,'    ',chaine);
             testDroiteGauche(i,chaine);
             writeln(i,'    ',chaine);
             readln;
       end.
    Pour le parametre passé par valeur on sait bien ce qui va se passer et le second parametre mon but etait de verifié si le compilateur dira s'il l'ordre de passage à été respecté et sous TP7 il dit rien.De toute façon tu resumes bien la situation
    (Par curiosité il faudra testé sur TP1-2-3 pour si les directives sont activées par defaut )
    @+
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Fio,
    Citation Envoyé par krachik Voir le message

    Pour bien comprendre il faut lire le lien que j'ai donné de A à Z et je vois de quoi tu parles ,c'est Ok. (Merci à toi)
    Pour les tests que j'ai fait ,tiens voila un exemple:

    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
     
        var i:integer;
              chaine:string;
     
        procedure testGaucheDroite(var ch:string;i:integer);
        begin
             i:=0;
             ch:='changéGaucheDroite';
        end;
     
        procedure testDroiteGauche(i:integer;var ch:string);
        begin
             i:=0;{Initialisation aleatoire}
             ch:='changeDroiteGauche';
        end;
     
        begin
             i:=1;
             chaine:='chaineInitial';
             testGaucheDroite(chaine,i);
             writeln(i,'    ',chaine);
             testDroiteGauche(i,chaine);
             writeln(i,'    ',chaine);
             readln;
       end.
    Pour le parametre passé par valeur on sait bien ce qui va se passer et le second parametre mon but etait de verifié si le compilateur dira s'il l'ordre de passage à été respecté et sous TP7 il dit rien.De toute façon tu resumes bien la situation
    (Par curiosité il faudra testé sur TP1-2-3 pour si les directives sont activées par defaut )
    @+
    Désolé pour toi, mais ton test ne signifie absolument rien concernant l'ordre de passage des paramètres.

    Quelle que soit la manière dont tu définis l'ordre des paramètres dans ta procédure, ça fonctionnera tant que tu ne les utilises qu'avec du pascal dans ta procédure, heureusement pour nous !!

    Si tu veux vraiment vérifier, il faut contrôler l'adresse des paramètres passés.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Si tu veux vraiment vérifier, il faut contrôler l'adresse des paramètres passés.
    Bien sûr c'est ce que j'ai compris finalement quand j'ai lu la Doc du lien , ce qui rejoint ce que tu as dit plus haut,moi j'avais pris au premier degré ce que tu avais dit et c'est pour ça que je voulais verifié si le compilateur de TP exigeait l'ordre de passage.(tout se passe dans la pile ).
    Il ya meme des exemples dans la Doc pour verifier(asm)
    @+
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  10. #10
    Membre actif Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Points : 299
    Points
    299
    Par défaut
    Merci énormément de vos réponses.
    J'ai réussi à contourner mon problème sans faire un chargement explicite de la fonction.
    Si tu ne te plantes pas, comment veux tu pousser?

Discussions similaires

  1. Traduction de C vers Pascal
    Par biba13 dans le forum Langage
    Réponses: 6
    Dernier message: 14/02/2009, 22h21
  2. traduction du MASM vers PASCAL
    Par alili mostafa dans le forum Langage
    Réponses: 2
    Dernier message: 03/12/2008, 10h09
  3. Réponses: 2
    Dernier message: 30/12/2007, 12h52
  4. Réalisation d'un traducteur de C vers Pascal
    Par houyam dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 28/12/2007, 16h24
  5. Traduction de C++ vers Java
    Par Ocean_blue4 dans le forum Langage
    Réponses: 4
    Dernier message: 19/01/2006, 06h52

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