ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

di il
12 risposte

ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

Ciao a tutti!
Ho provato ad allocare dinamicamente un vettore all'interno di una funzione, ma mi sono accorto che appena il programma esce dalla funzione il vettore non risulta allocato. Quindi mi chiedevo: e' possibile allocare dinamicamente un vettore in una funzione in modo tale che questo abbia effetto anche nel main del programma...?

12 Risposte

  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    Da altro thread
    
    char* array_ciao(int& dimensione){
    	int byte_da_allocare = 5;
    	char* arr = new char[byte_da_allocare];
    
    	arr[0] = 'C';
    	arr[1] = 'i';
    	arr[2] = 'a';
    	arr[3] = 'o';
    	arr[4] = '\0';
    
    	dimensione = byte_da_allocare;
    	return arr;
    }
    
    Nel main
    
    	int size;
    	char* stringa = array_ciao(size);
    	printf(stringa);
    	printf("\r\nDimensione = %d\n", size);
    	delete[] stringa;
    
    
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    Cosa avevi scritto?
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    Il titolo è sbagliato: "IN" una funzione e non va in maiuscolo (mai).
    Prima di giocare con l'allocazione dinamica è meglio se rivedi il passaggio dei parametri per valore e per indirizzo.
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    ---PROGRAMMA---
    #include<stdio.h>
    #include<stdlib.h

    ---FUNZIONE---
    int funzione(int v1[], int v2[], int dim1, int dim2, int v3[]) {
    printf("sei su INTERSEZIONE VETTORI\n");
    v3 = (int*)malloc(min(dim1,dim2) * sizeof(int));
    InserisciVettore(v3,min(dim1,dim2))
    return(min(dim1,dim2));
    }

    ---MAIN---
    int main(void) {
    int *vett1; /* primo vettore */
    int *vett2; /* secondo vettore */
    int *vett3; /* terzo vettore */
    int dim1; /* dimensione del primo vettore */
    int dim2; /* dimensione del secondo vettore */
    int dim3; /* dimensione del terzo vettore */
    printf("Inserisci il numero di elementi del primo vettore: ");
    scanf("%d", &dim1);
    vett1 = (int*)malloc(dim1 * sizeof(int));//ALLOCAZIONE PRIMO VETTORE
    printf("Inserisci il numero di elementi del secondo vettore: ");
    scanf("%d", &dim2);
    vett2 = (int*)malloc(dim2 * sizeof(int));//ALLOCAZIONE SECONDO VETTORE
    vett3 = NULL;

    /* inserisce gli elementi dei due vettori di ingresso */
    InserisciVettore(vett1,dim1); //funzione che riempie il vettore che non sto qui a scrivere
    InserisciVettore(vett2, dim2); //idem
    /* chiama la funzione */
    dim3 = funzione(vett1, vett2, dim1, dim2, vett3);
    StampaVettore(vett3,dim3); //funzione che stampa i vettori che non sto qui a scrivere



    Questo e il codice che ho scritto. SPECIFICO CHE:
    1- la funzione di nome "funzione ha un altro scopo da quello che vedete nel codice per questo passo anche altri vettori", in questo caso lo riscritta
    piu semplificata al fine di sapere gentilmente da voi cosa non va.
    2- In realta':
    La funzione di nome "funzione" dati i due vettori v1 e v2, deve generare un terzo vettore v3 che contiene l’intersezione tra due
    vettori, ossia un vettore che contiene i numeri presenti in entrambi i vettori v1 e v2 .
    3- il prototipo di tale funzione e'
    int IntersezioneVettori(int v1[], int v2[], int dim1, int dim2, int v3[])
    rigorosamente assegnato dal prof, quindi non posso modificare il tipo del ritorno.
    4- non mi interessa sapere come fare l'intersezione perche riesco,il problema e che tale funzione deve tornare sicuramente la dimensione del
    vettore v3 generato e in qualche modo "NON SONO RIUSCITO" deve rendere il vettore v3 opportunamente riempito visibile anche nel main.
    6- se non inserisco l'istruzione vett3=NULL mi da errore che ho usato vett3 senza inizializzarlo.
    7-Scusate se ho scritto il codice cosi e non l'ho inserito in un modo appropiato ma non riesco.
    GRAZIE in anticipo per l'aiuto.
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    Sicuro che il prototipo sia quello? In questo caso non puoi allocare il vettore dentro la funzione ma devi farlo appena fuori.
    
    vett3 = (int*)malloc(min(dim1,dim2) * sizeof(int));
    dim3 = funzione(vett1, vett2, dim1, dim2, vett3);
    
    e
    
    int funzione(int v1[], int v2[], int dim1, int dim2, int v3[]) {
       printf("sei su INTERSEZIONE VETTORI\n");
       InserisciVettore(v3,min(dim1,dim2))
       return(min(dim1,dim2));
    }
    
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    _light_ ha scritto:



    3- il prototipo di tale funzione e'
    int IntersezioneVettori(int v1[], int v2[], int dim1, int dim2, int v3[])
    rigorosamente assegnato dal prof, quindi non posso modificare il tipo del ritorno.
    Guarda, siccome sul forum c'è tutto un pregresso di vincoli del prof che non lo erano e strade non percorribili che potevano essere percorse, ti dico semplicemente che con quel prototipo non può funzionare, oppure può funzionare se allochi fuori dalla funzione come ti ha detto oregon.
    Al limite se vuoi allocare dentro puoi fare così:
    
    int funzione(int v1[], int v2[], int dim1, int dim2, int  * v3[]) {
    
    *v3 = (int*)malloc(3 * sizeof(int));
    (*v3)[0] = 1;
    (*v3)[1] = 2;
    (*v3)[2] = 3;
    
    return 3;
    }
    
    dim3 = funzione(vett1, vett2, dim1, dim2, &vett3);
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    Ok grazie della disponibilita' e dell'aiuto.
    Voglio farvi vedere il codice completo che "logicamente" dovrebbe essere corretto. Pero forse per quello che dite voi non va.
    Se provate a compilare dice che la variabile vett3 e stata usata senza essere inizializzata.
    Ho provato anche ad inizializzarla a NULL ma peggio ancora. Vi posto il codice completo.
    P.S. i commenti sono le specifiche date dal prof, questo e uno degli esercizi di un esempio di compito d'esame che avrò e quindi devo necessariamente rispettare le specifiche richieste.

    ---CODICE---

    #include <stdio.h>
    #include <stdlib.h>
    void InserisciVettore(int v[], int dim) {
    int i;
    for (i = 0; i < dim; i++) {
    printf("Inserisci l'elemento di indice %d: ", i);
    scanf_s("%d", &);
    }
    }
    /* La funzione IntersezioneVettori, dati i due vettori v1 e v2, deve generare
    un terzo vettore v3 che contiene l’intersezione tra due vettori, ossia un vettore
    che contiene i numeri presenti in entrambi i vettori v1 e v2 */

    int IntersezioneVettori(int v1[], int v2[], int dim1, int dim2, int v3[]) {
    int i, dim3;

    if (dim1 < dim2)
    dim3 = dim1;
    else
    dim3 = dim2;

    v3 = (int*)malloc(dim3 * sizeof(int));

    for (i = 0; i < dim1; i++) {

    for (i = 0; i < dim2; i++) {

    if (v1 == v2)
    v3 = v1;
    }


    }

    return dim3;

    }
    /* Visualizza i dati del vettore fornito in ingresso */
    void StampaVettore(int v[], int dim) {
    int i;
    for (i = 0; i < dim; i++) {
    printf("i valori del vettore sono: %d \n", v);
    }


    };

    int main(void) {
    int* vett1; /* primo vettore */
    int* vett2; /* secondo vettore */
    int* vett3; /* terzo vettore */
    int dim1; /* dimensione del primo vettore */
    int dim2; /* dimensione del secondo vettore */
    int dim3; /* dimensione del terzo vettore */
    printf("Inserisci il numero di elementi del primo vettore: ");
    scanf_s("%d", &dim1);
    /* alloca il primo vettore */

    vett1 = (int*)malloc(dim1 * sizeof(int));

    printf("Inserisci il numero di elementi del secondo vettore: ");
    scanf_s("%d", &dim2);
    /* alloca il secondo vettore */

    vett2 = (int*)malloc(dim2 * sizeof(int));

    /* inserisce gli elementi dei due vettori di ingresso */
    InserisciVettore(vett1, dim1);

    InserisciVettore(vett2, dim2);
    /* chiama la funzione IntersezioneVettori */


    dim3 = IntersezioneVettori(vett1, vett2, dim1, dim2, vett3);


    /* visualizza il vettore ottenuto come risultato */

    StampaVettore(vett3, dim3);

    /* disalloca i tre vettori */

    free(vett1);
    free(vett2);
    free(vett3);

    return 0;
    }
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    Utilizza i tag CODE per postare il codice o non si capisce nulla. Comunque con quel prototipo non puoi eseguire la malloc all'interno ma all'esterno.

    Chiarisci con il professore o cambia il prototipo e passa v3 come doppio puntatore.
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    Ho parlato con un mio compagno e mi ha detto di togliere il controllo sdl e poi funziona.
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    Controllo sdl? Ma che dice il tuo compagno?
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    oregon ha scritto:


    Controllo sdl? Ma che dice il tuo compagno?
    Mi sa che è il prof quello da rivedere: non è possibile che tutti sti ragazzi abbiano le idee così confuse su argomenti non così complicati
  • Re: ALLOCARE DINAMICAMENTE UN VETTORE SU UNA FUNZIONE

    Weierstrass ha scritto:


    oregon ha scritto:


    Controllo sdl? Ma che dice il tuo compagno?
    Mi sa che è il prof quello da rivedere: non è possibile che tutti sti ragazzi abbiano le idee così confuse su argomenti non così complicati
    Mai dire mai
Devi accedere o registrarti per scrivere nel forum
12 risposte