Stampare un array tramite un puntatore.

di il
8 risposte

Stampare un array tramite un puntatore.

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

  • Re: Stampare un array tramite un puntatore.

    - 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?
  • Re: Stampare un array tramite un puntatore.

    Perché un array che deve essere letto anche dopo l'uscita dalla funzione deve essere allocato nello heap, non nello stack. Usa la malloc()
  • Re: Stampare un array tramite un puntatore.

    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...
  • Re: Stampare un array tramite un puntatore.

    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?
  • Re: Stampare un array tramite un puntatore.

    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.
  • Re: Stampare un array tramite un puntatore.

    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;
    }
  • Re: Stampare un array tramite un puntatore.

    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));
    
    
  • Re: Stampare un array tramite un puntatore.

    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