Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

di il
8 risposte

Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

Salve a tutti,
mi spiego meglio perchè nel titolo non sono stata per niente chiara: sto scrivendo un programma con cui vorrei chiamare un file in cui c'è un altro programma che calcola delle cose:un vettore e un double. Preferisco farlo in questo modo piuttosto che inserire il codice nel p. principale perchè questo il programma è davvero molto lungo e mi manderebbe in confusione dato che anche l'altro che lo utilizza è piuttosto lungo. Ora il programma da chiamare in input prende un vettore e alla fine di tutto calcola un double e un vettore di double. Ora, dal momento che non posso fargli dare in output un vettore (cioè con return), se io definisco sia il vettore in input che il vettore e l'altra quantità in output come variabili esterne NEL PROGRAMMA PRINCIPALE ,cioè fuori dal main, può andare?oppure come potrei fare?
Grazie mille per chi avrà la pazienza di rispondermi.

8 Risposte

  • Re: Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

    No, non va assolutamente.

    Se il secondo programma è un eseguibile e non puoi modificarne il sorgente, non potrai utilizzare i dati.
    Altrimenti devi fare in modo che il programma scriva su file i dati elaborati. Così il tuo programma potrà leggerli dal file.
  • Re: Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

    Non e' chiaro che cosa stai chiedendo.

    Mettiamola cosi': ci sono due modi di fare queste cose.

    1) programma (eseguibile) che fa l'elaborazione vera e propria sui dati: legge da file/scrive su file OPPURE legge da standard input/scrive su standard output. Con tutte le possibili combinazioni. Il prgramma principale chiama il secondo programma come SOTTOPROCESSO e passa i dati mediante uno dei meccanismi previsti (file o PIPE per gli standard input/output)
    2) l'elaborazione viene fatta da una funzione di LIBRERIA, che puoi includere nel tuo programma come sorgente, come libreria statica o liberria dinamica

    Ora, se non hai capito nulla di quello che e' stato scritto, non preoccuparti, sono concetti abbastanza raffinati che richiedono di essere gia' smalizianti con la programmazione.

    Per ora segui le seguenti regole:

    1) non si deve mai scrivere un programma come un'unica funzione lunghissima, ma va sempre spezzatto in funzioncine piccole ogn'una che fa una sola cosa. Il tuo programma deve solo COORDINARE l'utilizzo delle tue funzioncine.

    2) commenta sempre il codice: e la chiarezza del codice e' indice della chiarezza del tuo pensiero. Se non hai chiaro che cosa stai facendo, il tuo programma sara' pasticciato e se funziona e' un miracolo

    3) implementa un pezzettino/funzioncina alla volta: non fare tutto in un'unico passo, ma metti tutto assieme SOLO ALLA FINE quando hai implemetato/testato/capito tutti i mattoncini che ti servono per la tua applicazione.

    Un bravo programmatore in generale ragiona proprio cosi:
    1) ha un problema da risolvere
    2) su farta o mentalmente, se e' molto bravo, lo scompone in mattoncini
    3) va a ricuperare i mattoncini piu' complessi su internet, se non li trova li implementa da se
    4) un po' alla volta, partendo dai mattoncini piu' semplici, compone mattoncini piu' grandi e complessi, ed ad ogni passo controlla che quello che ha fatto faccia esattamente quello che si aspetta che faccia (mediante i test)
    5) il programma completo e' semplicemente l'ultimo passo di questo processi di composizione di mattoncini.
  • Re: Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

    Ho provato per esempio a creare una funzione e chiamarla semplicemente dal main ma mi va in loop, forse perché forse sbaglio a passargli gli argomenti o forse ho dichiarato male le variabili, non lo so...sta di fatto che quel programma da solo (quello che vorrei far diventare una funzione da chiamare nel main) funziona benissimo.
    Vorrei davvero evitare di mettere tutto quel blocco nel main perchè già è parecchio incasinato. Ma ormai mi sto quasi rassegnando....
    Come si fa fare il punto 1) della prima lista, Migliorabile?
    La libreria che vorrei implementare funzione grazie ad un vettore e ad un double e con questi due calcola un vettore di double, inoltre stampa anche su un file .txt e sul terminale, quest'ultime cose meno importanti di quella precedente. Fra l'altro non so nemmeno come raggirare il fatto che una funzione non può restituire un array.
  • Re: Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

    Cerca di chiarire perché non si capisce nulla ...

    Hai due sorgenti? Oppure uno dei programmi è compilato?

    Se hai un sorgente da richiamare, puoi raccoglierlo in una funzione e metterlo in un altro file sorgente .cpp da compilare nel tuo progetto insieme agli altri sorgenti.

    Mostra parte del codice vero ... facci capire ...
  • Re: Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

    Hai due sorgenti? Oppure uno dei programmi è compilato?

    Se hai un sorgente da richiamare, puoi raccoglierlo in una funzione e metterlo in un altro file sorgente .cpp da compilare nel tuo progetto insieme agli altri sorgenti.

    Mostra parte del codice vero ... facci capire ...[
    Sì, ho due file .c. (non cpp) . Questo è l'inizio della sorgente dove c'è il main. Il programma che voglio chiamare è "numerov" ,, che qui non metto perchè molto lungo, il quale richiede in input l'energia (e, tipo double) e il potenziale vpot[ ] ( array di double). Alla fine questo programma calcola un array anch'esso di double. Il motivo per cui ho bisogno di fare una funzione o una libreria è che l'energia e il potenziale di volta in volta cambiano. Ho provato prima a fare così:
    
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
    #define pi 3.14156 
    
    int i ; 
    double xmax, dx, ddx12 ,e=0.;
     FILE *out;
     FILE *cisss;
     double *y;
     double x[MSHX+1],  p[MSHX+1], f[MSHX+1],vpot[MSHX+1];
     char fileout[80]= "fileout";
    
     double * numerov (e, vpot[mesh+1]);
     
        
     
    
    int main()
    
    {  printf("Type name of your file\n");
    	scanf("%80s", cinx);
         cisss = fopen(cinx, "w");
    
          xmax=10;
     dx = xmax / MSHX ;
        for(i=0 ; i <= MSHX ; ++i)
        {
    		vpot[i] = (1/2 )* (dx * i) * (dx * i);
    		 
    		
    		}
    		
    		double * y=numerov(e,vpot);
    		  fclose(cisss);
    		printf( "Hello");
    		return 1;
    		}
    		
    
    in modo da far ritornare alla funzione "numerov" il puntatore y così posso riutilizzarlo, oppure ho provato anche a
    sostituire la parte
     double * y=numerov(e,vpot); 
    con
     numerov(); 
    in questo caso dichiarando il vettore che voglio in output in cima al main.

    In realtà originariamente questi sono due file separati, c'era il numerov.c e adesso sto facendo un altro "file.c" dove voglio sfruttare il contenuto del primo, come ho scritto sopra.
  • Re: Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

    Ah ... ecco ... avevo capito che avevi un eseguibile e un sorgente, non due sorgenti.

    Qualche domanda ...

    - Cosa è e quanto vale mesh ? E' una costante?

    - Il vettore finale del calcolo all'interno della funzione numerov come viene allocato?

    Anche se la numerov è molto lunga, non devi riportarla veramente tutta ... bastano le prime righe e la parte del return ... e si trova la soluzione ...
  • Re: Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

    Ah tu stai dicendo di fare il link delle due sorgenti quindi? veramente io avevo messo tutto in una sorgente e creato una funzione. Allora adesso l'ho cambiato. Mesh vale 2000 ed è una costante che ho definito nel file che contiene il main. tutti i vettori hanno dal 0 al 2000 elemento quindi in tutto 2001.
    Quindi ho cambiato il primo file sulla stregua del linking

    File numerov.c:
    
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
        /* Numero massimo di punti nella griglia */
    
    
     double * numerov (double  e, double vpot[2001])
    {
        double sqrt();
    
        int mesh, i, icl,lang;
        int nodes,  ncross,  kkk;
        double xmax, dx, ddx12, xmcl, norm, yicl, djump;
        double elw, eup;
       double * y;
        double x[MSHX+1],  p[MSHX+1], f[MSHX+1];
        char fileout[80]= "fileout";
        FILE *out;
    
    /*
    ** 	Input e inizializzazione della griglia 
    */
        xmax=10;
        lang=0;
       mesh=2000;
        dx = xmax / mesh;
        ddx12 = dx * dx / 12.;
        nodes=1;
    
    
    e finisce con
     return y;
    
    nel main di hartreefock.c invece:
    
    #include <stdio.h> 
    #include <math.h>
    #include <stdlib.h>
    #define MSHX 2000  
    #define mesh 2000
    #define pi 3.14156 
    
    
    double *y;
    int i,Na ; 
    double xmax, dx, ddx12 ,e=0.;
     FILE *out;
     FILE *cisss;
     double x[MSHX+1],  p[MSHX+1], f[MSHX+1],y[MSHX+1],vpo[MSHX+1],phi[MSHX];;
     char fileout[80]= "fileout";
    char cinx[80];
    
     void potenziale(void);
        
     double * numerov (double e,double vpot[MSHX+1]);
    
    int main()
    
    {  printf("Type name of your file\n");
    	scanf("%80s", cinx);
    	fprintf(stderr, "Valore di NA ");
        scanf("%d",&Na);
         cisss = fopen(cinx, "w");
    
          xmax=10;
     dx = xmax / MSHX ;
        for(i=0 ; i <= MSHX ; ++i)
        {
    		vpo[i] = /* Na * (phi [i]) * (phi [i])/( i * dx) * (i * dx) */ (1/2 )* (dx * i)*(dx * i);
    		 
    		
    		}
    		double *y = numerov(e,vpo);
    		  fclose(cisss);
    		printf( "Hello");
    		return 1;
    		}
    		
    
    Li ho linkati così: gcc -o hartree hartreefock.c numerov.c
  • Re: Come definire variabili (vettorinon) a cui viene assegnato il valore in un file chiamato da un altro file principale

    Scusa ma vedo il puntatore

    double * y;

    ma nom vedo quando allochi lo spazio per l'array puntato da y
Devi accedere o registrarti per scrivere nel forum
8 risposte