Riallocazione di un array di struct

di il
10 risposte

Riallocazione di un array di struct

Salve a tutti, sono nuovo di questo forum e vi scrivo per chiedere una mano per un programma che dovrò presentare all'esame di Fondamenti di Informatica.
Il problema sussiste nella riallocazione di un array con elementi di tipo struct dipendente allocato dinamicamente con la funzione malloc usando le due funzioni inserisci_dipendente e estrai_dipendente. Visual studio mi da ripetutamente un messaggio di warning prima di dare errore riguardo l'accesso all'heap. Grazie in anticipo a tutti quelli che vorranno dare un'occhiata al mio codice per darmi una mano.

10 Risposte

  • Re: Riallocazione di un array di struct

    Quando presenti un problema devi dare maggiori dettagli.

    Di quale warning parli?

    In quale riga?
  • Re: Riallocazione di un array di struct

    Windows ha generato un punto di interruzione in Inserisci e Cancella dipendente.exe.
    Ciò può essere dovuto a un danneggiamento dell'heap che indica un bug in Inserisci e Cancella dipendente.exe o in una qualunque delle DLL che ha caricato.
    È anche possibile che l'utente abbia premuto F12 mentre Inserisci e Cancella dipendente.exe era attivo.
    Controllare la finestra di output per ulteriori informazioni diagnostiche.

    Questo è l'avviso al momento della chiamata alla funzione inserisci_dipendente

    Eccezione non gestita a 0x5017e42e (msvcr100d.dll) in Inserisci e Cancella dipendente.exe: 0xC0000005: Violazione di accesso nella scrittura del percorso 0x0000000c.

    Questo il warning al momento della chiamata alla funzione estrai_dipendente

    Il problema credo sia proprio nella definizione di queste 2 funzioni
  • Re: Riallocazione di un array di struct

    Scusa ma questo non è un warning ma un errore a runtime. Un errore di "violazione di accesso" dovuto molto probabilmente ad un puntatore sballato.

    Purtroppo senza file binario non posso provarlo ma con il debug di Visual Studio puoi procedere passo passo per individuare la linea e quindi il problema.
  • Re: Riallocazione di un array di struct

    Il debug procede correttamente fino alle 2 chiamate poi durante le definizioni trova l'errore ma purtroppo non riesco ad individuare la linea di codice precisa
  • Re: Riallocazione di un array di struct

    Se esegui passo passo devi per forza trovare la linea che lo genera ...

    In ogni caso, spiega l'algoritmo usato nella funzione di inserimento perché quello scambio e quella free sono molto sospetti (mi sa che l'errore è generato dalla free ...)
  • Re: Riallocazione di un array di struct

    Mi pare che la variabile conta non sia definita come array ma come semplice struttura di tipo dipendenti. La usi durante la lettura del file e per ricevere i dati di inserimento di un nuovo dipendente e fin qui tutto bene. Nella funzione estrai_dipendente la usi come se fosse un array inizializzato indicando l'indice [D-1] ma tale inizializzazione non è mai avvenuta...mi pare
  • Re: Riallocazione di un array di struct

    Scusami non è molto tempo che programmo e non sapevo si potesse eseguire una linea di codice per volta, comunque nella definizione di inserisci_dipendente l'errore compare qui:

    void inserisci_dipendente(struct dipendente A,struct dipendente* B,int* C)
    {
    int i;
    struct dipendente* organico2;

    organico2=malloc((*C+1)*sizeof(struct dipendente));

    for(i=0;i<*C;i++)
    organico2=B; <==============

    *C=*C+1;
    organico2[*C]=A;
    scambia(B,organico2);
    free(organico2);
    }
  • Re: Riallocazione di un array di struct

    Mentat hai perfettamente ragione conta è una variabile di tipo dipendente pensata solo per salvare la componente dell'array da eliminare in moda da poterne stampare i dati nel main

    in ogni modo la logica che cerco di usare nell'inserimento è quella di creare un nuovo puntatore organico2 per generare una area di memoria in cui è possibile inserire 1 un elemento in più rispetto a quelli presi da file e collocati in organico1 il cui numero è indicato con N, poi copiare tutti i dati da organico 1 a organico2 in cui rimarrebbe uno spazio disponibile nel quale inserire conta che indica il dipendente aggiuntivo ed infine scambiare organico1 con organico2 in modo tale che tornando nel main organico1 indichi ancora l'area di memoria in cui sono salvati tutti i dipendenti compreso quello appena aggiunto

    mentre per la logica dell'estrazione intendo salvare in conta il dipendente da eliminare poi creare il puntatore organico 2 e generare un area di memoria con spazio in meno rispetto ad organico1, poi scambiare il dipendente scelto con l'ultimo salvato nell'array organico1 in modo tale che nel passo in cui copio tutte le componenti dall'array organico1 ad organico 2 vada persa solo l'ultima componente che è il dipendente da eliminare ed infine di nuovo scambiare gli indirizzi di organico1 con organico2 e tornare al main con il riferimento allo stesso puntatore iniziale

    è un po' articolato ma non sapevo come riallocare diversamente l'array dinamico organico1
  • Re: Riallocazione di un array di struct

    Ho letto un po' meglio il tuo codice ed effettivamente mi pare un po' incasinato, quindi faccio un passo indietro e vado per gradi facendoti alcune domande preliminari per inquadrare meglio il problema e ciò di cui hai bisogno.

    Prima domanda: l'uso della struttura dati array è obbligatorio o si possono usare strutture dati più adatte allo scopo tipo lista puntata?

    Seconda domanda: nel caso sia obbligatorio l'uso di un array, qual'è l'obiettivo finale avere un array con indici sempre crescenti e senza "buchi" o è sufficiente che la memoria utilizzata sia minima?
  • Re: Riallocazione di un array di struct

    E' necessario che utilizzi un vettore perchè la gestione di una lista non è parte del programma e non saprei minimamente gestirla, lo scopo è avere un array continuo in modo da stampare a video o su testo una cosa sensata usando la funzione stampa che stampa semplicemente tutti i vari elementi del vettore e che andranno gestiti con altre parti del codice
Devi accedere o registrarti per scrivere nel forum
10 risposte