Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23

    Allocazione dinamica array da funzione

    Salve, devo allocare dinamicamente un array di numeri ed acquisirne gli elementi. Non riesco a capire dove sia l'errore. In fase di compilazione ottengo un "Warning: 'a' is used uninitialized" ed all'esecuzione del programma ottengo un Segmentation Fault.

    codice:
    void leggi_array(int *, int *);
    
    int main(void)
    {
    int *a, n;
    
    leggi_array(a, &n);
    
    return(0);
    }
    
    
    void leggi_array(int *a, int *n);
    {
    int i;
    
    do
    {
      printf("Numero di elementi dell'array: ");
      scanf("%d", n);
    }
    while (*n <= 0);
    
    a = (int *)calloc(*n, sizeof(int));
    
    for (i = 0; (i < *n); i++)
    {
      printf("Inserire elemento %d^: ", i + 1);
      scanf("%d", &a[i]);
    }
    }

  2. #2
    Varie cosucce fai attenzione a come passi gli argomenti, ed a come usi i puntatori.

    codice:
    void leggi_array(int *&, int &);
    
    int main(void)
    {
    	int *a, n;
    	
    	leggi_array( a, n);
    
    	printf("\nContenuto dell'array\n");
    	for(int i=0; (i<n); i++)
    		printf("L'elemento %d^ contiene %d\n", i+1, a[i]);
    	
    	system("PAUSE");
    	return 0;
    }
    
    
    void leggi_array(int *&a, int &n)
    {
    	int i;
    	do
    	{
    		printf("Numero di elementi dell'array: ");
    		scanf("%d", &n);
    	}
    	while(n<=0);
    	
    	a=(int *)calloc( n, sizeof(int));
    	
    	for (i=0; (i<n); i++)
    	{
    		printf("Inserire elemento %d^: ", i + 1);
    		scanf("%d", &a[i]);
    	}
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    746
    Varie cosucce fai attenzione a come passi gli argomenti, ed a come usi i puntatori.
    in realtà il codice era perfetto, bastava inizializzare *a:

    codice:
    int *a = NULL, n;
    
    leggi_array(a, &n);
    
    etc...
    poi, al limite, si può far notare che il cast con la calloc è inutile
    e che manca il return;

    @Samuele_70: fossi in te ricontrollerei il tuo codice...

    codice:
    void leggi_array(int *&, int &);    /* Errore. */
    
    int main(void)
    {
            ...
            for(int i=0; (i<n); i++)    /* Errore. Non standard. */
            ...
            system("PAUSE");            /* Non portabile, meglio getchar(). */
            return 0;
    }

  4. #4
    In realtà non capisco il senso della funzione leggi array. Perchè passare un puntatore alla funzione, allocarlo nella funzione, riempirlo e....uscire. Facendo così ho si allocato un array, ma nessuno fuori dalla funzione lo può usare. Credo che quello che si voleva era di allocare l'array nella funzione e poi ritornarlo al chiamante, ma il prototipo della funzione è errato in quanto non devo passare un puntatore ad int per a, ma un puntatore ad un puntatore ad int (Probabilmente quello che ha pensato Samuele70 passando un reference ad un puntatore...ma se il prg era scritto in C non funziona, in C++ allora il passaggio dei parametri è azzeccato).
    Quindi ho scrivi:
    void leggi_array(int **, int *);
    oppure cambi in:
    int *leggi_array(int *);
    e ritorni il puntatore (che ovviamente il chiamante deve liberare).
    Inizializzare a è inutile...darebbe comunque un segfault perchè dopo la funzione accedi ad un array NULL.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23
    Originariamente inviato da U-bahn
    in realtà il codice era perfetto, bastava inizializzare *a:

    codice:
    int *a = NULL, n;
    
    leggi_array(a, &n);
    
    etc...
    Avevo gia' provato ad inizializzarla in fase di dichiarazione, ma va lo stesso in Segmentation Fault...

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23
    Originariamente inviato da fastcoder
    In realtà non capisco il senso della funzione leggi array. Perchè passare un puntatore alla funzione, allocarlo nella funzione, riempirlo e....uscire. Facendo così ho si allocato un array, ma nessuno fuori dalla funzione lo può usare. Credo che quello che si voleva era di allocare l'array nella funzione e poi ritornarlo al chiamante, ma il prototipo della funzione è errato in quanto non devo passare un puntatore ad int per a, ma un puntatore ad un puntatore ad int (Probabilmente quello che ha pensato Samuele70 passando un reference ad un puntatore...ma se il prg era scritto in C non funziona, in C++ allora il passaggio dei parametri è azzeccato).
    Quindi ho scrivi:
    void leggi_array(int **, int *);
    oppure cambi in:
    int *leggi_array(int *);
    e ritorni il puntatore (che ovviamente il chiamante deve liberare).
    Inizializzare a è inutile...darebbe comunque un segfault perchè dopo la funzione accedi ad un array NULL.
    Credo di aver capito quello che vuoi dire, e cioe' che la memoria allocata per l'array viene liberata quando si ritorna al main. Pero' non capisco in che modo allora si possa allocare della memoria in una funzione, senza che questa venga liberata uscendo dalla funzione stessa.
    Se puoi spiegarmi dettagliatamente come procedere te ne sarei grato...

  7. #7
    No...non viene liberata quando torni al main...semplicemente la perdi.
    Per ritornarla al main puoi usare una di queste due alternative (la seconda la preferisco):
    codice:
    void leggi_array(int **a, int *n);
    {
    int i;
    
    ....
    
    *a = (int *)calloc(*n, sizeof(int));
    
    int *tmp_a = *a;
    for (i = 0; (i < *n); i++)
    {
      printf("Inserire elemento %d^: ", i + 1);
      scanf("%d", tmp_a++);
    }
    }
    main()
    {
      int *a, n;
    
      leggi_array(&a, &n);
    
      ...
      free(a); // Qua la liberi
    }
    seconda strada
    codice:
    int *leggi_array(int *n);
    {
    int i;
    int *r;
    
    ....
    
    *r = (int *)calloc(*n, sizeof(int));
    
    int *tmp_r = r;
    for (i = 0; (i < *n); i++)
    {
      printf("Inserire elemento %d^: ", i + 1);
      scanf("%d", tmp_r++);
    }
    return r;
    }
    main()
    {
      int *a, n;
    
      a = leggi_array(&n);
    
      ...
      free(a); // Qua la liberi
    }
    Provale perchè io non le ho provate

  8. #8
    Originariamente inviato da U-bahn
    [...]
    @Samuele_70: fossi in te ricontrollerei il tuo codice...

    codice:
    void leggi_array(int *&, int &);    /* Errore. */

    codice:
    int main(void)
    {
            ...
            for(int i=0; (i<n); i++)    /* Errore. Non standard. */

    Il codice è C/C++ non esclusivamente C, quindi nessun errore, infatti il mio codice funziona in C++, unica cosa
    che ho trascurato, se vogliamo essere pignoli, è la free(), che comunque esulava dalla questione.
    codice:
            ...
            system("PAUSE");            /* Non portabile, meglio getchar(). */
            return 0;
    }
    Queste sono preferenze personali, nonchè vincolate dal SO che si utilizza
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    746
    Il codice è C/C++ non esclusivamente C, quindi nessun errore
    io avevo dato per scontato che fosse C
    (e tu che fosse C++ )

    Queste sono preferenze personali, nonchè vincolate dal SO che si utilizza
    ...non è portabile, e uno dei punti forti del C è la portabilità.
    se poi esiste una funzione standard che almeno in quel punto del codice
    (non conosco PAUSE, quindi è una supposizione) fa la stessa cosa...

    per il resto, in effetti...errore mio, chiedo scusa
    spero che fosse colpa dell'ora, altrimenti sono messo proprio male


  10. #10
    Piccola nota: system è portabile almeno su sistemi Windows, Linux, e HPUX. Magari pause no...ma system senz'altro.
    PS: sicuramente getchar è meglio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.