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 07-07-2004, 13.32.24   #106
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Quota:
Alhazred ha scritto:

Quanta memoria devo allocare per contenere l'array di 100 caratteri?
Basta fare il conto 1 carattere = 1 byte => 100 caratteri = 100 bytes o devo tener conto di qualcos'altro?
Esattamente 100 caratteri, equivale a sizeof dell'array .. stai attento al fatto che l'array è bidimensionale....

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 07-07-2004, 13.33.52   #107
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Per l'area di memoria, devi creare una mappatura condivisa cone le funzioni di cui discusso nella parte iniziale del thread ... oppure puoi memorizzare nell'istanza la posizione specifica (offset) della memoria allocata e quindi andare a leggerla e/o controllarne l'esistenza e nel caso riallocarla.

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 07-07-2004, 17.56.55   #108
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
Alh, qualora non avessi abbastanza documentazione in merito , qui
http://www.simpits.org/programming/d...tasharing.html
c'è parecchio

Aggiungo qualche info sui parametri: di CreateFileMapping

hFile

Identifies the file from which to create a mapping object. The file must be opened with an access mode compatible with the protection flags specified by the flProtect parameter. It is recommended, though not required, that files you intend to map be opened for exclusive access.

If hFile is (HANDLE)0xFFFFFFFF, the calling process must also specify a mapping object size in the dwMaximumSizeHigh and dwMaximumSizeLow parameters. The function creates a file-mapping object of the specified size backed by the operating-system paging file rather than by a named file in the file system. The file-mapping object can be shared through duplication, through inheritance, or by name.

lpFileMappingAttributes

Pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle can be inherited by child processes. If lpFileMappingAttributes is NULL, the handle cannot be inherited.

Windows NT: The lpSecurityDescriptor member of the structure specifies a security descriptor for the new file-mapping object. If lpFileMappingAttributes is NULL, the file-mapping object gets a default security descriptor.
Windows 95: The lpSecurityDescriptor member of the structure is ignored.

flProtect

Specifies the protection desired for the file view, when the file is mapped. This parameter can be one of the following values:

Value Description
PAGE_READONLY Gives read-only access to the committed region of pages. An attempt to write to or execute the committed region results in an access violation. The file specified by the hFile parameter must have been created with GENERIC_READ access.
PAGE_READWRITE Gives read-write access to the committed region of pages. The file specified by hFile must have been created with GENERIC_READ and GENERIC_WRITE access.
PAGE_WRITECOPY Gives copy on write access to the committed region of pages. The files specified by the hFile parameter must have been created with GENERIC_READ and GENERIC_WRITE access.


In addition, an application can specify certain section attributes by combining (using the bitwise OR operator) one or more of the following section attribute values with one of the preceding page protection values:

Value Description
SEC_COMMIT Allocates physical storage in memory or in the paging file on disk for all pages of a section. This is the default setting.
SEC_IMAGE The file specified for a section's file mapping is an executable image file. Because the mapping information and file protection are taken from the image file, no other attributes are valid with SEC_IMAGE.
SEC_NOCACHE All pages of a section are to be set as non-cacheable. This attribute is intended for architectures requiring various locking structures to be in memory that is never fetched into the processor's. On 80x86 and MIPS machines, using the cache for these structures only slows down the performance as the hardware keeps the caches coherent. Some device drivers require noncached data so that programs can write through to the physical memory. SEC_NOCACHE requires either the SEC_RESERVE or SEC_COMMIT to also be set.
SEC_RESERVE Reserves all pages of a section without allocating physical storage. The reserved range of pages cannot be used by any other allocation operations until it is released. Reserved pages can be committed in subsequent calls to the VirtualAlloc function. This attribute is valid only if the hFile parameter is (HANDLE)0xFFFFFFFF; that is, a file mapping object backed by the operating sytem paging file.


dwMaximumSizeHigh

Specifies the high-order 32 bits of the maximum size of the file-mapping object.

dwMaximumSizeLow

Specifies the low-order 32 bits of the maximum size of the file-mapping object. If this parameter and dwMaximumSizeHig are zero, the maximum size of the file-mapping object is equal to the current size of the file identified by hFile.

lpName

Points to a null-terminated string specifying the name of the mapping object. The name can contain any character except the backslash character (\).

If this parameter matches the name of an existing named mapping object, the function requests access to the mapping object with the protection specified by flProtect.
If this parameter is NULL, the mapping object is created without a name.



Return Values

If the function succeeds, the return value is a handle to the file-mapping object. If the object existed before the function call, the GetLastError function returns ERROR_ALREADY_EXISTS, and the return value is a valid handle to the existing file-mapping object (with its current size, not the new specified size. If the mapping object did not exist, GetLastError returns zero.

Ultima modifica di LoryOne : 07-07-2004 alle ore 18.24.59
LoryOne non è collegato   Rispondi citando
Vecchio 07-07-2004, 19.55.27   #109
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
Ho visto che hai definito una funzione per cancellare completamente lo schermo scrivendo direttamente nella memoria video attraverso l'uso delle API.
La utilizzi per cancellare la griglia prima di ricrearla ma il tutto produce un fastidioso effetto flicker.
Puoi eliminarlo con questo codice che cancella la parte di schermo comprese tra POS_X,POS_Y,GRID_WIDTH e GRID_HEIGHT

Codice:
void ClearScreenArea(int POS_X,int POS_Y,int GRID_WIDTH,int GRID_HEIGHT){
CHAR_INFO screenBuffer[GRID_WIDTH * GRID_HEIGHT];	
SMALL_RECT drawRect = {POS_X, POS_Y, POS_X + (GRID_WIDTH - 1), 
                      POS_Y + (GRID_HEIGHT - 1)};
COORD gridSize = {GRID_WIDTH , GRID_HEIGHT};
COORD zeroZero = {0, 0};
HANDLE OutputH;							

	OutputH = GetStdHandle(STD_OUTPUT_HANDLE);		
	for(int y = 0; y < gridSize.Y; y++){
		for(int x = 0; x < gridSize.X; x++){			                          
			screenBuffer[x + y * GRID_WIDTH].Char.AsciiChar = 255;
			screenBuffer[x + y * GRID_WIDTH].Attributes = 0;
			}
	}		
	WriteConsoleOutput(OutputH, screenBuffer, gridSize, zeroZero, &drawRect);
}
Ps: Come vedi puoi personalizzarla come vuoi qui:
screenBuffer[x + y * GRID_WIDTH].Char.AsciiChar = [il carattere che vuoi]
e qui:
screenBuffer[x + y * GRID_WIDTH].Attributes = [il colore che vuoi]
LoryOne non è collegato   Rispondi citando
Vecchio 07-07-2004, 21.58.36   #110
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Grazie delle informazioni, ci spenderò un po' di tempo domani mattina
Alhazred non è collegato   Rispondi citando
Vecchio 08-07-2004, 12.39.16   #111
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Per le aree di memoria proprie di ogni istanza e non utilizzabili dall'altra avrei pensato a una cosa di questo tipo:
- parte la prima istanza, riserva un'area di memoria chiamata "griglia" con malloc
- parte la seconda istanza, tenta di riservare un'area di memoria chiamata "griglia", si accorge che già esiste e riserva un'area di memoria che chiamerà "griglia2"

Ho una domanda, come faccio a implementare "si accorge che già esiste"?
Mentre scrivevo forse mi è venuta anche la soluzione, la scrivo per chiedere se è giusta.

Prima istanza: prima di tentare di riservare la memoria per "griglia" prova ad attaccarla, ottiene un handle non valido, alloca la memoria ora.

Seconda istanza: prima di tentare di riservare la memoria per "griglia" prova ad attaccarla, ottiene un handle valido, vuol dire che era già stata allocata e eseguo il codice per allocare la memoria per "griglia2"

La prima istanza utilizzerebbe "griglia" e la seconda "griglia2", così dovrebbe funzionare, giusto?
Alhazred non è collegato   Rispondi citando
Vecchio 08-07-2004, 12.53.53   #112
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
A parere mio, la soluzione mi sembra corretta... bisogna poi vedere come "rende" a livello applicativo ..

Fai attenzione a questa fase:
Prima istanza: prima di tentare di riservare la memoria per "griglia" prova ad attaccarla, ottiene un handle non valido, alloca la memoria ora.

curala molto in particolare questa cosa, "qualcuno" potrebbe ingannarti e la memoria potrebbe essere sporca .. in alcuni casi potresti anche ricevere un handle valido .. non dovrebbe succedere ma per una sicurezza al 100%, puoi avvalerti di una struttura di controllo creata ad hoc.

Per il resto non mi sembra ci sia nulla di sbagliato.

Ah, dimenticavo...
le istanze vanno sempre monitorate costantemente .. la scelta è tua: o fai un controllo periodico dell'esistenza delle istanze, oppure controlli l'esistenza di entrambi i processi .. perché ad uno di essi in qualsiasi momento potrebbe succedere qualcosa e se accade ti ritrovi in panne...

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 08-07-2004, 14.25.08   #113
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
Non capisco.
malloc() si occupa di allocare un certo quantitativo di memoria che non sia già allocata. Restituisce NULL se non è possibile allocare. Se la seconda istanza esegue malloc(), tu avrai due puntatori a due locazioni di memoria non condivise.
Correggetemi se sbaglio
LoryOne non è collegato   Rispondi citando
Vecchio 08-07-2004, 14.49.45   #114
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
Non capisco.
malloc() si occupa di allocare un certo quantitativo di memoria che non sia già allocata. Restituisce NULL se non è possibile allocare. Se la seconda istanza esegue malloc(), tu avrai due puntatori a due locazioni di memoria non condivise.
Correggetemi se sbaglio
La prima istanza punterà a griglia, la seconda a griglia2.
Entrambe sono partizioni di memoria non condivisa, ovvero griglia non può essere usata dalla seconda istanza e griglia2 non può essere usata dalla prima, ma è proprio così che le voglio.
Queste 2 aree devono mantenere memorizzati gli array da visualizzare da ogni istanza.
Ti faccio un esempio di come ho in mente che funzioni il tutto.

Parte la prima istanza (i1), crea una memoria condivisa, alloca la memoria non condivisa per "griglia" e la inizializza con tutte le posiizoni vuote, parte la seconda (i2), attacca la memoria condivisa creata da i1, alloca "griglia2" e la inizializza.
i1 accetta una mossa dall'utente e comunica le coordinate in memoria condivisa, i2 legge la mossa, controlla se a tali coordinate corrisponde una delle navi inizialmente piazzate dal proprio utente e comunica l'esito in memoria condivisa. i1 legge la risposta e inserisce il simbolo corrispondente a ciò che è accaduto in griglia nella posizione indicata dalla mossa che ha fatto ed aggiorna l'output del campo rileggendo il contenuto di griglia.
Ora è il turno di i2, accetta una mossa, la comunica, legge la risposta, memorizza l'esito in griglia2 ed aggiorna il campo leggendo i dati contenuti in griglia2...
Alhazred non è collegato   Rispondi citando
Vecchio 08-07-2004, 15.01.39   #115
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Mi sorge un sospetto, facendo in questo modo dovrei scrivere all'interno del programma due volte lo stesso codice, uno per griglia e uno per griglia2, giusto?
Se è così credo che dovrò ripensare alla soluzione, o si può fare anche così ed evitare di scrivere 2 volte lo stesso codice?
Alhazred non è collegato   Rispondi citando
Vecchio 08-07-2004, 15.15.36   #116
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
Ok, quindi se ho capito bene tu dovresti:
1) Conoscere qual'è l'ammontare della memoria da allocare in modo da sapere se ti basta per l'array.
2) Conoscere l'indirizzo del primo segmento di memoria libero per allocare l'array oppure, se lo vuoi impostare, sapere se rientra nell'area di memoria allocabile.
3) Vedere se la memoria disponibile a quell'indirizzo è già allocata o no ed eventualmente allocarne altra per il nuovo array.

Se non ho capito un emerito c@zzo dimmelo.
Comunque ora è meglio che vada in mensa che magari sto avendo le travegole
LoryOne non è collegato   Rispondi citando
Vecchio 08-07-2004, 15.54.52   #117
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Un'istanza, quando parte, deve controllare se esiste un'area di memoria già allocata con nome griglia, se esiste vuol dire che c'è già un'altra istanza attiva, si disinteressa dell'area già occupata e ne alloca per se un'altra con un altro nome.
Tutto qui, non so se riesco ad essere chiaro, ma non mi viene in mente un altro modo per spiegarmi.

Il problema ora è però quello del codice doppio che ho scritto sopra.
Alhazred non è collegato   Rispondi citando
Vecchio 08-07-2004, 16.24.30   #118
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
Mi sorge un sospetto, facendo in questo modo dovrei scrivere all'interno del programma due volte lo stesso codice, uno per griglia e uno per griglia2, giusto?
Se è così credo che dovrò ripensare alla soluzione, o si può fare anche così ed evitare di scrivere 2 volte lo stesso codice?
Può essere una soluzione questa?
Codice:
char *griglia;
char *griglia2;
char *campo;
...
if(griglia == NULL){
   griglia = malloc(sizeof(cArray[10][10]));
   campo = griglia;
   }
   else {
         griglia2 = malloc(sizeof(cArray[10][10]));
         campo = griglia;
   }
...
In questo modo tutto il resto del codice lo scriverei per "campo" invece che per griglia e griglia2, la prima istanza avrebbe campo=griglia, la seconda campo=griglia2 e non dovrebbero darsi fastidio, o sbaglio?
Alhazred non è collegato   Rispondi citando
Vecchio 08-07-2004, 17.21.48   #119
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
I pensieri mi si stanno accavallando, ho pensato quest'altra soluzione
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?
Alhazred non è collegato   Rispondi citando
Vecchio 08-07-2004, 18.06.25   #120
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
Se due PC differenti lanceranno lo stesso programma si avrà questa situazione:

1° PC
char campo[10][10];
char griglia[10][10];
char griglia2[10][10];

2° PC
char campo[10][10];
char griglia[10][10];
char griglia2[10][10];

Entrambi predispongono la stessa quantità di memoria, sia che argc==1 sia che argc!=1

Se lo stesso PC lancia due istanze dello stesso programma si avrà questa situazione:
char campo[10][10];
char griglia[10][10];
char griglia2[10][10];
+
char campo[10][10];
char griglia[10][10];
char griglia2[10][10];

Sarà doppia la memoria predisposta ma ogni istanza sarà indipendente l'una dall'altra.
LoryOne 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: 10.41.31.


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.