2015-09-20 28 views
5

Qual è la differenza tra BY CONTENT e BY VALUE in una dichiarazione CALL in COBOL?Qual è la differenza tra BY CONTENT e BY VALUE in un'istruzione CALL?

+0

La domanda deve menzionare sistema operativo e compilatore. Le risposte attualmente includono dettagli che non sono sempre vere per diversi compilatori. Ad esempio, BY VALUE non è sempre limitato a {un "intero" o un valore alfanumerico di un byte) e letterali, e qualsiasi tipo di dati valido può essere passato VALORE in almeno alcuni compilatori COBOL. – user2338816

risposta

6

BY CONTENT su un CALL copierà il contenuto della identificativo per un area di memoria gestita dal compilatore, che verrà quindi passata al programma CALLed "per riferimento" imp lecitamente.

Ciò significa che il programma CALLed può modificare i dati, ma nessuna modifica apportata al programma CALL influirà sui dati originali nel programma CALLing.

Qualsiasi identificativo, di qualsiasi dimensione valido per il compilatore, può essere utilizzato PER CONTENUTO (soggetti a eventuali limiti, se esistenti, che sono documentati per il compilatore specifico - non si sa mai).

Anche se è possibile modificare il valore in un programma CALL, sembrerebbe un po 'oscuro farlo nel migliore dei casi.

BY VALUE è una bestia completamente diversa. È molto limitato, in quanto il valore "passato" può essere un "intero" o un valore alfanumerico di un byte. Può anche essere letterale.

Il PROCEDURE DIVISION USING ... deve sapere, nel caso di VALORE, che lo è, specificandolo in modo equivalente alla CHIAMATA. PER RIFERIMENTO e PER CONTENUTO sulla CHIAMATA sono entrambi DI RIFERIMENTO sulla DIVISIONE PROCEDURA UTILIZZANDO.

Il modo in cui viene implementato dipende dal compilatore specifico. IBM Enterprise COBOL inserisce il valore stesso nella "lista dei parametri".

+0

@ven, grazie, anche se penso che dovrei cercare opportunità per usare la mia nuova parola "manged". –

+0

Sicuramente, il campo di sviluppo di COBOL avrà alcune opportunità per farlo :-). – Ven

1

Il passaggio dei parametri per contenuto equivale a passare per riferimento, tranne che i dati non vengono copiati nella memoria COBOL al termine della chiamata. Significa che la variabile originale non può essere modificata dall'unità chiamata.

Quindi la differenza tra BY CONTENT e BY VALUE è che nel caso di BY VALUE solo il valore viene passato e per questo non tutti i tipi di variabili può essere passato in questo modo, mentre BY CONTENT il puntatore di una variabile copiato viene passato e, in questo modo ogni tipo di variabile può essere passato.

See: http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.visualcobol.eclipseux%2FGUID-EB09203C-3873-4DBE-9298-0C353BC0701A.html

di Riferimento:

Quando un parametro viene passato per riferimento, una copia dell'elemento nella JVM COBOL viene passato al codice nativo. Quando la chiamata al nativo è terminata con , qualsiasi modifica alle informazioni apportate nel codice nativo è copiata nuovamente in JVM COBOL. Tuttavia, ciò significa che la memoria è condivisa tra la JVM e gli ambienti nativi. Infatti, ciò che è effettivamente passato al codice nativo è un puntatore ai dati copiati. Questo è utile se si stanno chiamando programmi non COBOL. Le implicazioni di questo sono molto importanti, in particolare negli ambienti multi-threaded. Eventuali modifiche ai parametri di riferimento non sono visibili a il programma di chiamata COBOL JVM fino al completamento della chiamata. Elementi di gruppo arbitrariamente complessi (entro i limiti di memoria) possono essere passati per riferimento. La definizione del gruppo deve essere identica nel codice sorgente nativo e JVM COBOL e non deve contenere oggetti POINTUTENTE. Stringhe (java.lang.Strings) e tabelle (array java.lang.byte) possono essere passati per riferimento. Tutti gli altri oggetti (i tipi che ereditano da java.lang.Object, inclusi i tipi di valori) non possono essere passati con il riferimento (o per valore - vedi sotto).

Per contenuto

Passaggio di parametri da soddisfare è la stessa di passaggio per riferimento, tranne che i dati non vengono copiati indietro nella memoria JVM COBOL quando la chiamata è completata. Qualsiasi articolo che può essere passato per riferimento può essere passato per contenuto a .

per valore

In JVM COBOL, gli unici elementi che possono essere passati per valore sono le segue: binario a lungo - il tipo consigliato per il passaggio per valore pic x (4) comp-x pic (9) 9 bozzetto pic s (9) 9 bozzetto pic (9) 9 comp-5 pic s (9) 9 comp-5

+0

Non sono d'accordo con te, JVM o nessuna JVM funziona allo stesso modo e contiene le stesse informazioni della risposta accettata. –

+0

Bene, dal punto di vista dei programmi chiamati, sono identici. Il fatto che non vengano copiati è una specie di backwards per dire che sono copiati nell'archiviazione usa e getta e qualsiasi modifica verrà ignorata. –

+0

Grazie, ha aggiornato la risposta per riflettere maggiormente la domanda. –

Problemi correlati