Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    problema della memoria in C

    Vi inserisco parte del codice di un programma....mi crea problemi di memoria ma non riesco a trovare l'errore.Spero che qualcuno possa darmi una mano.

    Nel programma alloco dinamicamente memoria per una matrice che inizializzo (matrici quadrate simmetriche).....Dopo di che lo scopo del programma è fare degli unioni, passare quindi, per es, da una matrice 5x5 ad una 4x4 e così via fino ad arrivare ad una matrice1x1. Ovviamente una volta creata la matrice 4x4 è possibile cancellare quella 5x5 per evitare spreco di memoria......Vi inserisco il codice. Per tutti i dubbi contattatemi. Grazie già da ora.


    ALLOCAZIONE

    codice:
    adiacenze=(int **)malloc(numerorighe*sizeof(int*));
    for (i=0;i<numerorighe<i++)
         adiacenze[i]=(int *)malloc(numerorighe*sizeof(int));
    INIZIALIZZAZIONE

    codice:
    .....
    for (i=0;i<nr;i++)
        for (j=0;j<=i;j++)
            ...................
    CREAZIONE MATRICI (stando in un ciclo, mi creo la nuova matrice, libero lo spazio di memoria occupato dalla vecchia matrice, mi alloco spazio di memoria della grandezza della nuova matrice e copio i valori della nuova matrice nelo spazio di memoria allocato......non so se fila: tutto per uan questione di nomi)

    codice:
    .........
    nuova_adiacenze=(int **)malloc(n*sizeof(int));
    for (i=0;i<n;i++)
         nuova_adiacenze[i]=(int *)malloc(n*sizeof(int));
    ..........
    for (i=0;i<n;i++)
         free(adiacenze[i]);
    free(adiacenze);
    adiacenze=(int **)malloc(n*sizeof(int));
    for (i=0;i<n;i++)
         adiacenze[i]=(int *)malloc(n*sizeof(int));
    adiacenze=nuova_adiacenze;
    for (i=0;i<n;i++)
         free(nuova_adiacenze[i]);
    free(nuova_adiacenze);

    vi prego aiutatemi

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Includi il codice tra i tag CODE altrimenti e' illeggibile ... e dai un'occhiata al regolamento prima di postare ...

    In ogni caso, questa for e' strana ...

    for (i=0;i<numerorighe<i++)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ALLOCAZIONE

    codice:
    adiacenze=(int **)malloc(numerorighe*sizeof(int*));
    for (i=0;i<numerorighe;i++)
          adiacenze[i]=(int *)malloc(numerorighe*sizeof(int));

    INIZIALIZZAZIONE

    codice:
    .....
    for (i=0;i<nr;i++)
             for (j=0;j<=i;j++)
    ...................

    CREAZIONE MATRICI (stando in un ciclo, mi creo la nuova matrice, libero lo spazio di memoria occupato dalla vecchia matrice, mi alloco spazio di memoria della grandezza della nuova matrice e copio i valori della nuova matrice nelo spazio di memoria allocato......non so se fila: tutto per uan questione di nomi)

    codice:
    .........
    nuova_adiacenze=(int **)malloc(n*sizeof(int*));
    for (i=0;i<n;i++)
              nuova_adiacenze[i]=(int *)malloc(n*sizeof(int));
    ..........
    for (i=0;i<n;i++)
           free(adiacenze[i]);
    free(adiacenze);
    
    adiacenze=(int **)malloc(n*sizeof(int*));
    for (i=0;i<n;i++)
           adiacenze[i]=(int *)malloc(n*sizeof(int));
    
    adiacenze=nuova_adiacenze;
    
    for (i=0;i<n;i++)
          free(nuova_adiacenze[i]);
    free(nuova_adiacenze);


    scusa.....cmq per il for è solo un errore di scrittura.....non è quello il problema. grazie

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ok ... ma per evitare di copiare e provare TUTTO il codice, non potresti dire quale errore hai e in quale punto del programma (piu' o meno ...)?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    la parte creazioni matrici è un cilco......la prima volta che entro è ok ma già dalla seconda iterazione adiacenze=nuova_adiacenze non funziona......ho inserito il codice perchè non so se possa essere solo una questione di indici.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Questa

    adiacenze=nuova_adiacenze;

    e' sbagliata (logicamente) perche' cosi' perdi il riferimento alla matrice adiacenze che hai allocato ...

    Quali sono i passi logici che vuoi compiere nel ciclo? Ad esempio

    Creazione nuova matrice

    Copia della vecchia matrice nella nuova

    Eliminazione della vecchia matrice

    e soprattutto perche' ? Mi manchera' qualche informazione ma perche' creare una nuova matrice e copiarci quella vecchia ... ? Non puoi usare la vecchia ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Ti faccio un esempio pratico così magari è più facile da capire.

    PARTO DA UNA MATRICE 5X5 ADIACENZE

    NEL CICLO:
    - CREO UNA MATRICE NUOVA-ADIACENZE 4X4 UTILIZZANDO I VALORI DI QUELLA 5X5
    - DEALOCCO LO SPAZIO DI MEMORIA DI QUELLA 5X5 MATRICE ADIACENZE
    - RICREO LA MATRICE COL NOME ADIACENZE MA CHE OCCUPA UNO SPAZIO DI MEMORIA UGUALE A QUELLO DELL MATRICE 4X4 (NON PIU' 5X5)
    - COPIO LA MATRICE NUOVA ADIACENZE NELLA MATRICE ADIACENZE
    - DEALLOCO LA MATRICE NUOVA-ADIACENZE

    E COSì VIA FINO AD OTTENERE UNA MATRICE 1X1

    LO SCOPO DELLE VARIE UNIONI E' TROVARE UN CLUSTER OTTIMALE IN BASE AGLI INDICI E AI VALORI CONTENUTI NELLE MATRICI CHE MEMORIZZO DI VOLTA IN VOLTA. QUESTO E' SOLO UNA PARTE DEL PROGRAMMA. OVVIAMENTE PER POTER UTILIZZARE IL CICLO I NOMI DELLE MATRICI NON DEVONO CAMBIARE MA DEVO CAMBIARE LA LORO GRANDEZZA OGNI VOLTA.NON SO SE MI SONO FATTA CAPIRE :master:

  8. #8
    Non capisco tutto questo allocare/deallocare. Utilizza due matrici di 5x5, di cui una di appoggio temporaneo, e alla fine deallochi il tutto. Saluti

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.