Newsgroup: it.comp.lang.c
Titolo: Ritornare un puntatore a una struct

Ciao a tutti...
sto provando un esercizio nel libro dei Deitel, che chiede, data una
mano di poker, di valutarla...
Il programma di mescolazione e distribuzione era già scritto e funziona
+ o - così:
viene creato un tipo Card in questo modo:
typedef struct card {
   char* seme;
   char* valore;
} Card;
poi nel main vengono dichiarati i due array di stringhe per il seme e il
valore e l'array di Card che rappresenta il mazzo...
Card mazzo[52];
char* seme[] = {"Cuori", "Quadri", "Fiori", "Picche"};
char* valore[] = {"Asso", "Due", "Tre".... };
poi ci sono due funzioni, una che riempie il mazzo con le carte ordinate
(dall'Asso al Re di Cuori, dall'Asso al Re di Quadri....) e l'altra che
le mescola...
A questo punto io ho il mazzo mescolato e voglio fare una funzione che
cicla le prime 5 carte del mazzo, me le copia in un'altro array di 5
Card (che rappresenta la mano) e mi ritorna un puntatore a questo
array...
io l'ho scritta così, ma non funziona :(
int main()
{
	...
	...
	Card* mPtr;
	...
	...
	mPtr = dealPoker(mazzo);
	...
	...
}
Card* dealPoker(Card* wMazzo)
{
	int i;
	Card* manoPtr;
	Card mano[5];
	for (i = 0; i < 5; i++) {
		mano[i] = wMazzo[i];
	}
	manoPtr = mano;
	return manoPtr;
}
Non mi dà errori, però se provo a stampare la mano mi scrive caratteri
strani, e non quello che dovrebbe scrivere!
La funzione per stampare la mano è:
void scopriMano(Card* wMano)
{
	int i;
	for (i = 0; i < 5; i++)
		printf("%s di %s\n", wMano[i].valore, wMano[i].seme);
}
e la invoco dal main con;
scopriMano(mPtr);
Se vi può aiutare ad aiutarmi ( ^_^ ) posto il codice completo, basta
che lo chiedete, ma l'errore dovrebbe essere qui, perchè il resto è roba
scritta dai Deitel! :P
Grazie a tutti coloro che mi aiuteranno :)
Shinji-kun

 essere qui
All'interno della funzione dealPoker(Card* wMazzo) hai dichiarato l'array di
5 elementi mano[5]. Questa è una variabile dinamica e cessa di esistere
quando si esce dalla funzione; quindi il puntatore mPtr punta a qualcosa che
non esiste più.
Le cose si sistemano dichiarando static questo array:
    static Card mano[5];
oppure spostando al di fuori della funzione stessa la dichiarazione.
Maurizio.

 
E invece scrivendo cosě funzionerebbe ugualmente ?
Card *mano=malloc(sizeof(Card)*5);
...
return mano;

<CODE>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
typedef struct card_tag {
        char *seme;
        char *valore;
} card;
char *seme[] =
{"Cuori", "Quadri", "Fiori", "Picche"};
char *valore[] =
{"Asso", "Due", "Tre", "Quattro", "Cinque",
 "Sei", "Sette", "Otto", "Nove", "Dieci",
 "Jack", "Donna", "Re" };
void assegna_carta(card *pC, char *seme, char *valore)
{
     pC->seme = malloc(strlen(seme)+1);
     pC->valore = malloc(strlen(valore)+1);
     strcpy(pC->seme, seme);
     strcpy(pC->valore, valore);
}
void mescola_mazzo(card Mazzo[])
{
     card Temp;
     int i, i1, i2;
     for (i = 0; i < 1000; i++)
     {
         do {
            i1 = rand() % 52;
            i2 = rand() % 52;
         } while (i1 == i2);
         Temp = Mazzo[i1];
         Mazzo[i1] = Mazzo[i2];
         Mazzo[i2] = Temp;
     }
}
void inizializza_mazzo(card Mazzo[])
{
     int i, j;
     for (i = 0; i < 4; i++)
     {
         for (j = 0; j < 13; j++)
         {
             assegna_carta(&Mazzo[i*13 + j],
                             seme[i],
                             valore[j]);
         }
     }
}
int stessa_carta(card C1, card C2)
{
    return strcmp(C1.seme, C2.seme) == 0 &&
           strcmp(C1.valore, C2.valore) == 0;
}
void estrai_mano(card Mano[], card Mazzo[])
{
     int i, j, carta_ok = 1, idx;
     for (i = 0; i < 5; i++)
     {
         do {
            idx = rand() % 52;
            for (j = 0; j < i; j++)
            {
                carta_ok = !stessa_carta(Mano[j], Mazzo[idx]);
                if (!carta_ok)
                  break;
            }
         } while (!carta_ok);
         assegna_carta(&Mano[i],
                       Mazzo[idx].seme,
                       Mazzo[idx].valore);
     }
}
void scrivi_sequenza_carte(card card_arr[], int n)
{
     int i;
     for (i = 0; i < n; i++)
     {
         printf("%s di %s; ", card_arr[i].valore,
                              card_arr[i].seme);
     }
     printf("\n");
}
void scrivi_mazzo(card Mazzo[])
{
     scrivi_sequenza_carte(Mazzo, 52);
}
void scrivi_mano(card Mano[])
{
     scrivi_sequenza_carte(Mano, 5);
}
void pausa(void)
{
     puts("\nPremi INVIO per continuare...");
     getchar();
}
int main()
{
    card Mazzo[52];
    card Mano[5];
    /* inizializzazione seme random */
    srand(time(0));
    puts("Mazzo iniziale:\n");
    inizializza_mazzo(Mazzo);
    scrivi_mazzo(Mazzo);
    pausa();
    puts("Mazzo mescolato:\n");
    mescola_mazzo(Mazzo);
    scrivi_mazzo(Mazzo);
    pausa();
    estrai_mano(Mano, Mazzo);
    puts("Mano estratta:\n");
    scrivi_mano(Mano);
    pausa();
    return 0;
}
</CODE>
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

          } while (i1 == i2);
il programma e' truccato perche' tutti sanno che rand da' informazioni 
predicibili!
Ha sicuramente ritorni economici dallo scrivere codice come questo!
Laforgia probabilmente fa parte di un complotto per la truffa di tutti 
i giocatori di videopoker!
PS - :))))))
mi e' ritornato in mente il tipo del Mersenne twister 19937