Discussione:
passare parametro puntatore e gruppi di attivazione
(troppo vecchio per rispondere)
Enigmista
2016-11-04 11:20:26 UTC
Permalink
Buongiorno.
Ho programma RPGLE CHIAMANTE DFTACTGRP(*NO) ACTGRP(*NEW).
programma RPGLE CHIAMATO (creato con il CRTBNDRPG) , tra i parametri mi
restituisce un puntatore a una chiave un record di file.

Se CHIAMATO lo compilo ACTGRP(*NO) ACTGRP(*CALLER) o DFTACTGRP(*YES) il
puntatore mi ritorna e riesco a reperire CHIAVE su CHIAMANTE.
Se CHIAMATO lo compilo ACTGRP(*NO) ACTGRP(*NEW) mi viene restituito MCH3402
"si è tentato di far riferimento ad un oggetto che non esiste più"

Da cui ne deriva che se passo da un Gruppo di attivazione *NEW ad un altro
*NEW perdo il puntatore all'area di memoria (ad esempio passo da un ACTGRP
N° 000000000000007C a un ACTGRP N° 000000000000007E)

Ma comunque anche quando passo da un *NEW a un DFTACTGRP(*YES) mi cambia il
N° del gruppo di attivazione ( ad esempio da un ACTGRP N° 000000000000008D
ad un ACTGRP N° 0000000000000002).

Probabilemente però DFTACTGRP(*YES) è un gruppo di attivazione speciale.

Può darsi che queste particolarità sui puntatori siano uno dei motivi per
cui in passato Obelix espresse il suo sdegno nei confronti dell'uso dei
puntatori per passare parametri, non so chiedo conferma :)

O forse non li sto usando e non li so usare io nella maniera corretta ,
oltre ad avere una conoscenza sui gruppi di attivazione molto a grandi
linee.

Sono graditi approfondimenti sull'argomento dai vari esperti del NG.

Grazie.
Obelix
2016-11-05 09:57:41 UTC
Permalink
Post by Enigmista
Se CHIAMATO lo compilo ACTGRP(*NO) ACTGRP(*NEW) mi viene restituito
MCH3402 "si è tentato di far riferimento ad un oggetto che non esiste più"
IMHO, se usi un programma Con ACTGRP(*NEW), alla chiusura dello stesso
il gruppo di attivazione viene dereferenziato, per cui il puntatore none
' piu' valido (fa riferiento ad un'area di meoria che e' stata deallocata).
Post by Enigmista
Post by Enigmista
Può darsi che queste particolarità sui puntatori siano uno dei
motivi per cui in passato Obelix espresse il suo sdegno nei
confronti dell'uso dei puntatori per passare parametri
Il mio 'sdegno' piu' che altro era per il fatto che un puntatore punta a
*qualsiasi merda* (tm) per cui la validazione del 'gli sto passando il
parametro che lui si aspetta' va allegramente a puttane (formalmente,
si, lui si aspetta un puntatore, ma a cosa punti il puntatore, beh, son
due cose diverse...)

Tipo: mi aspetto un puntatore ad un nuemro, mi passano unpuntatore ad
una stringa.... il compilatore non ti dice una beata fava.

Lo *so* che i programmatori C/C++/Java e via cantando lo considerano
figo, pero' so anche che genera errori divertentissimi (Bazinga) da
debuggare.

Oltretuto, come spesso nel caso delle API, tutto quello che ottieni
indietro e' un bel 'non mi piacciono i dati che mi hai passato' senza
sapere di che [beep] stiamo pirlando...
stefano[dot]tassi[at]dedagroup[dot]it
2016-11-05 13:28:37 UTC
Permalink
Post by Obelix
Post by Enigmista
Se CHIAMATO lo compilo ACTGRP(*NO) ACTGRP(*NEW) mi viene restituito
MCH3402 "si è tentato di far riferimento ad un oggetto che non esiste più"
IMHO, se usi un programma Con ACTGRP(*NEW), alla chiusura dello stesso
il gruppo di attivazione viene dereferenziato, per cui il puntatore none
' piu' valido (fa riferiento ad un'area di meoria che e' stata deallocata).
Post by Enigmista
Post by Enigmista
Può darsi che queste particolarità sui puntatori siano uno dei
motivi per cui in passato Obelix espresse il suo sdegno nei
confronti dell'uso dei puntatori per passare parametri
Il mio 'sdegno' piu' che altro era per il fatto che un puntatore punta a
*qualsiasi merda* (tm) per cui la validazione del 'gli sto passando il
parametro che lui si aspetta' va allegramente a puttane (formalmente,
si, lui si aspetta un puntatore, ma a cosa punti il puntatore, beh, son
due cose diverse...)
Tipo: mi aspetto un puntatore ad un nuemro, mi passano unpuntatore ad
una stringa.... il compilatore non ti dice una beata fava.
Lo *so* che i programmatori C/C++/Java e via cantando lo considerano
figo, pero' so anche che genera errori divertentissimi (Bazinga) da
debuggare.
Oltretuto, come spesso nel caso delle API, tutto quello che ottieni
indietro e' un bel 'non mi piacciono i dati che mi hai passato' senza
sapere di che [beep] stiamo pirlando...
eppoi, vogliamo dircela tutta?
passare una variabile by-reference == passare il pointer

Ciao!
--
http://www.linkedin.com/in/stefanotassi


Programming today is a race between software engineers striving to
build bigger and better idiotproof programs, and the Universe trying
to produce bigger and better idiots. So far the Universe is winning.
(Rick Cook)
Obelix
2016-11-07 08:11:48 UTC
Permalink
Post by stefano[dot]tassi[at]dedagroup[dot]it
eppoi, vogliamo dircela tutta?
passare una variabile by-reference == passare il pointer
Yup. Vogliamo dircela tutta??? Passa *sempre* un puntatore,
indipendentemente dal tipo di parametro che stai usando...

Pero' ci sono i controlli....
Enigmista
2016-11-07 09:47:44 UTC
Permalink
Post by Obelix
Il mio 'sdegno' piu' che altro era per il fatto che un puntatore punta a
*qualsiasi merda* (tm) per cui la validazione del 'gli sto passando il
parametro che lui si aspetta' va allegramente a puttane (formalmente, si,
lui si aspetta un puntatore, ma a cosa punti il puntatore, beh, son due
cose diverse...)
Tipo: mi aspetto un puntatore ad un nuemro, mi passano unpuntatore ad una
stringa.... il compilatore non ti dice una beata fava.
Lo *so* che i programmatori C/C++/Java e via cantando lo considerano figo,
pero' so anche che genera errori divertentissimi (Bazinga) da debuggare.
Oltretuto, come spesso nel caso delle API, tutto quello che ottieni
indietro e' un bel 'non mi piacciono i dati che mi hai passato' senza
sapere di che [beep] stiamo pirlando...
Spesso uso puntatori suprattutto con le funzioni di SRVPGM quando devo
passare il riferimento della chiave di un file per individuare un record, e
tale chiave è composta da numerosi campi: invece che stare lì a definirmi
tutti i campi sulla definizione procedura e sulla procedure interface, gli
passavo un puntatore che puntava sia sul chiamante che sulla sottoprocedura
a una ds extname chiave del file, quindi solo una questione di comodità.
Inoltre il puntatore alla DS mi risolveva anche il fatto se il numero di
parametri variava ricompilando chiamante e sottoprocedura riallineo il
tutto.
Comunque, anche se per ora non ho avuto problemi, grazie alle tue
osservazioni e a quanto ho constatato nel passaggio puntatore tra due
programmi di cui il chiamato su gruppo di attivazione *new, credo che
riconsidero il passaggio paramentri campo per campo, se possibile by
reference.
Obelix
2016-11-07 10:19:20 UTC
Permalink
Post by Enigmista
Spesso uso puntatori suprattutto con le funzioni di SRVPGM quando devo
passare il riferimento della chiave di un file per individuare un
record, e tale chiave è composta da numerosi campi: invece che stare lì
a definirmi tutti i campi sulla definizione procedura e sulla procedure
interface, gli passavo un puntatore che puntava sia sul chiamante che
sulla sottoprocedura a una ds extname chiave del file, quindi solo una
A quelpunto li', passagli direttamente la DS Definita come
LikeREc(fmt:*key) che ti offre gli stessi vantaggi, ma non devi
codificare millemila parametri...
stefano[dot]tassi[at]dedagroup[dot]it
2016-11-07 10:21:52 UTC
Permalink
Post by Obelix
Post by Enigmista
Spesso uso puntatori suprattutto con le funzioni di SRVPGM quando devo
passare il riferimento della chiave di un file per individuare un
record, e tale chiave è composta da numerosi campi: invece che stare lì
a definirmi tutti i campi sulla definizione procedura e sulla procedure
interface, gli passavo un puntatore che puntava sia sul chiamante che
sulla sottoprocedura a una ds extname chiave del file, quindi solo una
A quelpunto li', passagli direttamente la DS Definita come
LikeREc(fmt:*key) che ti offre gli stessi vantaggi, ma non devi
codificare millemila parametri...
+1
--
http://www.linkedin.com/in/stefanotassi


Programming today is a race between software engineers striving to
build bigger and better idiotproof programs, and the Universe trying
to produce bigger and better idiots. So far the Universe is winning.
(Rick Cook)
Enigmista
2016-11-07 11:28:19 UTC
Permalink
Post by Obelix
Post by Enigmista
Spesso uso puntatori suprattutto con le funzioni di SRVPGM quando devo
passare il riferimento della chiave di un file per individuare un
record, e tale chiave è composta da numerosi campi: invece che stare lì
a definirmi tutti i campi sulla definizione procedura e sulla procedure
interface, gli passavo un puntatore che puntava sia sul chiamante che
sulla sottoprocedura a una ds extname chiave del file, quindi solo una
A quelpunto li', passagli direttamente la DS Definita come
LikeREc(fmt:*key) che ti offre gli stessi vantaggi, ma non devi codificare
millemila parametri...
Ottimo, non ho mai approfondito e usato LikeRec, ritenendolo
superficialmente analogo a Extname, ma se può essere usato in questo modo
ora capisco la profonda differenza tra i due.
Grazie mille!

Loading...