Stampare un array tramite un puntatore.

di Anonimizzato26870 il
8 risposte
Ho un problema con questo programma dove mi viene chiesto di generare due numeri casuali tra 1 e 5 e altri due tra 2 e 10 tramite una funzione int.
non riesco a capire perché il primo valore che mi restituisce (ovvero x[0]) sia giusto mentre tutti gli altri sono sballati...

int* num_casuali();
int main() {
    int i;
    int *pa = NULL;
    pa= num_casuali();
    for (i=0; i<4; i++) {
        printf("\n%d", *(pa+i));
    }

}
int* num_casuali(){
    int x[4],*pa,i;
    long int seed;
    seed=time(0);
    srand48(seed);
    for (i=0; i<2; i++) {
        x[i]= 1+ lrand48()% 5;
        printf("\n%d", x[i]);
    }
    for (i=2; i<4; i++) {
        x[i]= 2+ lrand48()% 9;
        printf("\n%d", x[i]);
    }
    pa=x;
    return pa ;
}

8 Risposte

  • - per inserire il codice utilizza il tag CODE (simbolo </> nell'editor completo), altrimenti non si capisce niente;
    - potresti postare la traccia originale dell'esercizio?
    - riguardo al problema che riscontri ti faccio una domanda: sai cosa si intende per tempo di vita di una variabile?
  • Perché un array che deve essere letto anche dopo l'uscita dalla funzione deve essere allocato nello heap, non nello stack. Usa la malloc()
  • Nippolo ha scritto:


    - per inserire il codice utilizza il tag CODE (simbolo </> nell'editor completo), altrimenti non si capisce niente;
    - potresti postare la traccia originale dell'esercizio?
    - riguardo al problema che riscontri ti faccio una domanda: sai cosa si intende per tempo di vita di una variabile?
    Tramite una funzione di tipo int genera quattro numeri casuali : due compresi tra 1 e 5 e  due i compresi tra 2 e 10. Restituisci tali valori nel main e poi stampali.
    No non credo di sapere cosa sia il tempo di vita di una variabile...
  • Weierstrass ha scritto:


    Perché un array che deve essere letto anche dopo l'uscita dalla funzione deve essere allocato nello heap, non nello stack. Usa la malloc()
    ok grazie mi potresti far vedere come si una la malloc() che non ne ho idea?
  • flavio_in_c ha scritto:


    Tramite una funzione di tipo int genera quattro numeri casuali : due compresi tra 1 e 5 e  due i compresi tra 2 e 10. Restituisci tali valori nel main e poi stampali.
    No non credo di sapere cosa sia il tempo di vita di una variabile...
    Con tempo di vita di una variabile si intende semplicemente che una variabile (automatica) cessa di esistere una volta usciti dall'ambito (o anche scope, in pratica le parentesi graffe) in cui è stata dichiarata.

    Che significa tramite una funzione di tipo int?

    @Weierstrass int e int* sono tipi diversi.
  • int* num_casuali(){
        int i;
        long int seed;
        int *pa = (int*)malloc(4 * sizeof(int));
        
        seed=time(0);
        srand(seed);
        for (i=0; i<2; i++) {
            *(pa + i) = 1 + rand()% 5;
            printf("\n%d", *(pa + i));
        }
        for (; i<4; i++) {
            *(pa + i) = 2 + rand()% 9;
            printf("\n%d", *(pa + i));
        }
        return pa;
    }
    
    int main() {
        int i;
        int *pa = num_casuali();
        
        for (i=0; i<4; i++) 
            printf("\n%d", *(pa+i));
        return 0;
    }
  • Weierstrass ha scritto:


    int* num_casuali(){
        int i;
        long int seed;
        int *pa = (int*)malloc(4 * sizeof(int));
        
        seed=time(0);
        srand(seed);
        for (i=0; i<2; i++) {
            *(pa + i) = 1 + rand()% 5;
            printf("\n%d", *(pa + i));
        }
        for (; i<4; i++) {
            *(pa + i) = 2 + rand()% 9;
            printf("\n%d", *(pa + i));
        }
        return pa;
    }
    
    int main() {
        int i;
        int *pa = num_casuali();
        
        for (i=0; i<4; i++) 
            printf("\n%d", *(pa+i));
        return 0;
    }
    perfetto grazie mille. potresti anche farmi vedere come faccio ad imporre che i secondi due numeri casuali devono essere maggiori dei primi ?
    ho provato con un ciclo do while del tipo:
    
    do {
    for (i=2; i<4; i++) {
        *(pa + i) = 2 + rand()% 9;
        printf("\n%d", *(pa + i));
        }
    }while (((pa+2)<=pa)&& ((pa +3)<= pa+1));
    
    
  • Potresti fare così
    int* num_casuali(){
        int i;
        long int seed;
        int *pa = (int*)malloc(4 * sizeof(int));
        
        seed=time(0);
        srand(seed);
        for (i=0; i<2; i++) {
            *(pa + i) = 1 + rand()% 5;
            printf("\n%d", *(pa + i));
        }
        
        int max = *(pa + 1) > *pa ? *(pa + 1) : *pa;
        
        for (; i<4; i++) {
            do{
                *(pa + i) = 2 + rand()% 9;
            }while(max >= *(pa + i));
            printf("\n%d", *(pa + i));
        }
        return pa;
    }
Devi accedere o registrarti per scrivere nel forum
8 risposte