radeon (Normal User)
Newbie
Messaggi: 6
Iscritto: 12/05/2008
|
Salve a tutti, questo è il mio 1° post. Sono diversi anni che non programmo in C (sono molto arrugginito) e spero di essere il + chiaro possibile. L'input del problema consiste in un file di testo nel quale sono presenti una o + coppie di interi "n" e "k". "n" indica il numero di elemeti da inserire nell'array, mentre "k" indica il range del valore (-k..k) che gli "n" elementi possono assumere. La cosa che non riesco a capire è come far "pescare" "n" e "k" dal file per poi costruire l'array. Per ora ho fatto la lettura file nel seguente modo:
int main(int argc, char **argv)
{
int n, k;
FILE *Fp1;
Fp1 = fopen(NOME_FILE, "r");
if (Fp1 == NULL){
printf("\n Il file %s non e' stato trovato\n", NOME_FILE);
}
while (!feof(Fp1)){
fscanf(Fp1, "%d %d\n", &n, &k);
//printf("%d %d\n", n, k);
}
fflush(Fp1);
fclose(Fp1);
fflush(stdin);
getchar();
}
Spero di essere stato chiaro, grazie a chi risponde.
|
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Manca la relazione tra quello che non sapresti fare e quello che hai fatto ...
Ovvero, cosa non va nel tuo programma? Problemi? Errori? Malfunzionamenti logici?
E come e' fatto esattamente il tuo file dati? Le coppie sono separate? Da cosa? Mostra un esempio ...
|
|
radeon (Normal User)
Newbie
Messaggi: 6
Iscritto: 12/05/2008
|
La cosa che non riesco a fare è prendere n e k dal file (n e k nel file sono separati da uno spazio es: 4 2) e creare l'array che mi interessa. Il codice che ho presentato sopra fa vedere fin dove arrivo. Se compilo quello che ho fatto, a video mi fa vedere i valori presenti nel file, ma poi vado nei casini quando si tratta di creare la struttura dati che mi interessa con n e k presenti nel file.
|
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Se hai letto correttamente i valori nella variabile n, devi allocare la memoria per l'array dinamico.
Lo puoi fare con
int *arr;
arr = (int *)malloc(n*sizeof(int));
e quando non ti serve piu', liberare la memoria con
free(arr);
|
|
radeon (Normal User)
Newbie
Messaggi: 6
Iscritto: 12/05/2008
|
int main(int argc, char **argv)
{
// variabili
int n, k, x;
int *nData, *kData;
FILE *Fp1;
//File aperto in sola lettura
Fp1 = fopen(NOME_FILE, "r");
//Controllo sul file
if (Fp1 == NULL){
printf("\n Il file %s non e' stato trovato\n", NOME_FILE);
}
//Leggi il contenuto finchè non fisce il file
while (!feof(Fp1)){
fscanf(Fp1, "%d %d\n", &n, &k);
printf("%d %d\n", n, k); // Stampa i valori che legge
nData = (int*) calloc (n, sizeof(int)); // Dedico spezio in memoria per n e k
kData = (int*) calloc (k, sizeof(int));
}
// Qui devo prendere "k" e generare n numeri in base a "n" che siano compresi tra -k e k..
/*for (x=0; x<n; x++){
...
...
}*/
//Chiusura del file
fflush(Fp1);
fclose(Fp1);
fflush(stdin);
//Libero memoria
free(nData);
free(kData);
getchar();
}
Ho seguito i consigli precedenti, ma arrivo ad un punto cieco quando devo prendere "k" dal file e generare n numeri in base a "n" che siano compresi tra -k e k..Non saprei nemmeno come iniziare..Generare il range (-k...k) lo so creare, ma non so dirgli di creare "n" elementi
|
|
Bond93 (Ex-Member)
Pro
Messaggi: 135
Iscritto: 04/05/2008
|
allora per creare un vettore di n elementi fai così ( è il vettore dinamico accennato da gantonio ):
Codice sorgente - presumibilmente C/C++ |
int *vtc;
...[acquisizione di n e k dal file]
vtc= malloc(sizeof(int)*n);
for( i=0;i<n;i++)
vtc[i]=rand()%(2*k)-k
|
malloc è una funzione che ritorna un puntatore alla memoria che ha allocato.
Le dimensioni della memoria sono l'arg. della funzione
Spero di essere stato chiaro...
Bond
|
|
radeon (Normal User)
Newbie
Messaggi: 6
Iscritto: 12/05/2008
|
Grazie Bond sei stato molto chiaro! Ho provato a fare quello che hai detto ma il programma mi restituisce i valori che vanno da -k a k-1, cioè se k=2, i volori che mi restituisce sono: -2 -1 0 1 e non c'è il 2. (LASCIANDO STARE "n" che va bene).
//Leggi il contenuto finchè non fisce il file
while (!feof(Fp1)){
fscanf(Fp1, "%d %d\n", &n, &k);
printf("Valori presenti nel file: %d %d\n\n", n, k); // Stampa i valori che legge
//Metto n in memoria
nData = malloc(sizeof(int)*n);
printf("Valori calcolati: ");
srand(time(NULL)); //Inizializzo generatore
for(j=0; j<n; j++){
nData[j] = rand()%(2*k)-k;
printf(" %d ", nData[j]);
}
}
Come si può risolvere l'inconveniente? Magari creando un array con dentro k?
|
|
Bond93 (Ex-Member)
Pro
Messaggi: 135
Iscritto: 04/05/2008
|
Codice sorgente - presumibilmente C/C++ |
int *vtc;
...[acquisizione di n e k dal file]
vtc= malloc(sizeof(int)*n);
for( i=0;i<n;i++)
vtc[i]=rand()%(2*k)-k
if(!rand()%2) vtc[i]+=1;
|
|
|
radeon (Normal User)
Newbie
Messaggi: 6
Iscritto: 12/05/2008
|
Avevo già provato anche io questa soluzione ma non va bene purtroppo..se faccio così non genera più il valore -2 per esempio..
|
|