RESTITUZIONE DI PUNTATORE A STRUCT

di il
35 risposte

35 Risposte - Pagina 2

  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Weierstrass ha scritto:


    Zack909 ha scritto:


    Weierstrass ha scritto:




    Questo perché il tuo ins_int è già sbagliato alla seconda iterazione, quindi quando tenti di stampare il primo elemento del suo array fai una chiamata ad un'area di memoria totalmente sballata.

    Rileggi gli altri topic e/o la soluzione postata qui, gli errori che fate tutti sono sempre gli stessi
    Quale sarebbe la seconda iterazione?
    Poi la soluzione sconvolge un po troppo il codice, e vorremmo far funzionare l'idea che abbiamo
    Quando intersezione() chiama se stessa, è come se chiamasse un'altra funzione: tutte le informazioni che non vengono passate tramite parametri o tramite variabili globali sono perse.

    Nel vostro caso: che fine ha fatto il valore del puntatore insieme_int che avete impostato con la calloc nella prima chiamata di intersezione ()? La seconda chiamata di intersezione () non ne sa nulla! Ricomincia con un altro puntatore.

    O passate le informazioni tramite i parametri del prototipo, come ho suggerito io, o li passate dall'esterno, come vi ha suggerito Nicola.

    Attenzione a utilizzare gli operatori ++ e --, perché possono riferirsi alle variabili della funzione precedente chiamate per valore e non per riferimento. Nel dubbio usate + 1 e - 1 che non muore nessuno. Ma tutto questo è già stato fatto notare (non mi ricordo da chi).

    P.s.: tutto ciò è estremamente più facile da capire se eseguite il codice in modalità debug.

    I parametri della funzione devono essere per forza 2, cioè i 2 insiemi e non ci possono essere varibili globali (purtroppo le limitazioni sono queste )
    Comunque grazie mille!!
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    nicolap ha scritto:


    Weierstrass ha scritto:


    Attenzione a utilizzare gli operatori ++ e --, perché possono riferirsi alle variabili della funzione precedente chiamate per valore e non per riferimento. Nel dubbio usate + 1 e - 1 che non muore nessuno. Ma tutto questo è già stato fatto notare (non mi ricordo da chi).
    Questa me la spiegheresti?
    Dissento
    Mi sembra che qualcuno abbia fatto un ++ sbagliato nel valore passato nel prototipo, o forse mi ricordo male. Cominciano a essere troppo topic
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Zack909 ha scritto:


    Weierstrass ha scritto:


    Zack909 ha scritto:




    Quale sarebbe la seconda iterazione?
    Poi la soluzione sconvolge un po troppo il codice, e vorremmo far funzionare l'idea che abbiamo
    Quando intersezione() chiama se stessa, è come se chiamasse un'altra funzione: tutte le informazioni che non vengono passate tramite parametri o tramite variabili globali sono perse.

    Nel vostro caso: che fine ha fatto il valore del puntatore insieme_int che avete impostato con la calloc nella prima chiamata di intersezione ()? La seconda chiamata di intersezione () non ne sa nulla! Ricomincia con un altro puntatore.

    O passate le informazioni tramite i parametri del prototipo, come ho suggerito io, o li passate dall'esterno, come vi ha suggerito Nicola.

    Attenzione a utilizzare gli operatori ++ e --, perché possono riferirsi alle variabili della funzione precedente chiamate per valore e non per riferimento. Nel dubbio usate + 1 e - 1 che non muore nessuno. Ma tutto questo è già stato fatto notare (non mi ricordo da chi).

    P.s.: tutto ciò è estremamente più facile da capire se eseguite il codice in modalità debug.

    I parametri della funzione devono essere per forza 2, cioè i 2 insiemi e non ci possono essere varibili globali (purtroppo le limitazioni sono queste )
    Comunque grazie mille!!
    Manco si può dichiararla static una variabile?
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Weierstrass ha scritto:


    Zack909 ha scritto:


    Weierstrass ha scritto:




    Quando intersezione() chiama se stessa, è come se chiamasse un'altra funzione: tutte le informazioni che non vengono passate tramite parametri o tramite variabili globali sono perse.

    Nel vostro caso: che fine ha fatto il valore del puntatore insieme_int che avete impostato con la calloc nella prima chiamata di intersezione ()? La seconda chiamata di intersezione () non ne sa nulla! Ricomincia con un altro puntatore.

    O passate le informazioni tramite i parametri del prototipo, come ho suggerito io, o li passate dall'esterno, come vi ha suggerito Nicola.

    Attenzione a utilizzare gli operatori ++ e --, perché possono riferirsi alle variabili della funzione precedente chiamate per valore e non per riferimento. Nel dubbio usate + 1 e - 1 che non muore nessuno. Ma tutto questo è già stato fatto notare (non mi ricordo da chi).

    P.s.: tutto ciò è estremamente più facile da capire se eseguite il codice in modalità debug.

    I parametri della funzione devono essere per forza 2, cioè i 2 insiemi e non ci possono essere varibili globali (purtroppo le limitazioni sono queste )
    Comunque grazie mille!!
    Manco si può dichiararla static una variabile?
    Da quanto ne so no
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Ma dai? Manco "static insieme_t *ins_int;" vuole il prof?
    Che vi ha prescritto, allora? Impostazione diretta di un registro del processore tramite asm()? Telepatia?

    Suvvia
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Comunque questa è la versione con la variabile static, non ve l'ho postata subito, vi avevo lasciato solo l'indizio...
    #include <stdio.h>
    
    struct insieme
    {
      double *  a;
      int       l;
    };
    
    insieme * intersezione(insieme i1, insieme i2)
    {
        int k, j;
        double temp;
        insieme * ret = NULL;
        static unsigned int step = 0;
    
        for(k = step; k < i1.l; k++)
            for(j = step; j < i2.l; j++)
                if(i1.a[k] == i2.a[j])
                {
                    temp = i1.a[step];
                    i1.a[step] = i1.a[k];
                    i1.a[k] = temp;
                    temp = i2.a[step];
                    i2.a[step] = i2.a[j];
                    i2.a[j] = temp;
                    step++;
                    return intersezione(i1, i2);
                }
    
        ret = (insieme *)malloc(sizeof(insieme));
        if(ret == NULL){
            step = 0;
            return NULL;
        }
        ret->l = step;
        if(step){
            ret->a = (double *)malloc(step*sizeof(double));  
            if(ret->a == NULL)
            {
                step = 0;
                return NULL; 
            }
            while(step--)
                ret->a[step] = i1.a[step];       
        }
        else
            ret->a = NULL;
        
        step = 0;
        return ret;    
    }
    L'ordinamento è inevitabile: pensate bene a come risolvereste voi il problema con due sacchetti di palline colorate.
    Se non volete toccare gli insiemi di partenza, fatene due insiemi copia prima.
    Esistono anche funzioni per il sort e per la copia, non ci sarebbe bisogno di fare nulla a mano.

    A voi la palla
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    @Weierstrass: ti do lo stesso consiglio che ho dato ormai tante volte agli altri. Usa nomi delle variabili SIGNIFICATIVI.
    Se in un esempio chiami "a" o "l" qualcosa non aiuti ma confondi.
    Non ho letto il resto del codice perché richiede troppo temo e troppa fatica!
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    nicolap ha scritto:


    @Weierstrass: ti do lo stesso consiglio che ho dato ormai tante volte agli altri. Usa nomi delle variabili SIGNIFICATIVI.
    Se in un esempio chiami "a" o "l" qualcosa non aiuti ma confondi.
    Non ho letto il resto del codice perché richiede troppo temo e troppa fatica!
    Grazie del consiglio, ma la routine funziona. I nomi lunghi se li mettono loro
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Weierstrass ha scritto:


    Comunque questa è la versione con la variabile static, non ve l'ho postata subito, vi avevo lasciato solo l'indizio...
    #include <stdio.h>
    
    struct insieme
    {
      double *  a;
      int       l;
    };
    
    insieme * intersezione(insieme i1, insieme i2)
    {
        int k, j;
        double temp;
        insieme * ret = NULL;
        static unsigned int step = 0;
    
        for(k = step; k < i1.l; k++)
            for(j = step; j < i2.l; j++)
                if(i1.a[k] == i2.a[j])
                {
                    temp = i1.a[step];
                    i1.a[step] = i1.a[k];
                    i1.a[k] = temp;
                    temp = i2.a[step];
                    i2.a[step] = i2.a[j];
                    i2.a[j] = temp;
                    step++;
                    return intersezione(i1, i2);
                }
    
        ret = (insieme *)malloc(sizeof(insieme));
        if(ret == NULL){
            step = 0;
            return NULL;
        }
        ret->l = step;
        if(step){
            ret->a = (double *)malloc(step*sizeof(double));  
            if(ret->a == NULL)
            {
                step = 0;
                return NULL; 
            }
            while(step--)
                ret->a[step] = i1.a[step];       
        }
        else
            ret->a = NULL;
        
        step = 0;
        return ret;    
    }
    L'ordinamento è inevitabile: pensate bene a come risolvereste voi il problema con due sacchetti di palline colorate.
    Se non volete toccare gli insiemi di partenza, fatene due insiemi copia prima.
    Esistono anche funzioni per il sort e per la copia, non ci sarebbe bisogno di fare nulla a mano.

    A voi la palla

    Veramente grazie mille ho provato la funzione e va alla grande!!
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Weierstrass ha scritto:


    Comunque questa è la versione con la variabile static, non ve l'ho postata subito, vi avevo lasciato solo l'indizio...
    #include <stdio.h>
    
    struct insieme
    {
      double *  a;
      int       l;
    };
    
    insieme * intersezione(insieme i1, insieme i2)
    {
        int k, j;
        double temp;
        insieme * ret = NULL;
        static unsigned int step = 0;
    
        for(k = step; k < i1.l; k++)
            for(j = step; j < i2.l; j++)
                if(i1.a[k] == i2.a[j])
                {
                    temp = i1.a[step];
                    i1.a[step] = i1.a[k];
                    i1.a[k] = temp;
                    temp = i2.a[step];
                    i2.a[step] = i2.a[j];
                    i2.a[j] = temp;
                    step++;
                    return intersezione(i1, i2);
                }
    
        ret = (insieme *)malloc(sizeof(insieme));
        if(ret == NULL){
            step = 0;
            return NULL;
        }
        ret->l = step;
        if(step){
            ret->a = (double *)malloc(step*sizeof(double));  
            if(ret->a == NULL)
            {
                step = 0;
                return NULL; 
            }
            while(step--)
                ret->a[step] = i1.a[step];       
        }
        else
            ret->a = NULL;
        
        step = 0;
        return ret;    
    }
    L'ordinamento è inevitabile: pensate bene a come risolvereste voi il problema con due sacchetti di palline colorate.
    Se non volete toccare gli insiemi di partenza, fatene due insiemi copia prima.
    Esistono anche funzioni per il sort e per la copia, non ci sarebbe bisogno di fare nulla a mano.

    A voi la palla
    Mi dispiace, ma tra le specifiche del progetto sono vietati molteplici return all'interno della stessa funzione, mi sono accorto ora
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Bene, allora rimuovete
    
    if(ret->a == NULL)
            {
                step = 0;
                return NULL; 
            }
    
    se proprio avete paura che il prof vi bocci se decidete di gestire una mancata allocazione invece di fare andare in crash il programma...
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Weierstrass ha scritto:


    Bene, allora rimuovete
    
    if(ret->a == NULL)
            {
                step = 0;
                return NULL; 
            }
    
    se proprio avete paura che il prof vi bocci se decidete di gestire una mancata allocazione invece di fare andare in crash il programma...
    non basta, perchè c'è la return sia quando richiami la funzione che alla fine...(return ret)
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Zack909 ha scritto:


    Weierstrass ha scritto:


    Bene, allora rimuovete
    
    if(ret->a == NULL)
            {
                step = 0;
                return NULL; 
            }
    
    se proprio avete paura che il prof vi bocci se decidete di gestire una mancata allocazione invece di fare andare in crash il programma...
    non basta, perchè c'è la return sia quando richiami la funzione che alla fine...(return ret)
    E grazie, volete la recursione e contemporaneamente il puntatore come return type...

    Consegnate in bianco allora
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Weierstrass ha scritto:


    Zack909 ha scritto:


    Weierstrass ha scritto:


    Bene, allora rimuovete
    
    if(ret->a == NULL)
            {
                step = 0;
                return NULL; 
            }
    
    se proprio avete paura che il prof vi bocci se decidete di gestire una mancata allocazione invece di fare andare in crash il programma...
    non basta, perchè c'è la return sia quando richiami la funzione che alla fine...(return ret)
    E grazie, volete la recursione e contemporaneamente il puntatore come return type...

    Consegnate in bianco allora
    Ah guarda stiamo diventando scemi, ma non si può fare senza puntatore?
  • Re: RESTITUZIONE DI PUNTATORE A STRUCT

    Zack909 ha scritto:


    Weierstrass ha scritto:


    Zack909 ha scritto:




    non basta, perchè c'è la return sia quando richiami la funzione che alla fine...(return ret)
    E grazie, volete la recursione e contemporaneamente il puntatore come return type...

    Consegnate in bianco allora
    Ah guarda stiamo diventando scemi, ma non si può fare senza puntatore?
    Si può fare questo che funziona una volta sola, ma per me è cattiva programmazione
    
    insieme * intersezione(insieme i1, insieme i2)
    {
        int k, j;
        double temp;
        static insieme * ret = NULL;
        static unsigned int step = 0;
    
        for(k = step; k < i1.l; k++)
            for(j = step; j < i2.l; j++)
                if(ret == NULL && i1.a[k] == i2.a[j])
                {
                    temp = i1.a[step];
                    i1.a[step] = i1.a[k];
                    i1.a[k] = temp;
                    temp = i2.a[step];
                    i2.a[step] = i2.a[j];
                    i2.a[j] = temp;
                    step++;
                    intersezione(i1, i2);
                }
        
        if(ret == NULL)
        {   
            ret = (insieme *)malloc(sizeof(insieme));
                
            ret->l = step;
            if(step){
                ret->a = (double *)malloc(step*sizeof(double));  
                while(step--)
                    ret->a[step] = i1.a[step];       
            }
            else
                ret->a = NULL;
    
            return ret;    
    
        }
    }
    
Devi accedere o registrarti per scrivere nel forum
35 risposte