Telefonino.net network
 
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. NEI PREFERITI .:: | RSS Forum | RSS News | NEWS web | NEWS software |
| PUBBLICITA' | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | CERCA nel FORUM » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 19-07-2004, 16.12.05   #226
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Dato che devo distinguere solo 2 casi mi sa che uso
if(istanza == 1)
{
codice prima istanza
}
else
{
codice seconda istanza
}
Alhazred non è collegato   Rispondi citando
Vecchio 19-07-2004, 16.22.37   #227
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Mi sembra che scorra bene il codice (Y)...

I blocchi strutturati in C/C++ (e altri linguaggi derivati) hanno la seguente sintassi:

Codice:
switch(variabile)
{
   case <caso>: <istruzioni>
                break;

   ...
   default: istruzioni
            break;

}
Attenzione che in C, a differenza di altri linguaggi, la variabile deve essere intera oppure direttamente "castabile" in int, come un char ad esempio.

Usa questo al posto di if.. else if .. è più corretto...

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 19-07-2004, 17.05.21   #228
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ho aggiunto lo switch e alcune istruzioni, all'interno dello switch ancora non sono tutte.
Per decidere chi inizia ho pensato di generare un numero casuale tra 1 e 2, confrontarlo con instanza e inizierà chi otterrà TRUE dal confronto, è giusta l'istruzione primo = 1 + (rand()%2) per generare il numero casuale?
Codice:
int main(int argc, char*argv[]) {
	HANDLE hOut;
	int i = 0, j = 0, primo;
	int istanza = 0;
	long dummy;

	HANDLE mapping, sem;
	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	//Inizializzazione della griglia di gioco
	for(i=1; i<11; i++)
		for(j=1; j<11; j++)
			cArray[i][j] = ' ';	

	memset(&si, 0, sizeof(si));
	memset(&pi, 0, sizeof(pi));
	si.cb = sizeof(si);

	mapping = CreateFileMapping(INVALID_HANDLE_VALUE,
						NULL,PAGE_READWRITE,
						0,
						0,
						"shared_mem");

	if(mapping == INVALID_HANDLE_VALUE) //se è vera, questa è la prima istanza del programma
		istanza = 1;
	else istanza = 2;
	
	switch(istanza)
	{
		case 1:
			//Creazione memoria condivisa
			mapping = CreateFileMapping(INVALID_HANDLE_VALUE,
						NULL,
						PAGE_READWRITE,
						0,
						0,
						"shared_mem");

			if(mapping == INVALID_HANDLE_VALUE)
				Errore_("Errore nella creazione della memoria condivisa");

			//Creazione semaforo
			sem = CreateSemaphore(NULL,0,1,"semaforo");
			if(sem == INVALID_HANDLE_VALUE)
				Errore_("Errore nella creazione del semaforo");

			sem = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"semaforo");
			if(sem == INVALID_HANDLE_VALUE)
				Errore_("Errore nell'apertura del semaforo");
	
			WaitForSingleObject(sem,INFINITE);//attende il rilascio del semaforo da parte della
							//seconda istanza per sapere quando è attiva
			ReleaseSemaphore(sem,1,&dummy);//ora sa che la seconda istanza è attiva
			primo = 1 + (rand()%2); //genera un numero casuale per decidere chi inizia

			break;

		case 2:
			sem = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "semaforo");
			if(sem == INVALID_HANDLE_VALUE)
				Errore_("Errore nell'apertura del semaforo");

			ReleaseSemaphore(sem,1,&dummy);//consente l'accesso al semaforo da parte
							//della prima istanza in modo che sappia
						         //che la seconda è attiva
			break;
	}

	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
	posizione.X = 0;
    posizione.Y = 24;
	SetConsoleCursorPosition(hOut,posizione);
}
Alhazred non è collegato   Rispondi citando
Vecchio 19-07-2004, 17.08.41   #229
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Si, l'istruzione è giusta per generare il numero casuale.

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 19-07-2004, 17.14.50   #230
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
C'é una certa ridondanza nel codice ... il caso 1 può benissimo essere gestito a partire dall'handle della prima chiamata a CreateFileMapping... poiché già da lì capisci se quella è la prima o la seconda istanza...

Questo mi fa venire in mente un aneddoto in cui il mio professore d'informatica si sbellicò dalle risate perché mi chiese di fare un programma per controllare se un numero fosse pari o dispari .. ed io controllavo prima che fosse pari .. e poi che fosse dispari ....

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 19-07-2004, 17.30.12   #231
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Dici di fare così?
Codice:
int main(int argc, char*argv[]) {
	HANDLE hOut;
	BOOL inizia = FALSE;
	int i = 0, j = 0, primo;
	int istanza = 0;
	long dummy;

	HANDLE mapping, sem;
	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	//Inizializzazione della griglia di gioco
	for(i=1; i<11; i++)
		for(j=1; j<11; j++)
			cArray[i][j] = ' ';	

	memset(&si, 0, sizeof(si));
	memset(&pi, 0, sizeof(pi));
	si.cb = sizeof(si);

	sem = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"semaforo");
	if(sem == INVALID_HANDLE_VALUE) //se è vera, questa è la prima istanza del programma
						{
            //Creazione memoria condivisa

		mapping = CreateFileMapping(INVALID_HANDLE_VALUE,
						NULL,
						PAGE_READWRITE,
						0,
						0,
						"shared_mem");

		if(mapping == INVALID_HANDLE_VALUE)
			Errore_("Errore nella creazione della memoria condivisa");

		//Creazione semaforo
		sem = CreateSemaphore(NULL,0,1,"semaforo");
		if(sem == INVALID_HANDLE_VALUE)
			Errore_("Errore nella creazione del semaforo");

		sem = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"semaforo");
		if(sem == INVALID_HANDLE_VALUE)
			Errore_("Errore nell'apertura del semaforo");
	
		WaitForSingleObject(sem,INFINITE);//attende il rilascio del semaforo da parte della
						//seconda istanza per sapere quando è attiva
		primo = 1 + (rand()%2); //genera un numero casuale per decidere chi inizia

		p->riga = primo;
			
		if(primo == istanza)
			inizia = TRUE;
			
		ReleaseSemaphore(sem,1,&dummy);//ora sa che la seconda istanza è attiva
		
	}
	else
	{
		sem = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "semaforo");
		if(sem == INVALID_HANDLE_VALUE)
			Errore_("Errore nell'apertura del semaforo");

		ReleaseSemaphore(sem,1,&dummy);//consente l'accesso al semaforo da parte
						//della prima istanza in modo che sappia
						//che la seconda è attiva
		WaitForSingleObject(sem,INFINITE);

		primo = p->riga;

		if(primo == istanza)
			inizia = TRUE;
		ReleaseSemaphore(sem,1,&dummy);
	}

	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
	posizione.X = 0;
    posizione.Y = 24;
	SetConsoleCursorPosition(hOut,posizione);
}
Ho anche aggiunto dell'altro codice, così dovrei aver finito di gestire la parte iniziale che crea la memoria condivisa, il semaforo e decide chi comincia.
Come sto andando?
Alhazred non è collegato   Rispondi citando
Vecchio 19-07-2004, 17.31.25   #232
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Si, proprio così ..

Bene (imho) (Y)

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 19-07-2004, 17.39.47   #233
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Mi sto rendendo conto di una cosa, sto assumendo che il pc eseguirà le istruzioni così come le penso io, però c'è da considerare l'effetto time sharing, questo potrebbe sballare la situazione dell'accesso alla sezione critica. Qualche suggerimento su come fare?
Alhazred non è collegato   Rispondi citando
Vecchio 19-07-2004, 17.42.48   #234
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
IMHO un counter... o una struttura di controllo

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 19-07-2004, 17.46.07   #235
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da P8257 WebMaster
IMHO un counter... o una struttura di controllo

Bye
Mi spiegheresti meglio?
Come dovrei usare tale counter?
Come dovrei impostare la struttura di controllo?
Alhazred non è collegato   Rispondi citando
Vecchio 19-07-2004, 17.53.09   #236
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
La struttura di controllo da "ficcare" nella memoria condivisa deve tenere conto di alcuni parametri scritti e letti da entrambi i processi:

1 - Id del processo creatore
2 - Id del processo che per ultimo ha acceduto all'area condivisa
3 - timestamp dell'ultimo accesso
4 - parametri da passare da un processo all'altro

Questi sono i requisiti minimi, per essere sicuro che:

A - il processo creatore dell'area sia la prima istanza dell'applicazione
B - L'ultima scrittura sia stata fatta da un'altra istanza dello stesso processo e non da un processo diverso o estraneo
C - Che l'ultima scrittura sia identificabile attraverso un certo intervallo "temporale"

... trasporta questi dati da un processo all'altro, ti permetteranno di gestire meglio il tutto.

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 19-07-2004, 18.12.04   #237
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
E se usassi una cosa di questo tipo?

HANDLE sem[2];
...
tutto il codice per aprire ed inizializzare in modo appropriato i due semafori
...

e usare sem[0] per far accedere P1 alla memoria condivisa e sem[1] per farvi accedere P2
Alhazred non è collegato   Rispondi citando
Vecchio 20-07-2004, 09.11.25   #238
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Quota:
Alhazred ha scritto:
E se usassi una cosa di questo tipo?

HANDLE sem[2];
...
tutto il codice per aprire ed inizializzare in modo appropriato i due semafori
...

e usare sem[0] per far accedere P1 alla memoria condivisa e sem[1] per farvi accedere P2
L'idea è buona .. ma in certi aspetti potrebbe risultarti difficile da gestire...

Bye

Ultima modifica di P8257 WebMaster : 20-07-2004 alle ore 09.45.45
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 20-07-2004, 11.18.13   #239
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Il programma ora dovrebbe fare quanto segue, ma non riesco a proprio a pansare al codice adatto a gestire gli accessi in memoria condivisa.
Lo schema da seguire è quello postato qualche pagina indietro, ovvero
Codice:
1 - Dopo aver posizionato le navi entrambi i processi si mettono in attesa
    (semaforo occupato)
2 - si sorteggia chi inizia
3 - il processo non sorteggiato (P2) resta in attesa che in memoria
    condivisa ci sia la coordinata fornita dall'altro processo (P1)
4 - si comunica a P1 di iniziare (semaforo libero per P1)
5 - P1 chiede al proprio utente di inserire una coordinata
6 - P1 accetta la mossa controllando che sia valida e la scrive
    in memoria condivisa (P1 rilascia il semaforo in favore di P2)
7 - si comunica a P2 che il dato che cerca è pronto (semaforo libero per P2)
8 - P2 cerca una corrispondenza tra le coordinate inserite dal suo utente
    all'inizio, se tale corrispondenza esiste o no
9 - nel caso esiste, P2, decrementa il numero di navi non colpite e controlla
    quante ne restano
10 - se le navi rimanenti sono + di 0 comuinca in memoria condivisa che una nave
     è stata colpita rilasciando poi il semaforo in favore di P1
11 - se le navi rimanenti sono 0 comunica in memoria condivisa che ha perso
     rilasciando poi il semaforo in favore di P1
12 - P1 occupa il semaforo, elabora il risultato fornito da P2 e fa apparire un
     simbolo corrispondente all'esito della mossa sulla griglia del proprio
     utente oppure comunica la vittoria, rilascia il semaforo e attende
     la mossa di P2
13 - si ripetono i passi da 4 a 12 invertendo P1 con P2 e così via finché
     qualcuno ha vinto.
Le funzioni che fanno il lavoro descritto già ci sono, Scrivi() e Controlla(), il problema è essere sicuri che vengano eseguite nell'ordine giusto.
Alhazred non è collegato   Rispondi citando
Vecchio 20-07-2004, 17.15.56   #240
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ecco l'intero codice con i controlli di Scrivi() completi così come quelli di ControllaColopo() (spero) e l'aggiunta di una funzione che controlla l'esito di un colpo.
Alhazred non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
La grande battaglia dei super eroi! Sbavi Chiacchiere in libertà 83 27-02-2009 10.43.39
battaglia navale in c# Joy&Lu Programmazione 3 01-09-2008 15.08.58
Il Signore degli Anelli - La Battaglia per la terra di mezzo Darth Maul Masterizzazione Giochi Games 0 01-09-2006 18.16.18
[C] Battaglia Navale (versione client server) in Linux Nanri Programmazione 11 06-08-2005 14.50.27

Orario GMT +2. Ora sono le: 12.52.16.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.