Oppure

Loading
12/05/08 19:30
radeon
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.
aaa
12/05/08 19:42
gantonio
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 ...
aaa
12/05/08 20:24
radeon
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.
aaa
13/05/08 7:44
gantonio
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);
aaa
14/05/08 12:35
radeon
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
aaa
14/05/08 16:39
Bond93
allora per creare un vettore di n elementi fai così ( è il vettore dinamico accennato da gantonio ):
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
aaa
14/05/08 19:45
radeon
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?
aaa
15/05/08 9:32
Bond93
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;
aaa