|
| 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 » | |
![]() |
#196 |
Hero Member
Registrato: 09-05-2002
Loc.: COMO
Messaggi: 1.135
![]() |
![]()
___________________________________
...ad ogni alba sorgerà il tuo profumo |
![]() |
![]() |
![]() |
#197 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Ecco come ho pensato di gestire il gioco:
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) (come faccio a rilasciare il semaforo ed essere sicuro che lo occuperà proprio 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. Ultima modifica di Alhazred : 17-07-2004 alle ore 14.22.56 |
![]() |
![]() |
![]() |
#198 | |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
Quota:
P1 mettera il suo al momento dell'inizializzazione, P2 il suo al momento del lancio... Per il resto, mi sembra corretta come macro analisi, scomponendo il problema in step ancora più piccoli ed accurati, ci si potrà rendere conto se vengono a galla potenziali altri step minori... Bye ![]() |
|
![]() |
![]() |
![]() |
#199 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Ho appena scoperto che l'if(argc == 1) non mi è utile per capire se è la prima o la seconda volta che lancio il programma.
Ho fatto la prova facendo stampare il valore di argc e in tutti e due i casi era pari a 1. Come faccio a capire se già c'è un'istanza dello stesso programma in esecuzione? |
![]() |
![]() |
![]() |
#200 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
Ovviamente, argc è il contatore dell'array dei parametri di linea di comando, il primo elemento contiene il nome del processo stesso:
argv[0] Per capire se c'é un altro processo in memoria potresti guardare direttamente la memoria condivisa o provare a crearla oppure utilizzare API che ti restituiscano il nome dei processi .... Consiglio la creazione di un mini-loader (anche un batch va bene) che si occupi di lanciare le due istanze... Bye ![]() |
![]() |
![]() |
![]() |
#201 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Questo è l'esempio visto a lezione da cui ho preso spunto per usare if(argc ==1), perché qui dovrebbe funzionare e nel mio programma no?
Codice:
Esempio di applicazione: trasferimento stringhe tra processi #include <windows.h> #include <stdio.h> #define DISP_ 20 #define Errore_(x) { puts(x);ExitProcess(1); } char messaggio[256]; void scrittore(HANDLE mapping) { char *p; p = (char *)MapViewOfFile(mapping, FILE_MAP_WRITE, 0, 0, 0); if ( p == NULL )Errore_("Errore nella chiamata MapViewOfFile"); puts("Digitare le parole da trasferire in memoria condivisa('quit' per terminare):"); do { scanf("%s",messaggio); strncpy(p,messaggio, DISP_); p += DISP_; } while( (strcmp(messaggio,"quit") != 0)); ExitProcess(0); } void lettore(HANDLE mapping) { char *p; p = (char *)MapViewOfFile(mapping, FILE_MAP_WRITE, 0, 0, 0); if ( p == NULL )Errore_("Errore nella chiamata MapViewOfFile"); printf("Contenuto memoria condivisa: \n"); while( (strcmp(p,"quit") != 0)) { printf("%s\n", p); p += DISP_; } ExitProcess(0); } int main(int argc, char *argv[]) { HANDLE mapping; BOOL newprocess; STARTUPINFO si; PROCESS_INFORMATION pi; if (argc==1) { /*Creazione/accesso segmento memoria condivisa*/ mapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 50000, "my_mapping"); if ( mapping == INVALID_HANDLE_VALUE)Errore_("Errore nella CreateFileMapping"); /*genero il processo scrittore*/ memset(&si, 0,sizeof(si)); memset(&pi, 0,sizeof(pi)); si.cb=sizeof(si); newprocess=CreateProcess(".\\mapper.exe", ".\\mapper.exescrittore", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); if (newprocess== 0) { printf("Errore nella generazione dello scrittore!\n"); ExitProcess(-1); } WaitForSingleObject(pi.hProcess, INFINITE); memset(&si, 0,sizeof(si)); /*genero il processo lettore*/ memset(&pi, 0,sizeof(pi)); si.cb=sizeof(si); newprocess=CreateProcess(".\\mapper.exe", ".\\mapper.exelettore", NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); if (newprocess== 0) { printf("Errore nella generazione dello scrittore!\n"); ExitProcess(-1); } WaitForSingleObject(pi.hProcess, INFINITE); } else if (argc== 2 &&strcmp(argv[1], "scrittore") == 0) { mapping =OpenFileMapping(FILE_MAP_WRITE, FALSE, "my_mapping"); /*Apro ilfile mapping */ if (mapping == INVALID_HANDLE_VALUE) { printf("Errore nell'aperuradel mapping!\n"); ExitProcess(-1) } scrittore(mapping); /*chiamoloscrittore*/ } else if (argc== 2 &&strcmp(argv[1], "lettore") == 0) { mapping =OpenFileMapping(FILE_MAP_WRITE, FALSE, "my_mapping"); /*Apro ilfile mapping */ if (mapping == INVALID_HANDLE_VALUE) { printf("Errore nell'aperuradel mapping!\n"); ExitProcess(-1); } lettore(mapping); /*chiamo il lettore*/ } return(0); } |
![]() |
![]() |
![]() |
#202 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
Perché questo programma viene lancaito con un parametro:
"scrittore" "lettore" per indicargli quale istanza è... Bye ![]() |
![]() |
![]() |
![]() |
#203 | ||
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
Quota:
|
||
![]() |
![]() |
![]() |
#204 | ||
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
Quota:
Quota:
![]() ![]() ![]() Bye ![]() |
||
![]() |
![]() |
![]() |
#205 | |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
![]() |
|
![]() |
![]() |
![]() |
#206 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
L'utente ha un diavolo in corpo ..
![]() ![]() Bye ![]() |
![]() |
![]() |
![]() |
#207 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Mi succede una cosa strana, compilo il programma e non ho problemi, modifico la funzione Scrivi(), ricompilo e mi viene restituito questo errore:
error C2198: 'AggiornaCampo' : too few actual parameters ma AggiornaCampo() non la tocco, perché mi da problemi? L'errore resta anche se tolgo completamente Scrivi() ![]() Codice:
void Scrivi(HANDLE mapping) { char c_col = ' ', c_raw = ' '; char coorx[3]; char tmpStr[3]; int Count2, nave; BOOL existingCol = FALSE, existingRaw = FALSE; t_Mossa *p; coorx[0] = '\0'; tmpStr[0] = '\0'; p = (t_Mossa*)MapViewOfFile(mapping, FILE_MAP_WRITE, 0, 0, 0); if(p == NULL)Errore_("\"Scrivi\" non può attaccare la memoria condivisa"); printf("Inserisci le coordinate per il colpo: Colonna_"); // A-J while((c_col < 65) || (c_col > 74)) c_col = getch(); coorx[0] = c_col; printf("%c Riga_", c_col); c_col = ' '; // reset // 0-9 while(((c_raw < 48) || (c_raw > 57))) c_raw = getch(); printf("%c", c_raw); tmpStr[0] = c_raw; c_raw = ' '; // reset // 0-9 o ENTER per non dare coordinata a cifra singola while(((c_raw < 48) || (c_raw > 57)) && (c_raw != 13)) // invio = conferma c_raw = getch(); printf("%c", c_raw); tmpStr[1] = c_raw; c_raw = ' '; // reset printf("\n\r"); // Scansione duplicati for(Count2=0;Count2<(nave-1);Count2++) { if(mArray[Count2].colonna == coorx[0]) existingCol = TRUE; if(mArray[Count2].riga == atoi(tmpStr)) existingRaw = TRUE; } // Se non esistono duplicati: valorizzo if( (existingCol == FALSE) && (existingRaw == FALSE) || (existingCol == FALSE) && (existingRaw == TRUE) || (existingCol == TRUE) && (existingRaw == FALSE) ) { mArray[nave-1].riga = atoi(tmpStr); mArray[nave-1].colonna = coorx[0]; nave++; } else // altrimenti: avverto e obbligo a inserire nuovamente i valori printf("\nSu questa coordinata è gia' stato sparato un colpo.\n", nave); // controlli di range delle coordinate di riga. if((atoi(tmpStr) < 1) || (atoi(tmpStr) > 10)) { printf("\nValori di colonna validi: A-J, valori di riga validi: 1-10.\n"); nave--; } p->riga = c_raw; ExitProcess(0); } |
![]() |
![]() |
![]() |
#208 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
Non è che per caso .. prima di modificare la funzione "scrivi", hai toccato anche la "aggiornacampo", magari aggiungendo o togliendo qualche parametro .. e non hai poi modificato il prototipo?...
L'errore dato sembra dovuto al fatto che il prototipo sia diverso dall'implementazione... Bye ![]() |
![]() |
![]() |
![]() |
#209 | |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
![]() |
Quota:
![]() ![]() ![]() |
|
![]() |
![]() |
![]() |
#210 | |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
|
|
![]() |
![]() |
![]() |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
![]() |
||||
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 |