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 :

[LG]Transmission de données entre C et pascal


Sujet :

Langage Pascal

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut [LG]Transmission de données entre C et pascal
    Bonjour !

    je sollicite votre aide pour un pbm qui n'a pas l'air d'etre simple.
    alors si vous aimez les défis, vous allez apprécier !

    g un prog C qui lance un prog pascal compilé en exe (avec la commande "system") mais voilà que pascal détruit et réinitialise tous mes file descriptor, ce qui m'empeche de transmettre des données par buffer entre mon prog C et Pascal.

    Merci d'avance pour votre réponse !!! 8)

    Jér

    PS : si ce n'est pas assez clair, n'hésitez pas à me demander des précisions.

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Est-ce que tu as les sources de ton programme pascal ?
    Si oui, tu peux peut-être envisager de faire passer tes données par ligne de commande. Si tu peux les faire passer par fichier, que tu transmet en input...

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut Codes
    bonjour a toi wormful_sickfoot !

    alors voici le code pascal qui devrait me permettre de récupérer le contenu de mon buffer ;

    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
     
     
     function DosRead(   FileHandle       : integer;
                         BufferLecture    : pointer;
                         LongueurALire    : integer;
                     var LongueurLue      : integer):integer; external;
     
    function DosWrite(    FileHandle      : integer;
                          BufferEcriture  : pointer;
                          LongueurAEcrire : integer;
                     var  LongueurEcrite  : integer):integer; external;
     
    {$i winfile }
    ret := dosread( 5, addr(chainereq[1]), 255, nb_rw );
     
    chainereq[0] := chr( nb_rw );
     
    writeln( 'Ret:', ret, ' Lu:', nb_rw, ' (', chainereq, ')' ); readln;
     
    chainereq := 'ESSAI ecriture';
    ret := doswrite( 4, addr(chainereq[1]), length(chainereq), nb_rw );
     
    writeln( 'FIN TEST ret:', ret, ' nbw:', nb_rw ); readln;
    Mes traces sont bien affichées ms g rien dans "Lu"
    Pas mal ton idée par ligne de commande, j'y avais pensé dans le sens inverse (out) mais j'avais une erreur "1092" critical. Alors je ne sais pas si ça va marcher ms ça ne coute rien.

    Merci de ton aide

  4. #4
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Salut !

    A la place de system, tu as pensé à utiliser exec ou spawn ? Dans l'aide, il est bien spécifié pour exec (et pour spawn) :

    When an exec... function call is made, any open files remain open in the
    child process.
    Or ceci n'est pas indiqué dans l'aide pour system. Le problème ne vient donc pas forcément du programme en Pascal.

    Si tu es sous Windows, tu peux aussi te tourner vers des API Windows telle WinExec.

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut API ou autres commandes
    Bonsoir pascal !

    tout d'abord merci pour ta réponse.
    a mon tour :
    oui, g essayé spawn et meme pbm
    ms pas avec une APÏ de windows, ce qui me parait une bonne idée, je v essayer lundi ! (je ne peux pas avant) et te tiendrai au courant

    @+

  6. #6
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut Re: API ou autres commandes
    Citation Envoyé par jer_the_one
    Bonsoir pascal !
    Pascal ? C'est le nom du langage, pas le mien !

    Les étoiles rouges indiquent que je suis membre de l'équipe de developpez.com (je suis modérateur en l'occurence), et "Rédacteur (Pascal)" signifie que j'ai écrit des choses concernant le langage... Pascal !

    Enfin bon, si tu es sous Windows, le mien est d'utiliser une API, en effet.

    Regarde vers WinExec ou CreateProcess.

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut oups
    ok, excuse moi de t'avoir appelé Pascal, g regardé trop vite.

    hé bien ton idée d'API semble etre la bonne et je cherche dessus depuis ce matin. Avec createProcess et winexec, je n'ai pas réussi car ça me parait trop compliqué pour moi et je ne vois pas comment transmettre mes parametres avec. J'utilise dc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char *parametres;
    HWND handle; //besoin de l'initialiser?(warning)si oui comment?
    parametres ="mes arguments";
    ShellExecute
    (handle,"open","d:\\sys\\reqC.exe",parametres,NULL,SW_HIDE);
    mon soucis se situe toujours côté Pascal. j'essaie un getComandLine ms je ne pense pas tout avoir compris. en tt cas, pascal ne le reconnait pas et il ne trouve pas windows.ppi...

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Il faut créer un processus fils en C (si j'ai bien tout compris), pour celà, il faut modifier le programme C... enfin il me semble...

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut ds la famille api windows, le fils svp !
    ça vaut dire qu'il faut que j'ajoute(avant mon shellexecute je suppose), ds la partie C, un createProcess pour ajouter un fils ms ds mon code pascal, comment je fais ???

    hola, c compliqué tt ça ms motivé !

  10. #10
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Ben après, vu que les fichiers restent ouverts dans les processus fils, il suffit de connaitre le handle du fichier pour y faire les opérations voulues : il faut donc passer le handle du fichier en paramètre. Sous DOS, le handle est un word, sous Windows c'est un cardinal ( il me semble ?).
    Je sais pas si je réponds à coté de la plaque ou pas, car je dois dire que je n'ai pas tout compris au problème. Il faudrait me confirmer si je suis dans le sujet ou pas

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  11. #11
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut je suis pas sur d'avoir compris moi meme ! lol
    tout est une question d'handle ! oui, je pensais à ça aussi et apparemment, ça prouve que tu as bien compris. ms n'étant que débutant en ce qui concerne ce genre de chose(handle), je ne sais meme pas comment on récupère un handle...
    en pascal, ça donne :
    ms apres :

    sinon, je te résume clairement le scénar pour te rassurer (que tu aies bien compris) :
    un prog C lance un prog pascal (compilé en exe) style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shellexecute(handle, "open","d:\\monProg.exe",mes_parametres,NULL,SW_HIDE)
    apres, ds mon code pascal, j'aimerais récupéré ces paramètres et l'en servir. une fois terminé, le prog pascal doit se fermer et redonner la main au prog C. Si ta compris ça, ta tt compris.

    voilà. en attendant des précisions de ta part, je v chercher d trucs sur les handles.

  12. #12
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Alors, pour récupérer les paramètres en pascal, on utilise ParamStr(index:word), qui retourne le paramètre dont l'ordre est égal à index. Tu peux donc transmettre le handle du fichier par paramètre. En C, tu dois pouvoir récupérer le handle assez facilement, par contre en pascal, les handles sont "encapsulés" dans les fichiers (type text, file, et file of). Je crois savoir que les handles sont accessibles en assembleur, docn si tu veux réécrire toutes les fonctions en assembleur c'est possible. Il doit évidemment y avoir des fonctions qui le font déjà, mais là je n'en connais aucune.
    Mais honnetement je pense qu'il existe une solution plus simple : si ton programme C passe le nom du fichier plutot que le handle, ca simplifie grandement les choses. Ainsi ton programme pascal ouvre le fichier avec son nom, et fait les modifications nécessaires.
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  13. #13
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut Au secours !
    Je vois que tu essaie de bien m'expliquer et... g compris !

    seulement, je ne vois pas trop comment mettre ça en application.
    ce que je comprends, c que en pascal,
    ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    handle : word;
    paramStr(?); {j'ai un parametre = 1 chaine de caracteres}
    ou je ne te suis plus :
    tu parles de fichier ms de quoi s'agit il ?
    et ds ta solution + simple ?

    au départ, je voulais que mon prog C inscrive mes parametres ds un fichier texte et récupérer facilement ces parametre en rouvrant le fichier avec pascal ms cet acces fichier ne m'est pas permis car ralenti l'appli (car le parametre sera enorme ultérieurement) ou sauf si ds le fichier, on inscrit seulement une adresse mémoire/handle ms je ne pense pas que cela soit une solution

    En tt cas, je te remercie vraiment de ton aide !

  14. #14
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    En fait il faudrait préciser la nature des données que tu souhaites faire passer :
    • -si elles ne sont pas trop grosses, tu peux les passer en ligne de commande
      -si elles sont trop grosses, tu les écrit dans un fichier, puis tu passes en ligne de commande le nom du fichier à ouvrir, où sont contenues les données


    Si tu n'es pas à l'aise avec les fichiers tu peux consulter un tutoriel, en particulier celui de cyberzoïde, disponible ici
    Dans le cas, où tu passes par un fichier texte intermédiaire, le paramètre à passer est juste le nom du fichier, donc c'est pas très gros comme paramètre... par contre, je ne comprends pas pourquoi tu dis que ca ralentit l'application ensuite

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  15. #15
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut je choisi "ligne de commande"
    en fait, la solution "fichier" n'est pas possible car c une question de hierarchie et la haute suprematie m'a dit "tu n'utiliseras point de fichier"

    dc ce sera ligne de commande ! lol
    alors g côté C
    createProcess
    et shellExecute

    ms coté pascal, je pensais mettre un getCommandLine
    ms ça veut po ou alors je ne fais po bien ?

    tant pis, je dois y aller ms je retente demain matin, faut que je réussisse !

    @+

  16. #16
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Tu es manifestement sous Windows...

    La ligne de commande, c'est bien, mais ça peut se révéler très limité assez rapidement.

    Etudions néanmoins ce cas, car il va servir quoiqu'il arrive.

    Il faut déjà savoir quel type de données tu comptes faire passer. S'il s'agit juste d'une petite chaîne de caractère ou de 3 ou 4 nombres, ça ne posera pas de soucis.

    Partons du fait qu'il s'agit d'un nombre.

    Chaque paramètre est récupéré par le programme en Pascal sous forme de chaîne, c'est imparable. Pour y accéder, tu disposes de deux fonctions : ParamCount qui indique le nombre de paramètres transmis en ligne de commande, et ParamStr(i) qui permet d'accéder au paramètre n°i.

    Ainsi, si on suppose que tu as envoyé n nombres sur la ligne de commande, il va falloir retrouver ces n nombres, en commençant par lire les n chaînes renvoyées par ParamStr, puis en les transformant en nombre réellement.
    Je vais supposer ici que tu n'utilises pas Delphi, et on va se limiter aux fonctions standards du Pascal. Donc, pour transformer une chaîne en nombre, on se sert de la procédure Val (tu peux consulter la F.A.Q pour plus de détails).

    Voilà donc le résultat :
    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
     
    var
      Nombres: array[1..10] of Integer; { Pas plus de 10 nombres }
      e: Integer; { Une variable pour stocker les erreurs }
      i: Integer; { On compteur }
    begin
    { On lit chaque paramètre }
    for i := 1 to ParamCount do
      begin
      { Transformation en nombre }
      Val(ParamStr(i), Nombres[i], e);
      if e <> 0 then { Si erreur... }
        begin
        { Afficher une erreur ici }
        end;
      end;
    end;
    Si on considère maintenant que tu veux transférer une chaîne, il faut prendre en compte certaines choses. En effet, chaque paramètre est séparé du précédent par un espace. Donc, si ta chaîne comporte des espaces, elle sera répartie sur plusieurs paramètres ! Deux solutions alors. Soit tu remplaces tous les espaces de ta chaîne source par un autre caractère ou ensemble de caractères (un # par exemple, si ta chaîne n'en contient pas, etc...), soit tu recolles les morceaux en sorties, en faisant débuter ta chaîne par des guillements " et en la fermant avec des guillements pour la repérer.


    Mais revenons à la source du problème : la quantité de données. Si celle-ci est très importante ou contient des choses bien spécifiques, ça va coincer sur la ligne de commande ! Il va falloir utiliser une autre technique : le partage de ressources.

    Pour ça, il faut déclarer une zone mémoire partagée, et passer à ton application en Pascal le handle (le numéro d'accès) à cette zone mémoire.

    Je te laisse consulter les API et éventuellement le forum Windows pour plus de détails.

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  17. #17
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut quel cours
    tu m'as donnée un leçon là et t'en remercie.
    en tt cas, tu étudies toutes les possibilités et je pense que cela pourra servir aussi à d'autres personnes.

    en effet, je suis (ou j'étais ) confronté aux problèmes des esapces dans la chaine de caracteres parametres et la longueur de la chaine.
    donc, j'en deduit qu'il me faudra utiliser la solution "mémoire partagée".

    il ne me reste plus qu'à me documenter alors.

    @+

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

Discussions similaires

  1. Transmission de données entre Thread
    Par demcoul dans le forum Général Java
    Réponses: 1
    Dernier message: 03/11/2008, 23h47
  2. Réponses: 3
    Dernier message: 11/08/2008, 09h56
  3. Transmission de donnée entre le 68hc11 et un PC
    Par moumouss dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/12/2007, 21h23
  4. transmission des données entre ASP et le serveur
    Par mademoizel dans le forum ASP
    Réponses: 3
    Dernier message: 17/12/2006, 20h11
  5. [C#]Transmission de données entre forms
    Par fafa139 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/05/2006, 18h44

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