Mischiare un mazzo

di il
13 risposte

Mischiare un mazzo

Sto facendo una funzione che mischi un mazzo creandone una nuova e inserendo nodi randomici del vecchio mazzo nel nuovo però non riesco a capire perchè quando restituisco il mazzo mi viene stampato un mazzo vuoto
Nodo *mischia_mazzo(Nodo *mazzo, int difficolta){
    Nodo *mazzo_provvisorio = NULL, *testa = mazzo, *testa_2 = NULL, *precedente;
    int tipo_nuova_carta,dimensione_mazzo,carta_temporanea, i, j, l=1;
    char descrizione_nuova_carta[127+1];
    dimensione_mazzo=scelta_mazzo(difficolta);
    mazzo_provvisorio = (Nodo *)malloc(sizeof(Nodo));
    testa_2 = mazzo_provvisorio;
    mazzo_provvisorio = mazzo_provvisorio->next;
    for(i=0; i<dimensione_mazzo; i++){

        ///Scelgo una carta
        carta_temporanea=MIN_2+rand()%((dimensione_mazzo-i)-MIN_2+1);
        printf("\nCARTA SCELTA = %d", carta_temporanea);
        ///Scorro la lista fino alla carta scelta
        for(j=0; j<carta_temporanea; j++){
            precedente = mazzo;
            mazzo = mazzo->next;
        }

        ///Inserisco in testa la carta nella nuova lista
        tipo_nuova_carta = mazzo->carta.tipo_carta;
        strcpy(descrizione_nuova_carta, mazzo->carta.descrizione);
        mazzo_provvisorio = inserisciNodoInTesta2(mazzo_provvisorio, tipo_nuova_carta, descrizione_nuova_carta);
        mazzo_provvisorio -> next = testa_2 -> next;
        printf("\n\nMazzo mischiato = ");
        visualizza_lista(testa_2);
        printf("%d", l++);
        mazzo_provvisorio = mazzo_provvisorio->next;

        ///Elimino la carta dalla vecchia lista
        mazzo = elimina_in_posizione(precedente, testa);
    }
    free(mazzo);
    return mazzo;
}

13 Risposte

  • Re: Mischiare un mazzo

    Premesso che hai postato un codice non compilabile quindi, per quanto mi riguarda, non sono in grado di aiutarti, ciò premesso mi è caduto l'occhio su le due ultimi istruzioni della funzione postata
    
       free(mazzo);
        return mazzo;
    
    dove stai ritornando un puntatore ad una memoria liberata, quindi dal contenuto indefinito (una qualsiasi variabile successiva ci può scrivere dentro).
  • Re: Mischiare un mazzo

    sebaldar ha scritto:


    Premesso che hai postato un codice non compilabile quindi, per quanto mi riguarda, non sono in grado di aiutarti, ciò premesso mi è caduto l'occhio su le due ultimi istruzioni della funzione postata
    
       free(mazzo);
        return mazzo;
    
    dove stai ritornando un puntatore ad una memoria liberata, quindi dal contenuto indefinito (una qualsiasi variabile successiva ci può scrivere dentro).
    Non mi ero accorto dell'errore ma comunque la mia domanda non cambia.
    Non chiedo che mi sia corretto il codice ma chiedevo se qualcuno poteva spiegarmi come fare in modo che venga restituita la testa del nuovo mazzo (credo sia quello l'errore e cioè che quando vado a stampare il mazzo parte dall'ultimo nodo e quindi sembra che sia vuoto)
  • Re: Mischiare un mazzo

    Danielee ha scritto:


    sebaldar ha scritto:


    Non chiedo che mi sia corretto il codice ma chiedevo se qualcuno poteva spiegarmi come fare in modo che venga restituita la testa del nuovo mazzo (credo sia quello l'errore e cioè che quando vado a stampare il mazzo parte dall'ultimo nodo e quindi sembra che sia vuoto)
    devi però mettermi nelle condizioni di compilarlo perché capisci bene che individuare un errore da un listato è una impresa ardua a meno di cose, come quella che ti ho segnalato, che saltano subito all'occhio.
  • Re: Mischiare un mazzo

    sebaldar ha scritto:


    Danielee ha scritto:


    sebaldar ha scritto:


    Non chiedo che mi sia corretto il codice ma chiedevo se qualcuno poteva spiegarmi come fare in modo che venga restituita la testa del nuovo mazzo (credo sia quello l'errore e cioè che quando vado a stampare il mazzo parte dall'ultimo nodo e quindi sembra che sia vuoto)
    devi però mettermi nelle condizioni di compilarlo perché capisci bene che individuare un errore da un listato è una impresa ardua a meno di cose, come quella che ti ho segnalato, che saltano subito all'occhio.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MIN_2 1
    
    typedef enum{NOPE, ATTACK, SKIP, FAVOR, SEE_THE_FUTURE, SHUFFLE, DJANNI_CARDS, EXPLODING_DJANNI, MEOOOW}Tipo;
    
    typedef struct{
        char descrizione[127+1];
        Tipo tipo_carta;
    }Carta;
    
    struct Nodo{
        Carta carta;
        struct Nodo *next;
    };
    
    typedef struct Nodo Nodo;
    
    int main()
    {
        return 0;
    }
    
    void visualizza_lista(Nodo *p);
    Nodo *elimina_in_posizione(Nodo *mazzo, Nodo *testa);
    Nodo *mischia_mazzo(Nodo *mazzo, int difficolta);
    int scelta_mazzo(int difficolta);
    Nodo *inserisciNodoInTesta2(Nodo *p, int tipo, char *descrizione);
    
    Nodo *elimina_in_posizione(Nodo *mazzo, Nodo *testa){
        Nodo *p=NULL;
        ///Se la lista è vuota
        if(mazzo->next==NULL){
        }
        ///Se la lista e' composta da più di un elemento
            else if(mazzo->next!=NULL || mazzo->next->next!=NULL){
                    p=mazzo->next;
                    mazzo->next=mazzo->next->next;
                    free(p);
    
                }
                ///Se l'elemento è l'ultimo della lista
                else if(mazzo->next!=NULL || mazzo->next->next==NULL){
                    p=mazzo->next;
                    free(p);
                }
        return testa;
    }
    
    void visualizza_lista(Nodo *p){
        printf("\n\n\nInizio mazzo ---> ");
        while(p != NULL){
            printf("\n%d %s", p->carta.tipo_carta, p->carta.descrizione);
            p = p->next;
        }
        printf("\nFine mazzo\n");
    }
    
    Nodo *mischia_mazzo(Nodo *mazzo, int difficolta){
        Nodo *mazzo_provvisorio = NULL, *testa = mazzo, *testa_2 = NULL, *precedente;
        int tipo_nuova_carta,dimensione_mazzo, carta_temporanea, i, j, l=1;
        char descrizione_nuova_carta[127+1];
        dimensione_mazzo=scelta_mazzo(difficolta);
        mazzo_provvisorio = (Nodo *)malloc(sizeof(Nodo));
        testa_2 = mazzo_provvisorio;
        mazzo_provvisorio = mazzo_provvisorio->next;
    
        for(i=0; i<dimensione_mazzo; i++){
            ///Scelgo una carta
            carta_temporanea = MIN_2+rand()%((dimensione_mazzo-i)-MIN_2+1);
            printf("\nCARTA SCELTA = %d", carta_temporanea);
    
            ///Scorro la lista fino alla carta scelta
            for(j=0; j<carta_temporanea; j++){
                precedente = mazzo;
                mazzo = mazzo->next;
            }
    
            ///Inserisco in testa la carta nella nuova lista
            tipo_nuova_carta = mazzo->carta.tipo_carta;
            strcpy(descrizione_nuova_carta, mazzo->carta.descrizione);
            mazzo_provvisorio = inserisciNodoInTesta2(mazzo_provvisorio, tipo_nuova_carta, descrizione_nuova_carta);
            printf("\n\nMazzo mischiato = ");
            visualizza_lista(testa_2);
            printf("%d", l++);
            mazzo_provvisorio = mazzo_provvisorio->next;
    
            ///Elimino la carta dalla vecchia lista
            mazzo = elimina_in_posizione(precedente, testa);
        }
        free(mazzo);
        return testa_2;
    }
    
    int scelta_mazzo(int difficolta){
        int numero_1, numero_2, numero_3;
        FILE *fd;
        int dimensione_mazzo;
        ///Scelta del mazzo in base alla difficolta
        if(difficolta==1){
            fd=fopen("explodingDjanniEasy.txt", "r");
        }
        if(difficolta==2){
            fd=fopen("explodingDjanniMedium.txt", "r");
        }
        if(difficolta==3){
            fd=fopen("explodingDjanniHard.txt", "r");
        }
        fscanf(fd, "%d %d %d\n", &numero_1, &numero_2, &numero_3);
        dimensione_mazzo=numero_1+numero_2+numero_3;
        fclose(fd);
        return dimensione_mazzo-1;
    }
    
    
    Nodo *inserisciNodoInTesta2(Nodo *p, int tipo, char *descrizione){
        Nodo *testa;
        ///Funzione usata per inserire le carte mischiate in una nuova lista
        p = (Nodo *)malloc(sizeof(Nodo));
        testa = p;
        p->carta.tipo_carta = tipo;
        strcpy(p->carta.descrizione, descrizione);
        p = p->next;
        return testa;
    }
    
  • Re: Mischiare un mazzo

    Cosa fa main?
  • Re: Mischiare un mazzo

    sebaldar ha scritto:


    Cosa fa main?
    Nulla, l'ho messo solo perchè visto che doveva compilare dovevo aggiungere strutture e funzioni ma se vuoi aggiungo anche la parte del main
  • Re: Mischiare un mazzo

    Danielee ha scritto:


    sebaldar ha scritto:


    Cosa fa main?
    Nulla, l'ho messo solo perchè visto che doveva compilare dovevo aggiungere strutture e funzioni ma se vuoi aggiungo anche la parte del main
    bè, se non ti sbatti un po' tu non vedo perché gli altri lo debbano fare per te ?
  • Re: Mischiare un mazzo

    sebaldar ha scritto:


    Danielee ha scritto:


    sebaldar ha scritto:


    Cosa fa main?
    Nulla, l'ho messo solo perchè visto che doveva compilare dovevo aggiungere strutture e funzioni ma se vuoi aggiungo anche la parte del main
    bè, se non ti sbatti un po' tu non vedo perché gli altri lo debbano fare per te ?
    Ma tu mi hai chiesto di fare in modo che compilasse e io l'ho fatto
  • Re: Mischiare un mazzo

    sebaldar ha scritto:


    Danielee ha scritto:


    sebaldar ha scritto:


    Cosa fa main?
    Nulla, l'ho messo solo perchè visto che doveva compilare dovevo aggiungere strutture e funzioni ma se vuoi aggiungo anche la parte del main
    bè, se non ti sbatti un po' tu non vedo perché gli altri lo debbano fare per te ?
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MIN_2 1
    
    typedef enum{NOPE, ATTACK, SKIP, FAVOR, SEE_THE_FUTURE, SHUFFLE, DJANNI_CARDS, EXPLODING_DJANNI, MEOOOW}Tipo;
    
    typedef struct{
        char descrizione[127+1];
        Tipo tipo_carta;
    }Carta;
    
    struct Nodo{
        Carta carta;
        struct Nodo *next;
    };
    
    typedef struct Nodo Nodo;
    
    void visualizza_lista(Nodo *p);
    Nodo *elimina_in_posizione(Nodo *mazzo, Nodo *testa);
    Nodo *mischia_mazzo(Nodo *mazzo, int difficolta);
    int scelta_mazzo(int difficolta);
    Nodo *inserisciNodoInTesta2(Nodo *p, int tipo, char *descrizione);
    Nodo *leggi_lista(int );
    Nodo *inserisciNodoInTesta(Nodo *, Carta);
    
    int main()
    {
        int difficolta;
        Nodo *mazzo, *mazzo_mischiato;
        mazzo=leggi_lista(difficolta);
        printf("\n\nMazzo non mischiato = ");
        visualizza_lista(mazzo);
        mazzo_mischiato=mischia_mazzo(mazzo, difficolta);
        printf("\n\nMazzo mischiato = ");
        visualizza_lista(mazzo_mischiato);
        return 0;
    }
    
    
    Nodo *elimina_in_posizione(Nodo *mazzo, Nodo *testa){
        Nodo *p=NULL;
        ///Se la lista è vuota
        if(mazzo->next==NULL){
        }
        ///Se la lista e' composta da più di un elemento
            else if(mazzo->next!=NULL || mazzo->next->next!=NULL){
                    p=mazzo->next;
                    mazzo->next=mazzo->next->next;
                    free(p);
    
                }
                ///Se l'elemento è l'ultimo della lista
                else if(mazzo->next!=NULL || mazzo->next->next==NULL){
                    p=mazzo->next;
                    free(p);
                }
        return testa;
    }
    
    Nodo *leggi_lista(int difficolta){
        int i;
        int tipo;
        char descrizione[127+1];
        int numero_1, numero_2, numero_3;
        Carta carta_temporanea;
        Nodo *p=NULL;
        FILE *fd;
    
        ///Scelta del mazzo in base alla difficolta
        if(difficolta==1){
            fd=fopen("explodingDjanniEasy.txt", "r");
        }
        if(difficolta==2){
            fd=fopen("explodingDjanniMedium.txt", "r");
        }
        if(difficolta==3){
            fd=fopen("explodingDjanniHard.txt", "r");
        }
    
        ///Lettura del file
        fscanf(fd, "%d %d %d\n", &numero_1, &numero_2, &numero_3);
    
        ///Caricamento del mazzo nella lista
        for(i=0; i<numero_1+numero_2+numero_3; i++){
            fscanf(fd, "%d %[^\n]s", &tipo, descrizione);
            fscanf(fd, "\n");
            carta_temporanea.tipo_carta=tipo;
            strcpy(carta_temporanea.descrizione, descrizione);
            p=inserisciNodoInTesta(p, carta_temporanea);
        }
        fclose(fd);
        return p;
    }
    
    void visualizza_lista(Nodo *p){
        printf("\n\n\nInizio mazzo ---> ");
        while(p != NULL){
            printf("\n%d %s", p->carta.tipo_carta, p->carta.descrizione);
            p = p->next;
        }
        printf("\nFine mazzo\n");
    }
    
    Nodo *inserisciNodoInTesta(Nodo *p, Carta carta_temporanea){
        Nodo *punt=NULL;
        punt=p;
    
        ///Funzione usata per caricare il mazzo dal file nella lista
        p=(Nodo *)malloc(sizeof(Nodo));
        p->carta=carta_temporanea;
        p->next=punt;
        return p;
    }
    
    Nodo *mischia_mazzo(Nodo *mazzo, int difficolta){
        Nodo *mazzo_provvisorio = NULL, *testa = mazzo, *testa_2 = NULL, *precedente;
        int tipo_nuova_carta,dimensione_mazzo, carta_temporanea, i, j, l=1;
        char descrizione_nuova_carta[127+1];
        dimensione_mazzo=scelta_mazzo(difficolta);
        mazzo_provvisorio = (Nodo *)malloc(sizeof(Nodo));
        testa_2 = mazzo_provvisorio;
        mazzo_provvisorio = mazzo_provvisorio->next;
    
        for(i=0; i<dimensione_mazzo; i++){
            ///Scelgo una carta
            carta_temporanea = MIN_2+rand()%((dimensione_mazzo-i)-MIN_2+1);
            printf("\nCARTA SCELTA = %d", carta_temporanea);
    
            ///Scorro la lista fino alla carta scelta
            for(j=0; j<carta_temporanea; j++){
                precedente = mazzo;
                mazzo = mazzo->next;
            }
    
            ///Inserisco in testa la carta nella nuova lista
            tipo_nuova_carta = mazzo->carta.tipo_carta;
            strcpy(descrizione_nuova_carta, mazzo->carta.descrizione);
            mazzo_provvisorio = inserisciNodoInTesta2(mazzo_provvisorio, tipo_nuova_carta, descrizione_nuova_carta);
            printf("\n\nMazzo mischiato = ");
            visualizza_lista(testa_2);
            printf("%d", l++);
            mazzo_provvisorio = mazzo_provvisorio->next;
    
            ///Elimino la carta dalla vecchia lista
            mazzo = elimina_in_posizione(precedente, testa);
        }
        free(mazzo);
        return testa_2;
    }
    
    int scelta_mazzo(int difficolta){
        int numero_1, numero_2, numero_3;
        FILE *fd;
        int dimensione_mazzo;
        ///Scelta del mazzo in base alla difficolta
        if(difficolta==1){
            fd=fopen("explodingDjanniEasy.txt", "r");
        }
        if(difficolta==2){
            fd=fopen("explodingDjanniMedium.txt", "r");
        }
        if(difficolta==3){
            fd=fopen("explodingDjanniHard.txt", "r");
        }
        fscanf(fd, "%d %d %d\n", &numero_1, &numero_2, &numero_3);
        dimensione_mazzo=numero_1+numero_2+numero_3;
        fclose(fd);
        return dimensione_mazzo-1;
    }
    
    
    Nodo *inserisciNodoInTesta2(Nodo *p, int tipo, char *descrizione){
        Nodo *testa;
        ///Funzione usata per inserire le carte mischiate in una nuova lista
        p = (Nodo *)malloc(sizeof(Nodo));
        testa = p;
        p->carta.tipo_carta = tipo;
        strcpy(p->carta.descrizione, descrizione);
        p = p->next;
        return testa;
    }
    
  • Re: Mischiare un mazzo

    Passo a qualcuno più volenteroso
  • Re: Mischiare un mazzo

    sebaldar ha scritto:


    Passo a qualcuno più volenteroso
    Ah beh...va bene...grazie lo stesso..
  • Re: Mischiare un mazzo

    Nessuno che riesce ad aiutarmi?
  • Re: Mischiare un mazzo

    Come ti ho detto finché non fornisci un codice che sia compilabile e eseguibile è difficile che qualcuno ti aiuti. Il programma richiedere dei file esterni che non fornisci.
Devi accedere o registrarti per scrivere nel forum
13 risposte