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

    [C] problemi allocazione dinamica del vettore

    buona sera a tutti ragazzi!
    sono un giovane studente di informatica (molto ignorante) che da meno di un anno sta studiando il c.
    ho bisogno di una mano, infatti sto avendo problemi appunto con le funzioni malloc/realloc e le variabili puntatore, così vi chiedo gentilmente di correggermi poichè non ho il libro sottomano e non posso procedere a tentativi.

    allora vi spiego il problema...
    ho un vettore la quale dimensione dovrebbe cambiare continuamente, così una volta inizializzata inizio a popolarlo... però a questo punto il programma si blocca.

    vi incollo qui sotto il codice che dovrebbero essere responsabili di questo disastro:

    codice:
    #include <stdio.h>
    #include <malloc.h>
    int DIM=1;
    
    
    
    void Popola(int *vet[],int DIM)
    {
    int i;
    for(i=0;i<DIM;i++)
    {
    *vet[i]=rand();
    printf("\nvet[%d]=%d",i,*vet[i]);
    }
    }
    
    void Cambiadimensione(int *vet[],int *DIM)
    {
    printf("\nInserisci la nuova dimensione");
    scanf("%d",DIM);
    int *tmp;
    tmp = realloc(vet, *DIM);
    vet = tmp;
    Popola(vet,*DIM);
    }
    
    
    
    int main()
    {
    int *vet;
    vet=malloc(sizeof(TIPO) * DIM);
    Cambiadimensione(vet,&DIM);
    system("PAUSE");
    return 0;
    }

    grazie mille in anticipo per il vostro aiuto prezioso.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Come mi sembra debba essere

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    int dim = 1;
    
    void Popola(int vet[], int dim)
    {
    	int i;
    
    	for(i=0; i<dim; i++)
    	{
    		vet[i]=rand();
    		printf("\nvet[%d]=%d", i, vet[i]);
    	}
    }
    
    void Cambiadimensione(int **vet, int *dim)
    {
    	printf("\nInserisci la nuova dimensione ");
    	scanf("%d", dim);
    
    	*vet = (int *)realloc(*vet, *dim * sizeof(int));
    
    	Popola(*vet, *dim);
    }
    
    int main()
    {
    	int *vet;
    
    	vet = (int *)malloc(dim * sizeof(int));
    	Cambiadimensione(&vet, &dim);
    
    	system("PAUSE");
    	
    	return 0;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Come mi sembra debba essere

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    int dim = 1;
    
    void Popola(int vet[], int dim)
    {
    	int i;
    
    	for(i=0; i<dim; i++)
    	{
    		vet[i]=rand();
    		printf("\nvet[%d]=%d", i, vet[i]);
    	}
    }
    
    void Cambiadimensione(int **vet, int *dim)
    {
    	printf("\nInserisci la nuova dimensione ");
    	scanf("%d", dim);
    
    	*vet = (int *)realloc(*vet, *dim * sizeof(int));
    
    	Popola(*vet, *dim);
    }
    
    int main()
    {
    	int *vet;
    
    	vet = (int *)malloc(dim * sizeof(int));
    	Cambiadimensione(&vet, &dim);
    
    	system("PAUSE");
    	
    	return 0;
    }
    ohhh grazie mille sul serio, potrà sembrare un codice banale ma mi si è incurvata la schiena a furia di batterci la testa sopra.
    comunque essendo io uno studente ho bisogno di capirne il perchè, quindi non ti arrabiare se approfitto della tua disponibilità e ti faccio qualche domanda teorica(le ho incluse nel quote)



    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    int dim = 1;
    
    void Popola(int vet[], int dim)
    {
    	int i;
    
    	for(i=0; i<dim; i++)
    	{
    		vet[i]=rand();
    		printf("\nvet[%d]=%d", i, vet[i]);
    	}
    }
    
    void Cambiadimensione(int **vet, int *dim)//cosa significa quell'operatore (**) che precede vet? e perchè non ci sono sono le parentesi quadre?
    {
    	printf("\nInserisci la nuova dimensione ");
    	scanf("%d", dim);
    
    	*vet = (int *)realloc(*vet, *dim * sizeof(int));
    
    	Popola(*vet, *dim);//perchè qui invece non hai passato i parametri per riferimento?
    }
    
    int main()
    {
    	int *vet;
    
    	vet = (int *)malloc(dim * sizeof(int));
    	Cambiadimensione(&vet, &dim); //perchè qui hai usato la &? così non passi l'indirizzo del puntatore?
    
    	system("PAUSE");
    	
    	return 0;
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    void Cambiadimensione(int **vet, int *dim) //cosa significa quell'operatore (**) che precede vet? e perchè non ci sono sono le parentesi quadre?
    Quello è un puntatore a puntatore.

    Popola(*vet, *dim);//perchè qui invece non hai passato i parametri per riferimento?
    Perché la funzione scrive dentro il vettore ma non gli serve la modifica del puntatore.

    Cambiadimensione(&vet, &dim); //perchè qui hai usato la &? così non passi l'indirizzo del puntatore?
    Perché il puntatore deve essere modificabile e quindi devi passare il puntatore al puntatore.


    P.S. Ricordati, anche se non l'ho indicato nel codice, che alla fine ci vuole una free per liberare la memoria.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    oh grazie ancora, ma se dalla funziona popola avessi la necessita di chiamare un altra funzione al quale passare vet e dim(e ovviamente modificarli) questa volta dovrei usare le &?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Se devi modificare i parametri che passi devi passarli per indirizzo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    quindi:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    int dim = 1;
    
    void Popola(int **vet[], int **dim)
    {
    	int i;
    
    	for(i=0; i<dim; i++)
    	{
    		*vet[i]=rand();
    		printf("\nvet[%d]=%d", i, *vet[i]);
    	}
            EventualeFunziona(*vet,*DIM);
    }
    
    void Cambiadimensione(int **vet, int *dim)
    {
    	printf("\nInserisci la nuova dimensione ");
    	scanf("%d", dim);
    
    	*vet = (int *)realloc(*vet, *dim * sizeof(int));
    
    	Popola(&vet, &dim);
    }
    
    int main()
    {
    	int *vet;
    
    	vet = (int *)malloc(dim * sizeof(int));
    	Cambiadimensione(&vet, &dim);
    
    	system("PAUSE");
    	
    	return 0;
    }}

    è giusto o scritto cretinate?


    scusa l'ossesione, ma come ti ho già detto non ho il libro sottomano e quindi non posso approfondire le variabili puntatore

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Scusa, ma perché stai cambiano il codice che ti ho indicato e in particolare la funzione Popola ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    perchè ho bisogno di capire come gestire il passaggio di parametri quando una funzione ne chiama altre o quando due funzioni si chiamano a vicenda

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Beh, ma studia sull'esempio che ti ho fatto, non cambiare ... è in quel modo che devi passare i parametri (in quel caso).

    Ovviamente tutto va valutato caso per caso ... quindi devi parlare del caso particolare.

    A parte il fatto che questo problema è diverso da quello dell' "allocazione dinamica della memoria" di cui si è parlato in questo thread. E per questo dovresti aprire un altro thread.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.