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

z/OS Discussion :

[C/ASM] Passage de paramètres entre sous-tâches


Sujet :

z/OS

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut [C/ASM] Passage de paramètres entre sous-tâches
    On sait jamais, je tente ma chance au cas où il y ait un expert du C/ASM dans le coin...

    J'ai un programme C qui lance une sous-tâche (nouveau TCB) à travers la macro ATTACHX. J'ai un code assembleur qui est appelable à partir d'un programme C qui fait ca très bien.

    Le problème est que je voudrais passer des paramètres à cette sous-tâche. Pour cela, il y a le paramètre PARAM à la macro ATTACHX. je passe donc l'adresse de la variable que je veux passer. Cependant, dans mon programme C, que j'appelle en sous-tâche, je ne récupère pas la bonne valeur...

    Mon programme C est sous la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(void * param) {
    ...
    }
    La valeur de param est alors 1, et non l'adresse en mémoire de la variable passée en paramètre...

    Théoriquement, le paramètre devrait être dans le registre 1, mais aucun moyen de vérifier puisque c'est un code C (je ne sais d'ailleurs pas si on peut tracer un programme C :o , il doit y avoir un moyen certainement)...

    Avez-vous une idée sur le problème ? Qu'est-ce que je fais mal ?...

    Merci d'avance !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 63
    Points : 93
    Points
    93
    Par défaut
    salut,

    y en a des choses a apprendre sur ce système !! (et en 97 on me disait "dans 5 ans y aura plus de pupitreur, plus de mvs", moi je dis je partirai à la retraite il sera tj là ce bon vieux mvs)

    ca peut t'aider ?
    Input register information

    If you want to pass a parameter list to the new task without coding the PARAM or
    MF=E parameter, general purpose register (GPR) 1 must contain the address of the
    list on entry to ATTACH or ATTACHX. Otherwise, before issuing the ATTACH or
    ATTACHX macro, the caller does not have to place any information into any register
    unless using it in register notation for a particular parameter, or using it as a base
    register.
    ta liste est peut-être mal construite. ne faudrait-il pas mettre 2 void * ?

    ++

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Hello,

    Merci pour ta réponse. Effectivement j'ai essayé avec 2 pointer, j'arrive à récupérer des infos mais je pense qu'elles ne sont pas valides.

    En réalité, pour ce genre de problèmes (appel d'un code HLL à partir d'un langage plus bas comme ASM & REXX), il faut passer par la fonction C __osplist(). L'équivalent existe pour Fortran, PL/I, Cobol. Voir la doc "Language Environment Programming Guide" (SA22-7561-0x), Appendix D. Operating System and Subsystem Parameter List Formats

    (Fallait l'trouver !!)

    Je posterai un code dès que j'ai quelque chose qui marche

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Ca y est, ca marche (après pas mal de souffrance...). Voici le code, qui est loin d'être parfait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #pragma runopts(PLIST(OS))                                 
    #include <stdio.h>                                         
    #include <stdlib.h>                                        
    #include <unistd.h>                                        
                                                               
    int main(int arcg, char** argv) {                          
      printf("My name is '%s'\n", argv[0]);                    
                                                               
      struct CommArea ** p = (struct CommArea **) __osplist[0];
      struct CommArea * comm = (struct CommArea *) (*p);       
      printf("ADDR of CommArea %lu\n", &comm);                 
    }
    Notez le #pragma runopts au début, qui définit la façon dont MVS passe les paramètres au module, puis l'utilisation de __osplist... J'ai un pointeur sur pointeur pour l'instant mais j'espère arranger ça dans ma routine assembleur car pas très propre...

Discussions similaires

  1. Passage de paramètres entre sous-états
    Par zycomatic dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 28/04/2017, 00h36
  2. [AC-2003] Passage de paramètres entre 2 sous-états
    Par madmox dans le forum IHM
    Réponses: 2
    Dernier message: 10/08/2010, 09h53
  3. Réponses: 10
    Dernier message: 06/03/2008, 16h24
  4. [jsp][servlet]passage de paramètre entre deux frames
    Par alexandra_ape dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 29/06/2004, 11h14
  5. [Forms]Passage de paramètre entre Forms et Reports
    Par jack554 dans le forum Reports
    Réponses: 4
    Dernier message: 30/03/2004, 13h58

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