PDA

Visualizza versione completa : [C]Dove sbaglio?


comm64
26-04-2007, 13.35.58
Salve ho dei problemi con questo codice(quando chiamo la funzione stampa mi stampa tutti 0)
void video(int** A,int n);


int main(int argc, char *argv[])
{
int m;
int i,j;
double **matrice;

printf("Inserisci la dimensione della matrice: \n");
scanf("%d",&m);
int n=m+1;
double b[n+1]; //vettore dei termini noti
matrice=calloc(n,sizeof(double*));

double cont;

for (i=0;i<=n;++i){
matrice[i]=calloc(n+1,sizeof(double));
}

for(i=1;i<n;i++)
{
for (j=1;j<n;j++)
{
matrice[i][j]=cont;
// printf("%f\t",matrice[i][j]);
cont++;
}

// printf("\n\n\n");
}
video(matrice,n);


system("PAUSE");
return 0;
}
void video(int** A,int n)
{
int i;
int j;
for(i=1;i<n;i++)
{

for (j=1;j<n;j++)
{
printf("%f\t",A[i][j]);
}
printf("\n\n\n");
}
}


AIUTO!

comm64
26-04-2007, 17.20.27
Ragazzi ho risolto, avevo sbagliato il prototipo delle funzione era double!


PS: qualcuno sa come si passa un file ad una funzione?

Non l'ho trovato da nessuna parte!

UG0_BOSS
26-04-2007, 17.40.34
PS: qualcuno sa come si passa un file ad una funzione?
Non l'ho trovato da nessuna parte!

Beh, prima devi aprire il file. Per farlo devi avere un puntatore a variabile di tipo FILE:
FILE *pDati;

Poi usare la funzione fopen:
pDati = fopen("modalità", "nomefile");

A questo punto il file sarà aperto ed utilizzabile tramite il puntatore pDati.

http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.12.html

comm64
26-04-2007, 18.20.47
ciao Ugo, grazie per avermi risposto,

ho quasi sistemato....

devo solo capire come fare a contare gli elementi che sono contenuti del file( nel mio caso è una matrice quadrata di double) e quindi mi basterebbe sapere solo le righe o solo le colonne per poi andare a creare dinamicamente una matrice pari a righe o colonne

comm64
26-04-2007, 18.34.04
1.189207 1.259921 1.414214 2.000000
1.259921 1.414214 2.000000 4.000000
1.414214 2.000000 4.000000 8.000000
2.000000 4.000000 8.000000 16.000000


questo è un esempio di fle

4righe *4 colonne

UG0_BOSS
26-04-2007, 18.42.50
Beh, se è un file binario contenente esclusivamente double puoi usare la funzione stat e vederne la dimensione... poi dividi per il numero di byte occupati da un double.

Oppure potrebbe essere più semplice sapendo come è stato salvato il file

UG0_BOSS
26-04-2007, 18.44.00
questo è un esempio di fle

4righe *4 colonne

Ah ma allora... il file è di testo?

Se così fosse basta contare il numero di caratteri newline al suo interno (codice ASCII 10) e il gioco è fatto :cool:

comm64
26-04-2007, 18.51.42
si è un file TXT

UG0_BOSS
26-04-2007, 19.07.49
si è un file TXT
Allora dovrebbe bastare un ciclo

int contatore=0;
char c;
while( (c=fgetc(pDati)) !=EOF){
if(c==10){contatore++;}
}

in pratica:
bisogna dichiarare una variabile (contatore) che conti il numero di righe del file e un carattere c;
fgetc ottiene il carattere dal file passato come parametro e restituisce "EOF" se siamo arrivati in fondo al file;
Finchè non arriviamo in fondo al file viene letto il carattere c, se questo carattere è uguale a 10 (newline), il contatore viene incrementato di 1.

Alla fine contatore conterrà il numero di righe del file e quindi della matrice

comm64
26-04-2007, 19.22.09
TU SEI UN MAGO!!!!


ALTRO CHE!!!


FUNZIONA TUTTO!"!!


POTRESTI ANALIZZARMI SOLO UN ALTRA COSA?

TI FACCIO VEDERE IL CODICE COMPLETO che mi stampa tutti zero però il numero degli elementi gli ha azzeccati!

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

void stampa_matrice(double** val,int n);

int main(int argc, char *argv[])
{
int i,j;
int n;
FILE*fp;
char buf[256];

double **A;
char* filename="C:\\matrice.txt";
int riga=0;

if((fp=fopen(filename,"r+"))==NULL)
{
printf("Impossibile aprire il file");
return;
}
else
{
//devo allocare una matrice pari alla dimensione degli elementi presenti nel file;
int contatore=0;
char c;
while( (c=fgetc(fp)) !=EOF)
{
if(c==10){contatore++;}
}
n=contatore-1;
printf("%d",n);
A=calloc(n+1,sizeof(double*));


for (i=0;i<n;++i)
{
A[i]=calloc(n+1,sizeof(double));
}
do
{
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
fgets(buf,256,fp);
sscanf(buf,"%lf",&A[i][j]);


}

}
while(!feof(fp));
fclose(fp);
}

stampa_matrice(A,n);


system("PAUSE");
return 0;
}
void stampa_matrice(double **val,int n) {
int i,j;
for (i=0;i<n;i++)
{
printf("\n");
for (j=0;j<n;j++)
printf("%lf\t",val[i][j]);
}
printf("\n\n\n");
}

UG0_BOSS
26-04-2007, 20.44.03
TU SEI UN MAGO!!!!
Esagerato :p

Uhm... andiamo per passi :inn:
Finora posso solo dire che la funzione stampa_matrice è ok :D

comm64
26-04-2007, 20.59.10
si però quando la va a chiamare mi stampa tutti 0 ah... sono un fesso... ti dovevo passare il file matrix.txt da mettere in C:
cosi potevi vedere il contenuto che doveva stampare a video(se il programma riuscisse a leggere e memorizzare quei dati in A[][]

ti ho allegato il file:!


CIAO MITICO!

UG0_BOSS
26-04-2007, 22.49.03
Vediamo... non ho ancora capito dov'è il problema centrale :mm: però nel frattempo ho notato alcune linee migliorabili:

char* filename="C:\\matrice.txt";
In questo modo il nome del file è "prefissato", se invece usassi
char* filename=argv[1];
Il nome del file potrebbe essere deciso dall'utente, passandolo come argomento al programma (quindi basterebbe trascinare il file di testo sull'icona del programma);


do{
for (i=0;i<n;i++){
for(j=0;j<n;j++){
fgets(buf,256,fp);
sscanf(buf,"%lf",&A[i][j]);
}
}
}while(!feof(fp));

Il do{}while non serve perchè comunque il ciclo si ferma già dopo aver letto n*n valori;

fgets(buf,256,fp);
sscanf(buf,"%lf",&A[i][j]);

Si può cambiare con un più immediato

fscanf( fp, "%lf", &A[i][j]);



:)

comm64
26-04-2007, 23.17.12
Ti ringrazio UGO! mi stai dando un aiuto grandissimo...
adesso ci resta sempre capire perchè stampa tutti zero.... forse non riusciamo a memorizzare bene gli elementi dentro gli array...

comm64
28-04-2007, 00.09.32
ciao ugo finalmente ho risolto ti volevo chiedere sai come fare in C per far eseguire un file da console?
ad esempio:
MENU:

1)vuoi vedere il file della matrice?

praticamente se l'utente preme 1 dovrebbe aprire il file.txt a schermo

UG0_BOSS
28-04-2007, 00.20.30
basta utilizzare l'istruzione system, che esegue un comando dalla console; nel nostro caso dato che dobbiamo aprire il file txt possiamo usare il notepad:

system("notepad.exe matrice.txt");

però se il nome del file cambia il comando non funziona più, perciò si potrebbe scrivere un file batch (temp-batch.bat) dove scrivi "notepad.exe" seguito dal nome del file da aprire; poi con system() esegui la batch
system("temp-batch.bat");
ed una volta eseguita la elimini con
system("del temp-batch.bat");

Anche se è un po' più macchinoso ti consente di aprire sempre il file, qualunque sia il suo nome

comm64
28-04-2007, 12.22.32
Grazie Ugo , mi sei stato di grande aiuto, ho imparato nuove cose,sto finendo la tesina di calcolo numerico e funziona tutto alla grande.

Cosa dire di+?
che sei UN GENIO E UNA BRAVISSIMA PERSONA!


CIAO CIAO

UG0_BOSS
30-04-2007, 01.37.15
Figurati... fa sempre piacere essere d'aiuto :)