Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C] Allocazione dinamica di un array senza saperne la dimensione

    Ciao a tutti,

    volevo sapere in che modo era possibile allocare dinamicamente un array (o una stringa) senza saperene precedentemente la dimensione. Posto un esercizio per spiegarvi meglio il mio dubbio:

    Sidefiniscano le funzioni leggi e cerca,ed il relativo codice chiamante. La funzione leggi popola un array di interi leggendo una sequenza di valori terminata dal valore -99. La funzione cerca cerca un valore k in un array e ritorna gli indici corrispondenti alle posizioni in cui si trova tale valore.

    In che modo il sottoprogramma leggi può popolare un array se non si sa la dimensione di esso?


    Grazie a tutti
    Ultima modifica di LeleFT; 19-12-2014 a 16:32 Motivo: sistemata spaziatura parole

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Semplicemente non può. Per allocare una certa quantità di memoria... devi sapere questa quantità! Quindi qui le strategie possibili sono principalmente due:
    1. fai una prima passata per vedere quanti elementi devi memorizzare, poi allochi l'array, poi fai una seconda passata per memorizzare effettivamente i dati nell'array
    2. allochi un po' di spazio (una tua stima delle dimensioni) e riempi l'array finché c'è posto. Quando lo spazio è esaurito, ne allochi dell'altro con la funzione realloc.

    Vedi tu quale ti piace di più... Probabilmente ci sono anche altre idee, ma queste mi sembrano già un discreto punto di partenza.

  3. #3
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    Ciao, in un certo senso, è proprio lo scopo dell'allocazione dinamica risolvere questo problema.
    Oltre la funzione malloc(), è disponibile la funzione realloc(), che consente di "aumentare" la dimensione dell'array, quindi ti basta tener conto degli elementi letti, e aumentare di un intero la dimensione dell'array ad ogni lettura.
    Array=(*int)realloc(Array,(++elementi)*sizeof(int) ); //aumento gli elementi di uno, e calcolo la nuova memoria
    Tecnologia

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    ecco, evita di allocare oggetto a oggetto. È il miglior modo per rendere inefficiente un programma
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Esatto! Infatti nel mio post avevo scritto di allocare "dell'altro spazio", intendendo una certa quantità che stimiamo possa essere sufficiente.

  6. #6
    Sapeva della realloc e avevo considerato i vari metodi, mi chiedevo appunto se ne esistesse uno più semplice e lineare.

    grazie a tutti, siete stati davvero d'aiuto

  7. #7
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    No, direi di no. Se passiamo al C++ abbiamo contenitori che si espandono dinamicamente (i vector) ma in C dobbiamo fare tutto "a mano".

  8. #8
    Per inciso, in genere il metodo che si usa è raddoppiare sempre la dimensione dell'array, in modo da raggiungere la dimensione finale in O(log n) tentativi, lasciando inutilizzata nel caso peggiore la metà meno uno degli elementi allocati.

    (anche se, oltre certe dimensioni, spesso per evitare di sprecare troppo si diminuisce il moltiplicatore o si passa ad una crescita lineare "a chunk")
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Puoi farti un ADT..
    Una struct con dimensione, numero oggetti, array, primitive per inserimento e lookup
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Qualcuno riuscirebbe a fornirmi quindi una soluzione dell'esercizio (solamente la parte Leggi usando malloc e realloc, altrimenti riuscireste a correggere il mio?
    Grazie davvero a tutti!

    codice:
     #include <stdio.h>#include <stdlib.h>
    #include <malloc.h>
    
    
    int* leggi()
    {
        int *array, n, i;
    
    
        i=0;
        array=(int*)malloc(sizeof(int)*i);
        i++;
        scanf("%d", array);
    
    
    
    
        do{
            scanf("%d", &n);
            array=(int)realloc(sizeof(int)*i);        
            *(array+i)=n;        
            i++;
        }while(n!=-99);
    
    
        return;
    }
    
    
    int main (int argc, char*argv[])
    {
    
    
        leggi();
    
    
        return 0;
    }
    }
    Vi riscrivo l'esercizio: Si definiscano le funzioni leggi e cerca,ed il relativo codice chiamante. La funzione leggi popola un array di interi leggendo una sequenza di valori terminata dal valore -99. La funzione cerca cerca un valore k in un array e ritorna gli indici corrispondenti alle posizioni in cui si trova tale valore.


    Grazie

Tag per questa discussione

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 © 2025 vBulletin Solutions, Inc. All rights reserved.