Newsgroup: it.comp.programmare.win32
Titolo: Qualcuno mi sa spiegare perché....

... questo programma non fa esattamente quello che deve?
Vi do il listato intero, ma il problema è conentrato solo nel 
ramo del main "if (scelta == 3)". Quello che volevo io era che il 
programma inserisse la stringa NULL nei punti desiderati, ma non 
lo fa... anzi, quando controllo il contenuto della memoria per 
vedere se l'ha fatto, mi accorgo che tutto è rimasto com'era. 
Cos'è che non va?
#include <windows.h>
#include <stdio.h>
#define gap 512
#define slotsize 512
int main(){
HANDLE map, mutex;
char *pointer, *endpointer, scelta, testo [480], mex;
long counter;
// creazione del mutex
mutex = CreateMutex(NULL, FALSE, "artemis");
if(mutex==NULL){
    printf("Impossibile creare il semaforo\n");
    ExitProcess(-1);
}
// creazione della memoria condivisa
map = CreateFileMapping(INVALID_HANDLE_VALUE,
      NULL,
      PAGE_READWRITE,
      0,
      50000,
      "mnemesyne");
if(map==INVALID_HANDLE_VALUE){
    printf("Impossibile creare la memoria condivisa\n");
    ExitProcess(-1);
}
map = OpenFileMapping(FILE_MAP_WRITE,TRUE,"mnemesyne");
pointer = (char *)MapViewOfFile(map,FILE_MAP_WRITE,0,0,0);
strncpy(pointer,"Oggetto:\nBenvenuto",slotsize); pointer += gap;
strncpy(pointer,"quit",slotsize); pointer += gap;
strncpy(pointer,"Testo:\nQuesta e' la tua bacheca!",slotsize); 
pointer +=gap;
strncpy(pointer,"quit",slotsize); pointer += gap;
endpointer = pointer;
strncpy(endpointer+gap,"end",slotsize);
do{
printf("\n1. Leggi i messaggi\n2. Scrivi un messaggio\n3. 
Cancella un messaggio\n4. Esci\n\n");
scanf("%d", &scelta);
if (scelta == 1){
    WaitForSingleObject(mutex, INFINITE);
     map = OpenFileMapping(FILE_MAP_WRITE,TRUE,"mnemesyne");
     pointer = (char *)MapViewOfFile(map,FILE_MAP_WRITE,0,0,0);
         while(strcmp(pointer,"end") != 0) {
         printf("%s\n", pointer);
         pointer += gap;
         }
     ReleaseMutex(mutex);
     }
if (scelta == 2){
     WaitForSingleObject(mutex, INFINITE);
     map = OpenFileMapping(FILE_MAP_WRITE,TRUE,"mnemesyne");
     pointer = endpointer;
     printf("\nOggetto del messaggio ('quit' per terminare):\n");
     strncpy(pointer,"\nOggetto:", slotsize); pointer+=gap;
		  do {
          scanf("\n%s",testo);
          strncpy(pointer,testo, slotsize);
          pointer += gap;
          } while((strcmp(testo,"quit") != 0));
     printf("\nTesto del messaggio ('quit' per terminare):\n");
     strncpy(pointer,"Testo:", slotsize);pointer+=gap;
          do {
          scanf("\n%s",testo);
          strncpy(pointer,testo, slotsize);
          pointer += gap;
          } while((strcmp(testo,"quit") != 0));
     endpointer = pointer;
     strncpy(endpointer+gap,"end",slotsize);
     ReleaseMutex(mutex);
     }
if (scelta == 3){
     WaitForSingleObject(mutex, INFINITE);
     map = OpenFileMapping(FILE_MAP_WRITE,TRUE,"mnemesyne");
     pointer = (char *)MapViewOfFile(map,FILE_MAP_WRITE,0,0,0);
	 printf("\nNumero del messaggio da cancellare?\n");
	 scanf("\n%d",&mex);
		while(strcmp(pointer,"end") != 0) {
        pointer += gap;
		if(strcmp(pointer,"quit") != 0)
		counter++;
		if (counter >= 2*mex-2 && counter < 2*mex)
		strncpy(pointer,"NULL", slotsize);
		}
    ReleaseMutex(mutex); 
	}
}while(scelta!=4);
}
Ah, inoltre, conoscete una funzione per immettere testo da 
tastiera che a differenza di scanf accetti un'intera frase e non 
la divida in diverse parole ogni volta che compare _blank?
Grazie per l'eventuale risposta.
-- 
Lord Gas, the Waxen - Blasfemo di IFTMDG - Penguin's Enemy #1 
[ICQ: 57483751][the Waxen Pith: 
http://www.snipp.org/gas
]
... "Goddamn, there's always such a big temptation to be good"
... (Tom Waits - God's Away on Business)

ramo del main "if (scelta == 3)". 
Da una scorsa veloce al codice credo che tutto dipenda dall'uso di
scanf() che fai.  Non va mai usata per letture successive, a meno di
usare una funzione di svuotamento del buffer di input.  Es.:
void flush_keyb_buff()
{
     while (getchar() != '\n')
           ;
}
Ti conviene utilizzare sempre fgets() (che tra l'altro č piů sicura,
imponendo un limite al numero di caratteri in input) ed eventualmente
trasformare il valore letto in intero.  
Prova.
P.S.: non fare cross-posting.
-- 
Andrea Laforgia - a.laforgia(at)
libero.it
"There are three kinds of people in this world; 
 those who are good at maths and those who aren't".

 P.S.: non fare cross-posting.
Speravo che qualcuno di it.comp.lang.c sapesse dire qualcosa, 
invece puntualmente tacciono. O sono tutte persone che smanettano 
solo su linux o gli basta vedere una system call per farli 
allarmare.
Ti sarò grato se mi spiegherai cosa non ho colto nel tuo 
consiglio. Grazie.


 richiede un puntatore a un file, ma io non ho nessun file...
Qualcuno ti ha rubato stdin?
C:\>aio Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Usa una delle seguenti:
1)     char *gets(char *s);
2)     char *fgets(char *s, int size, FILE *stream);
3)     int getchar(void);
(1)
char riga[MAX_RIGA];
gets(riga);
(2)
char riga[MAX_RIGA];
fgets(riga,MAX_RIGA,stdin);
(1)
char riga[MAX_RIGA];
int i;
for (i=0; (riga[i] = getchar()) != '\n'; i++);
riga[i] = '\0';
Ciao,
Ema

invece puntualmente tacciono. 
In it.comp.lang.c si è soliti rispondere ai messaggi che riportano
solo una piccola porzione di codice e si tende a non rispondere ai
messaggi cross-postati perché i propri non vengano cross-postati a
propria volta.  In quanto al "puntualmente", ti invito a rileggere
quante risposte vengono date in it.comp.lang.c, per questioni
riguardanti strettamente il linguaggio, quel ng è molto attivo.


 fgets(riga,MAX_RIGA,stdin);
le stringhe e' sempre meglio dichiararle MAX+1 cosi' quando passi a fgets 
c'e' spazio x inserire il \0 :) quindi char riga[MAX_RIGA+1] e poi 
fgets(riga,MAX_RIGA,stdin);
Luca
-- 
....~.......xin\@IRCNet (mostly xin\aWAy 24/7 ghgh).../"\
.../V\......Email: xi...@despammed.com................\ /
..// \\.....ICQ UIN: 63088554..........................\
./(   )\........................ASCII Ribbon Campaign./ \
..^`~'^.........................Against HTML Mail and News

c'e' spazio x inserire il \0 
No.  
fgets() assicura sempre la presenza del terminatore nullo.


 poi fgets(riga,MAX_RIGA,stdin);
fgets legge MAX-1 caratteri e riserva l'ultimo byte, di indice MAX-1, 
al '\0': per cui facendo come hai detto ottieni soltanto di sprecare 
un byte.
Saluti
-- 
Per l'e-mail rimuovere la frase in maiuscolo e gli underscore.