Forum iSeries, hébergé par xdocs400.com

As400, iSeries, i5, System i, une machine qui évolue pour être de plus en plus puissante.

Vous n'êtes pas identifié(e).

Annonce

ATTENTION : Le système anti-spam est à nouveau opérationnel. Nous avons réactivé les inscriptions.

#1 2018-09-12 16:20:53

Vincent
Membre
Inscription : 2018-09-12
Messages : 3

Passage de variable par copie

Bonjour à tous,

Je commence à utiliser les pointeurs et je fais quelques tests.
Lors d'un des tests je n'ai pas eu le résultat attendu sans vraiment comprendre pourquoi, je m'explique.

J'ai deux programmes testptr et testptrc dont voici le contenu:

testptr :

  *Ds client test                                            
 DdsClient         ds                  qualified             
 Dnom                            30a                         
 Dprenom                         30a                         
                                                             
 D client          ds                  likeds(DsClient)      
 D                                     based(ptrClient)      
                                                             
 DmodifNom         pr                  EXTPGM('TESTPTRC')    
 Dclient                               likeds(dsClient) const
                                                             
   ptrClient = %alloc(%size(client));                        
                                                             
   client.nom = 'MOUSQUETAIRE';                                   
   client.prenom = 'ALBERT';  
 
   callp modifNom(client);
                       
*inlr = *on;                                        

testptrc :

 *Ds pour les clients                               
DdsClient         ds                  qualified     
Dnom                            30a                 
Dprenom                         30a                 
C     *entry        plist                           
C                   parm                    dsClient
  dsclient.nom = 'CINQUIEME';                            
  *inlr = *on;                                      

Dans mon esprit comme je mets le mot clé const dans le prototype de l'appel du programme testptrc la ds client devrait être passé par copie.
Hors après l'appel de modifNom, je me retrouve avec la zone client.nom à CINQUIEME.

Si quelqu'un pouvait m'allumer la lumière.

Cordialement,

Vincent.


Vincent

Hors ligne

#2 2018-09-13 09:34:48

vazymimil
Membre
Inscription : 2008-10-15
Messages : 167

Re : Passage de variable par copie

Bonjour,

Le mot clé CONST ne fait pas pas systématiquement de copie de données, contrairement à VALUE, et notamment pas si le type est identique à celui du prototype.
Le mot clé CONST du point de vu de l'appelant une sorte de promesse que l'appelé ne modifiera pas la valeur. Et si l'appelé est compilé avec ce prototype le compilateur vérifie cette promesse autant que possible.
C'est pour ça entre autre que quand on utilise un prototype d'un côté il est préférable de le partager des deux côtés avec des /copy.


Nicolas

Hors ligne

#3 2018-09-13 14:03:05

Vincent
Membre
Inscription : 2018-09-12
Messages : 3

Re : Passage de variable par copie

Bonjour Vasymimil,

J'ai essayé de mettre en application tes remarques.

j'ai donc un créer un membre testptrcpy avec le prototype du programme appelé testptrc.
Je l'ai rajouté dans les deux programmes testptr, et testptrc.
J'obtiens le même résultat que précédemment.

Le code ci dessous :

testptrcpy

DmodifNom         pr                  EXTPGM('TESTPTRC')    
Dclient                               likeds(dsClient) const

testptr

  /COPY GCFSTD/QRPGLECPY,CARTEH                        
  /COPY VBRENNER/QRPGLECPY,TESTPTRCPY                  
  *Ds client test                                      
 DdsClient         ds                  qualified       
 Dnom                            30a                   
 Dprenom                         30a                   
                                                       
 D client          ds                  likeds(DsClient)
 D                                     based(ptrClient)
                                                       
   ptrClient = %alloc(%size(client));                  
                                                       
   client.nom = 'MOUSQUETAIRE';                             
   client.prenom = 'ALBERT';                          
                                                       
   callp modifNom(client);     
   *inlr = *on;                        

testptrc

  *===============================================================*
  /COPY GCFSTD/QRPGLECPY,CARTEH                                    
  *===============================================================*
  /COPY QRPGLECPY,DATASCPY                                         
  /COPY VBRENNER/QRPGLECPY,TESTPTRCPY                              
  *==============================================================* 
  *Ds pour les clients                                             
 DdsClient         ds                  qualified                   
 Dnom                            30a                               
 Dprenom                         30a                               
 C     *entry        plist                                         
 C                   parm                    dsClient              
   dsclient.nom = 'CINQUIEME';                                          
   *inlr = *on;                                                    

Vincent


Vincent

Hors ligne

#4 2018-09-13 14:35:28

vazymimil
Membre
Inscription : 2008-10-15
Messages : 167

Re : Passage de variable par copie

Il faut enlever l'*ENTRY PLIST et déclarer une interface de procédure à la place, avec le mot clé CONST


Nicolas

Hors ligne

#5 2018-09-13 15:26:43

Vincent
Membre
Inscription : 2018-09-12
Messages : 3

Re : Passage de variable par copie

Du coup ça passe pas à la compilation et il me prévient que je ne peux pas modifier la variable.


Merci Nicolas !


Vincent

Hors ligne

Pied de page des forums