Domanda

Ho una domanda con la parte dichiarativa, la funzione e pacchetti. Ho un pacchetto come mostrato di seguito. A causa della complessità della funzione Compute_X1, ho creare un "separato" per calcolare questa funzione. Il valore restituito da Compute_X1 è X1 e deve essere utilizzato nella funzione J21 (J21 prende X1 come primo argomento).

specifica pacchetto:

package Compute_Jacobian is

--compute X1
function Compute_X1 ( Force_Applied, Forcing_Frequency: Long_Float) return Long_Float;

--- use X1 in J21
function J21 ( X1, Forcing_Frequency, Natural_Frequency : Long_Float) return Long_Float;

end Compute_Jacobian;

Il corpo del pacchetto è:

package body Compute_Jacobian is
 --compute X1

function Compute_X1 ( Force_Applied, Forcing_Frequency: Long_Float) return Long_Float is separate;

X1 := Compute_X1 ( Force_Applied, Forcing_Frequency);


function J21 ( X1, Forcing_Frequency, Natural_Frequency : Long_Float) return Long_Float is separate;

end Compute_Jacobian;

e ho creato stub per Compute_X1 e J21.

Sulla compilazione del corpo del pacchetto Compute_Jacobian.adb, ottengo questo messaggio di errore:

12.    X1 := Compute_X1 ( Force_Applied, Forcing_Frequency);
       |
    >>> statement not allowed in declarative part

La mia domanda è come calcolare X1 e utilizzarlo nel calcolo della funzione J21.

ho potuto provare a calcolare X1 nel codice "principale" (non mostrato qui) direttamente (facendo un "è separata" da lì) e quindi utilizzarlo come un argomento normale nel calcolo J21. Ma io volevo la struttura sopra (nel mio post sopra qui) con calcolo della X1 nel pacchetto Compute_Jacobian.

Grazie mille ...

È stato utile?

Soluzione

Bene, il compilatore sta dicendo esattamente qual è il problema: -)

Si sta cercando di execute un'istruzione di assegnazione in una regione del codice che consente solo dichiarazioni .

Per lo meno non vedo la vostra dichiarazione di X1 (anche se questo può essere dovuto al fatto che non estratto nel codice sopra), né mi vedo dichiarazioni e valori essere assegnati a Force_Applied e Forcing_Frequency.

Questo può essere risolto in modo che esso si compila vicino a come sono:

X1 : Long_Float := Compute_X1 ( Force_Applied, Forcing_Frequency);

o, aggiungendo un blocco di inizializzazione per il corpo pacchetto:

package body Computer_Jacobian is
    ...
    X1 : Long_Float;
    ...
begin
   X1 := Compute_X1 ( Force_Applied, Forcing_Frequency);
end Compute_Jacobian;

Ma, onestamente, io davvero non credo che uno di questi è quello che si vuole veramente.

Nel programma principale si può solo dichiarare X1 (e le variabili di essere passati come argomenti) e quindi richiamare le funzioni di calcolo, ad esempio (Attenzione, non compilato)

with Compute_Jacobian;
procedure Do_Computations is

  Force_Applied     : Long_Float := 1.0;
  Forcing_Frequency : Long_Float := 10.0;
  Natural_Frequency : Long_Float := 5.0;

  X1  : Long_Float;
  J21 : Long_Float;

begin
   X1  := Compute_Jacobian.Compute_X1 (Force_Applied, Forcing_Frequency);
   J21 := Compute_Jacobian.Compute_J21 (X1, Forcing_Frequency, Natural_Frequency);
end Do_Computations;

Questo è un approccio per ottenere quello che si potrebbe essere alla ricerca di.

Se X1 viene utilizzata esclusivamente all'interno Compute_J21, si dovrebbe solo Invoke Compute_X1 come una delle prime dichiarazioni eseguito (o come l'inizializzazione della dichiarazione X1) all'interno di tale funzione (e passa Force_Applied, invece di X1, come argomento per Compute_J21):

function Compute_J21 (Force_Applied, 
                      Forcing_Frequency,
                      Natural_Frequency : Long_Float)
                                   return Long_Float is

   -- Declarations...
   X1 : Long_Float := Compute_X1(Force_Applied, Forcing_Frequency);

begin
   -- Computations that utilize X1...

end Compute_J21;

E una nota circa l'uso di "è separata" ... Capisco la voglia di impostare quelle implementazioni di funzionalità a parte a causa della loro complessità, ma io consiglierei comunque di non farlo. Si aggiunge semplicemente un altro file per tenere traccia di, se si sta utilizzando GNAT non si ottiene alcun guadagno di prestazioni da solo cercando di compilare separatamente poiché l'intero estremità del corpo pacchetto per ottenere elaborati in ogni caso, e l'utilizzo "è separato" è ora piuttosto rara, nell'ambito della programmazione Ada. Questa risposta coperto una parte di questo in una domanda precedente che avevi chiesto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top