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 09-07-2004, 19.40.47   #136
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da LoryOne
...
Come faccio a distinguere la prima istanza dalla seconda ?

La stesura del codice non può essere diversa per le due istanze, quindi ciò che cambia è il flusso delle istruzioni all'interno del programma stesso.
E' quindi assolutamente necessario definire una sorta di flag che acquisti due valori differenti in base all'istanza attiva in quel momento e che comandi l'esecuzione della porzione di codice corretta.

E' da tener presente che qualunque struttura tu decida di adibire allo scambio dei dati, questa DEVE necessariamente riportare il valore di tale flag.
Pensavo di usare gli ID dei processi.
Quota:
Poichè è sempre lo stesso codice che opera sullo stesso PC (anche se in due istanze distinte), il programma dovrà necessariamente essere impostato sia per la ricezione sia per il trasferimento dei dati ma il punto principale è che solo quando entrambi i giocatori avranno disposto le navi sulla griglia si potrà dare avvio al gioco.

Già ma come ?
A chi toccherà fare la prima mossa ?
Supponendo che A sia il primo giocatore a sferrarre l'attacco (prima istanza) e quindi in trasmissione dati,B (seconda istanza) dovrà per forza essere in ricezione ma attenzione:
A e B non sono due programmi differenti bensì due istanze dello stesso programma.
E' su questo che sto sbattendo la testa da stamattina, "come faccio a dire all'avversario: tocca a te?"
Quota:
...
Beh, la creazione della memoria condivisa è una di quei punti legati al flag a cui accennavo prima in quanto deve essere creata una sola volta ma accessibile più volte sia in lettura che in scrittura.
Perchè in lettura-scrittura ?
Perchè quando toccherà ad A fare una mossa, la memoria condivisa dovrà contenere le dislocazioni della flotta avversaria. A leggerà le coordinate di B, la confronterà con le sue coordinate comunicherà a B l'esito del colpo ed infine riempirà la memoria condivisa con le sue dislocazioni.
Poi sarà la volta di B e via di seguito finchè uno dei due non si sarà stancato o avrà vinto.
Sto scrivendo ora il pezzo di codice che dovrà chiedere all'inizio il posizionamento delle navi, ho pensato di memorizzarle in un array composto da tante posizioni quante sono le navi da piazzare, ogni posizione dell'array è un tipo strutturato a 2 campi (riga e colonna).
Ogniuno di questi array è visibile solo all'istanza che lo ha creato
Quota:
Per creare una sola volta la memoria condivisa, la primissima cosa da fare sarà:
-p1 Controllare che non vi sia in memoria una prima istanza del programma
-p1a Se p1=0 (sono io la prima istanza) vado a p1b altrimenti ad p1c
-p1b Creo la memoria condivisa
-p1c procedo col resto del programma
questa l'ho implementata così:
Codice:
if(argc == 1) { /*Se è vera vuol dire che questa è la prima istanza,
					  setto campo = griglia, creo la memoria condivisa e il semaforo*/
		for(i=1; i<11; i++)
			for(j=1; j<11; j++)
				griglia[i][j] = ' ';
		for(i=1; i<11; i++)
			for(j=1;j<11;j++)
				campo[i][j] = griglia[i][j];

		//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,1,1,"semaforo");
		if(sem == INVALID_HANDLE_VALUE)Errore_("Errore nella creazione del semaforo");
	}
	else { //Altrimenti è la seconda e setto campo = griglia2, il semaforo già esiste
		for(i=1; i<11; i++)
			for(j=1; j<11; j++)
				griglia2[i][j] = ' ';
		for(i=1; i<11; i++)
			for(j=1;j<11;j++)
				campo[i][j] = griglia2[i][j];
	}
Alhazred non è collegato   Rispondi citando
Vecchio 09-07-2004, 20.05.00   #137
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da Alhazred
...
Codice:
int main(int argc, char*argv[]) {
char campo[10][10];
char griglia[10][10];
char griglia2[10][10];
...
if(argc == 1) {
		for(i=1; i<11; i++)
			for(j=1; j<11; j++)
				griglia[i][j] = ' ';
		for(i=1; i<11; i++)
			for(j=1;j<11;j++)
				campo[i][j] = griglia[i][j];
	}
	else {
		for(i=1; i<11; i++)
			for(j=1; j<11; j++)
				griglia2[i][j] = ' ';
		for(i=1; i<11; i++)
			for(j=1;j<11;j++)
				campo[i][j] = griglia2[i][j];
	}
...
Se argc == 1 allora si tratta della prima istanza del programma, se argc != 1 allora è la seconda, giusto?
A questo punto posso fare le assegnazioni che ho postato sopra?
Tutte e due le istanze chiameranno l'array "campo", ma verranno messi in due aree di memoria differenti (come servirebbe a me) o vedranno tutti e due la stessa area di memoria?
Mi stavo chiedendo: "ma è realmente necessario fare questa cosa per avere due array distinti con lo stesso nome? Se metto solamente l'istruzione
Codice:
for(i=1; i<11; i++)
    for(j=1;j<11;j++)
	campo[i][j] = ' ';
ogni istanza non se ne creerà uno proprio di array? O punteranno entrambi allo stesso?
Alhazred non è collegato   Rispondi citando
Vecchio 09-07-2004, 20.30.16   #138
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Sono distinti.
Perchè non fai una prova ?
Lascia perdere per un attimo quello che stai facendo.
Fai un programmino con un array.
Poi riempi l'array tramite un input
Infine visualizzi il valore degli elementi dell'array.

Inserisci valori diversi per le due istanze.
Vedrai che sebbene l'array è chiamato con lo stesso nome, i valori sono diversi.
LoryOne non è collegato   Rispondi citando
Vecchio 09-07-2004, 21.50.09   #139
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da LoryOne
Sono distinti.
Perchè non fai una prova ?
Lascia perdere per un attimo quello che stai facendo.
Fai un programmino con un array.
Poi riempi l'array tramite un input
Infine visualizzi il valore degli elementi dell'array.

Inserisci valori diversi per le due istanze.
Vedrai che sebbene l'array è chiamato con lo stesso nome, i valori sono diversi.
Ho seguito il tuo consiglio, ho scritto un programmino che crea un array e chiede di inserire i valori al suo interno e poi li stampa, l'ho fatto partire 2 volte ed ho inserito valori diversi, gli array sono risultati distinti
Alhazred non è collegato   Rispondi citando
Vecchio 09-07-2004, 22.10.05   #140
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ho provato a lanciare il programma della battaglia navale lasciando nel main solo queste istruzioni:
Codice:
int main(int argc, char*argv[]) {

//Inizializzazione della griglia di gioco
for(i=1; i<11; i++)
	for(j=1; j<11; j++)
		cArray[i][j] = ' ';
AggiornaCampo();
}
se lascio AggiornaCampo definita come nel file che ho allegato qualche post più indietro mi viene fuori il solito errore "... la memoria non poteva essere read", se invece di printf(" %c ",cArray[i][j]); scrivo printf(" %c ",&cArray[i][j]); non appare l'errore, però le caselle invece di essere vuote (dato che così credo di averle inizializzate) contengono 100 caratteri ASCII ordinati.
Dov'è l'errore?

EDIT: forse è una maledizione, ma penso alla soluzione di un problema e non mi viene, mi arrendo, posto il problema e trovo la soluzione
è bastata questa modifica AggiornaCampo(char cArray[10][10]); ---> AggiornaCampo(char bArray[10][10]);

Ultima modifica di Alhazred : 09-07-2004 alle ore 22.17.03
Alhazred non è collegato   Rispondi citando
Vecchio 09-07-2004, 22.35.29   #141
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Codice:
void PosizionaNavi(){
   int num = 1;
   int iraw = 0;
   char raw;
   char col;

   ClearScreen();
   printf("Inserire le coordinate per %u navi.\n",numeroNavi);
   printf("\n");
   for(num=1;num<numeroNavi+1;num++){
       printf("Restano da posizionare %u navi\n", numeroNavi+1-num);
       printf("Inserisci la colonna per la nave %u: ",num);
       gets(col);
       printf("\n");
       printf("Inserisci la riga per la nave %u: ",num);
       gets(raw);
       printf("\n");
       iraw = raw - 48;
       mArray[num].colonna = col;
       mArray[num].riga = iraw;
   }
}
Questo è il codice per memorizzare la posizione delle navi (mancano ancora i controlli sull'input)
Funziona, ma compilando mi da questi warning:
warning C4047: 'function' : 'char *' differs in levels of indirection from 'char '
warning C4024: 'gets' : different types for formal and actual parameter 1
warning C4047: 'function' : 'char *' differs in levels of indirection from 'char '
warning C4024: 'gets' : different types for formal and actual parameter 1

E' chiaro che ho sbagliato l'uso di gets(), mi dite come va usato?
Alhazred non è collegato   Rispondi citando
Vecchio 10-07-2004, 01.17.44   #142
SkAkKo
Senior Member
 
L'avatar di SkAkKo
 
Registrato: 04-07-2004
Loc.: là sui monti con Annette...
Messaggi: 380
SkAkKo promette bene
gets() acquisisce una stringa...quindi o dichiari col come una stringa
o usi un altra funzione per acquisire un singolo carattere
ad esempio getchar()
___________________________________

...sempre allegri bisogna stare il nostro piangere fa male al re...
SkAkKo non è collegato   Rispondi citando
Vecchio 10-07-2004, 11.36.59   #143
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Codice:
typedef struct {
	int riga;
	char colonna;
} t_Mossa;

char *mArray[numeroNavi];
...
void PosizionaNavi(){
   int num = 1; //decrementa l'output per il numero di navi da posizionare
   int raw = 0; //indice di riga
   int colo = 1; // indice di colonna
   char ccolo = ' ';
   char craw = ' ';
   char *coor = "";

   ClearScreen();
   printf("Inserire le coordinate per %u navi.\n",numeroNavi);
   printf("\n");
   for(num=1;num<numeroNavi+1;num++){
         printf("Navi da posizionare: %u\n", numeroNavi+1-num);
	printf("Inserisci le coordinate per la nave %u: ",num);
	printf("Ha acquisito la coordinata\n");
	gets(coor);
         printf("ha fatto il gets\n");
	ccolo = *coor;
	printf("Ha assegnato ccolo\n");
	colo = ccolo - 64;
	printf("Ha convertito ccolo in int\n");
	craw = *(coor + 1);
	printf("Ha assegnato craw\n");
	raw = craw - 48;
	printf("Ha convertito craw in int\n");
	printf("\n");

	mArray[num] = coor;
	cArray[colo][raw] = 'x'; //da togliere quando funziona
   }
}
Questa storia che "... la memoria non poteva essere READ" mi sta tormentando, perché non funziona?

Ho messo una printf dopo ogni istruzione in modo da vedere a che punto si blocca.

In output accade questo
Inserisci le coordinate per la nave 1: Ha acquisito la coordinata

in pratica prende un ritorno a capo precedente e lo considera come coordinata, poi si blocca.
Come si può ovviare a questo problema?

Ultima modifica di Alhazred : 10-07-2004 alle ore 12.20.27
Alhazred non è collegato   Rispondi citando
Vecchio 10-07-2004, 12.40.25   #144
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Che prolemi sti char vs string

1) Provare:

Codice:
#include <conio.h>

main(void){
      char c;
      
      gets(c);
      printf("%c",*c);
}
2) Provare:

Codice:
#include <conio.h>

main(void){
      char *c;
      
      gets(c);
      printf("%c",*c);
}
3) Provare:
Codice:
#include <conio.h>

main(void){
      char c[10];
      
      gets(c);
      printf("%s",c);
}
4) Provare:

Codice:
#include <conio.h>

main(void){
      char c;
      
      c=getch();
      printf("%c",c);
}
Prima impara il concetto con cose semplici, memorizza ed infine realizza.
LoryOne non è collegato   Rispondi citando
Vecchio 10-07-2004, 13.10.25   #145
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da LoryOne
1) Provare:
Codice:
#include <conio.h>

main(void){
      char c;
      
      gets(c);
      printf("%c",*c);
}
warning C4013: 'gets' undefined; assuming extern returning int
warning C4013: 'printf' undefined; assuming extern returning int
error C2100: illegal indirection

L'errore dovrebbe essere dovuto al fatto che c è un char e non un puntatore a carattere. (modifica: c deve essere un buffer, ci sono arrivato dopo aver visto il terzo esempio)
[quote]
2) Provare:
Codice:
#include <conio.h>

main(void){
      char *c;
      
      gets(c);
      printf("%c",*c);
}
warning C4013: 'gets' undefined; assuming extern returning int
warning C4013: 'printf' undefined; assuming extern returning int
warning C4700: local variable 'c' used without having been initialized

Questo da lo stesso mio problema, va a scrivere dove non dovrebbe.
Quota:
3) Provare:
Codice:
#include <conio.h>

main(void){
      char c[10];
      
      gets(c);
      printf("%s",c);
}
warning C4013: 'gets' undefined; assuming extern returning int
warning C4013: 'printf' undefined; assuming extern returning int

Questo funziona, c è diventato un buffer dove scrivere (l'ho provato nel mio programma e adesso va, dovendo essere la coordinata di 2 caratteri ho messo char coor[2]; giusto?)
Quota:
4) Provare:

Codice:
#include <conio.h>

main(void){
      char c;
      
      c=getch();
      printf("%c",c);
}
warning C4013: 'printf' undefined; assuming extern returning int

Questo se ho capito bene legge il tasto premuto e lo manda in output con la printf in modo che venga scritto solo 1 volta.
Alhazred non è collegato   Rispondi citando
Vecchio 10-07-2004, 17.32.13   #146
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Codice:
void PosizionaNavi(){
   int num = 1; //decrementa l'output per il numero di navi da posizionare
   int i_raw = 0; //indice di riga
   int i_colo = 1; // indice di colonna
   int in_col = 0; //incrementa la posizione di *coor per leggere la colonna
   int in_raw = 0; //incrementa la posizione di *coor per leggere la riga
   char c_colo = ' ';
   char c_raw = ' ';
   char coor[10];
	
   ClearScreen();
   printf("Inserire le coordinate per %u navi.\n",numeroNavi);
   printf("\n");
   for(num=1;num<numeroNavi+1;num++){
	printf("Navi da posizionare: %u\n", numeroNavi+1-num);
	printf("Inserisci le coordinate per la nave %u: ",num);
	gets(coor);
	c_colo = *coor;
	while(c_colo == ' '){ //cerca il primo carattere diverso da blank
		c_colo = *coor+in_col;
		in_col++;
	}
	printf("--%s--",&c_colo); //riga per debug
	i_colo = c_colo - 64;
	in_raw=in_col;
	c_raw = *(coor+in_raw + 1);
	while(c_raw == ' '){ //cerca il secondo carattere diverso da blank
		in_raw++;
		c_raw = *coor+in_raw;
	}
	printf("--%s--",&c_raw); //riga per debug
	i_raw = c_raw - 48;
	printf("\n");

	mArray[num] = coor;
	cArray[i_raw][i_colo] = 'x'; //riga per debug
   }
}
Questo codice, se si inseriscono le coordinate nel formato A5, F8..., funziona, se si mettono degli spazi non funziona più.
Ho pensato di ovviare al problema con i 2 while, ma non accade ciò che avevo in mente (ovvero: finché non trovi un carattere diverso da blank va sul successivo).
Altro problema è che se ad esempio do come coordinata E10, questa viene letta com e E1.
Consigli/soluzioni?
Alhazred non è collegato   Rispondi citando
Vecchio 10-07-2004, 18.01.33   #147
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Miii ragà .. arf ... arf.... .. quanto scrivete .. e quanto codice ..

Tutti gli errori:

"nome funzione" undefined; assuming extern returning int...

sono dovuti al fatto che non è stato incluso nel file l'header con il prototipo della funzione di libreria utilizzata .. e quindi il compilatore pensa (per nostra fortuna) che la funzione sia "extern", il che è vero .. e che ritorni un "int" .. il che purtroppo non è sempre vero, ma nel caso della printf .. può andare...

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 10-07-2004, 18.06.16   #148
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Perché usi così tanto i puntatori?....

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 10-07-2004, 18.09.23   #149
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
Perché usi così tanto i puntatori?....

Bye
Perché mi sto rifacendo a degli esempi, alcuni anche visti a lezione, ci sono sistemi più semplici? Cosa mi consiglieresti di fare?
Alhazred non è collegato   Rispondi citando
Vecchio 10-07-2004, 18.13.37   #150
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Quota:
Alhazred ha scritto:

Perché mi sto rifacendo a degli esempi, alcuni anche visti a lezione, ci sono sistemi più semplici? Cosa mi consiglieresti di fare?
Si, capisco..
però bisogna stare attenti.. altrimenti potresti ritrovarti in alcuni casi a perdere molto tempo a risolvere i problemi che essi stessi creano.. e talvolta scoprire che bastava usare una variabile in più .. oppure una sola riga diversa di codice...

.. ti propongo un'implementazione nel prossimo post...

Bye
P8257 WebMaster 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 11.43.39
battaglia navale in c# Joy&Lu Programmazione 3 01-09-2008 16.08.58
Il Signore degli Anelli - La Battaglia per la terra di mezzo Darth Maul Masterizzazione Giochi Games 0 01-09-2006 19.16.18
[C] Battaglia Navale (versione client server) in Linux Nanri Programmazione 11 06-08-2005 15.50.27

Orario GMT +2. Ora sono le: 20.02.50.


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.