Programma in C - Errore nei dati in uscita.

di il
5 risposte

Programma in C - Errore nei dati in uscita.

Salve, mi presento ,mi chiamo Antonio e dopo qualche anno di inattività ho ricominciato ad utilizzare nuovamente C. Magari per chi è esperto questo post è inutile, però per un nuovamente principiante come me con questo posso solo trarre informazioni utili sui miei errori.
Il gcc è pulito. L'esecuzione non rispetta i risultati previsti. Sto usando Devc++ per Windows 7.
//Risolvere il problema della distribuzione di calore per una barra di alluminio di lunghezza L = 1m con condizioni di bordo ed iniziali note

#include <stdio.h>                                                               
#include <stdlib.h>

int main ()
{ int nx=101, nt=50;          // Formato griglia
double dx=0.01, dt=0.1;       // Passo
double kappa=0.12;            // conduttività termica
double cal=0.113;             // calore specifico
double rho=7.8;               // densità alluminio
double cons=(kappa*dt)/(cal*rho*dx*dx);  
double matrix[nx][nt];
int ix;
int t;
FILE *output;
    int ch=20; 
    char out[ch];
    
printf("Inserisci nome output\n");
scanf("%s",out);
output = fopen(out,"w");


for (ix=1; ix<nx-1; ix++) {
    matrix[ix][0]=100.; 
   } //Inizializzazione
matrix[0][0] = 0.;
matrix[0][50] = 0.;
matrix[nx-1][0] = 0.;
matrix[nx-1][50] = 0.;

if (cons >=0.25)
   fprintf(output,"La soluzione dell'equazione differenziale diverge->%lf\n",cons);
else 
   fprintf(output,"Procediamo. La costante rientra nei parametri->%lf \n",cons);

   for (t=0; t<=nt; t++)
   {
    for (ix=0; ix<=nx-1; ix++)
     {matrix[ix][t+1]= matrix[ix][t]+cons*(matrix[ix+1][t]+matrix[ix-1][t]-2.*matrix [ix][t]);
     if (t%10==0|| t==50)
     {for (ix=0; ix<=nx; ix++)
     fprintf(output," %d\n",matrix[ix][t]);
     for (ix=1; ix<=nx-1; ix++) 
     {
         matrix[ix][0] = matrix[ix][50];}
         fprintf(output,"%d \n",matrix[ix][t]);
         }
     fclose(output);
}
}
}

     
     

5 Risposte

  • Re: Programma in C - Errore nei dati in uscita.

    Occhio agli indici che usi per le matrici ...

    1) Non puoi scrivere [50] perché il valore più grande che puoi usare è [49]

    2) Se nella riga

    matrix[ix][t+1]= matrix[ix][t]+cons*(matrix[ix+1][t]+matrix[ix-1][t]-2.*matrix [ix][t]);

    accedi con [t+1] e [ix+1] allora devi correggere le for eliminando l' =

    for (t=0; t<nt; t++)
    {
    for (ix=0; ix<nx-1; ix++)
  • Re: Programma in C - Errore nei dati in uscita.

    oregon ha scritto:


    Occhio agli indici che usi per le matrici ...

    1) Non puoi scrivere [50] perché il valore più grande che puoi usare è [49]

    2) Se nella riga

    matrix[ix][t+1]= matrix[ix][t]+cons*(matrix[ix+1][t]+matrix[ix-1][t]-2.*matrix [ix][t]);

    accedi con [t+1] e [ix+1] allora devi correggere le for eliminando l' =

    for (t=0; t<nt; t++)
    {
    for (ix=0; ix<nx-1; ix++)

    Innanzitutto grazie per l'attenzione, ho applicato i tuoi suggerimenti però il risultato non cambia. Tutti zero in uscita, come se l'fprintf non rilevasse l'istruzione del ciclo. Le parentesi sembrano comunque al posto giusto...
    //Risolvere il problema della distribuzione di calore per una barra di alluminio di lunghezza L = 1m con condizioni di bordo ed iniziali note
    
    #include <stdio.h>                                                               
    #include <stdlib.h>
    
    int main ()
    { int nx=101, nt=51;          // Formato griglia
    double dx=0.01, dt=0.1;       // Passo
    double kappa=0.12;            // conduttività termica
    double cal=0.113;             // calore specifico
    double rho=7.8;               // densità alluminio
    double cons=(kappa*dt)/(cal*rho*dx*dx);  
    double matrix[nx][nt];
    int ix;
    int t;
    FILE *output;
        int ch=20; 
        char out[ch];
        
    printf("Inserisci nome output\n");
    scanf("%s",out);
    output = fopen(out,"w");
    
    
    for (ix=1; ix<nx; ix++) {
        matrix[ix][0]=100.; 
        fprintf(output,"%d\n",matrix[ix][0]);  
        } //Inizializzazione
    matrix[0][0] = 0.;
    matrix[0][51] = 0.;
    matrix[nx-1][0] = 0.;
    matrix[nx-1][51] = 0.;
    
    if (cons >=0.25)
       fprintf(output,"La soluzione dell'equazione differenziale diverge->%lf\n",cons);
    else 
       fprintf(output,"Procediamo. La costante rientra nei parametri->%lf \n",cons);
    
    
    
       for (t=0; t<=nt; t++)
       {
        for (ix=0; ix<nx-1; ix++)
         {matrix[ix][t+1]= matrix[ix][t]+cons*(matrix[ix+1][t]+matrix[ix-1][t]-2.*matrix [ix][t]);
         if (t%10==0|| t==50)
         {for (ix=0; ix<nx; ix++)
         fprintf(output," %d\n",matrix[ix][t]);
         for (ix=1; ix<nx-1; ix++)
         {
             matrix[ix][0] = matrix[ix][51];}
             fprintf(output,"%d \n",matrix[ix][t]);
             }
         fclose(output);
    }
    }
    }
    
          
  • Re: Programma in C - Errore nei dati in uscita.

    Come prima, non puoi usare l'elemento [51] perché non esiste.
  • Re: Programma in C - Errore nei dati in uscita.

    Quindi se dichiaro che nt = 51 nell'inizializzazione devo scrivere
    matrix[0][0] = 0.;
    matrix[0][50] = 0.;
    matrix[nx-1][0] = 0.;
    matrix[nx-1][50] = 0.;
    e conseguentemente anche nei cicli modificare appropriatamente.

    Il punto è che anche con tali accorgimenti l'output mi restituisce solo zeri. :/
  • Re: Programma in C - Errore nei dati in uscita.

    Sì ... in C se dici che ci sono 51 elementi, l'indice va da 0 a 50.

    Se poi il tuo calcolo in questo modo fallisce, non so cosa dirti perché non conosco i dettagli del tuo calcolo (ad esempio, non so quali sono i risultati corretti ...)
Devi accedere o registrarti per scrivere nel forum
5 risposte