PDA

Visualizza versione completa : Una variabile mal vista


Alhazred
12-12-2007, 17.09.06
Nel mio programma vorrei rendere invisibile il cursore lampeggiante sulla console. Riesco a farlo, nessun problema, se non fosse che poi non è più utilizzabile il mailslot sul quale il server invia informazioni al client :confused:

E' sufficiente che la variabile
CONSOLE_CURSOR_INFO CCInfo;
sia anche solo dichiarata per far si che il mailslot non funzioni, la elimino e tutto torna alla normalità.
Da che cosa potrebbe dipendere?
Potrei capire, con difficoltà sinceramente, se questo dipendesse da un seguente uso improprio della variabile, per questo ho provato a rimuovere tutto il codice in cui viene usata per nascondere il cursore, ma niente devo togliere per forza anche la dichiarazione.

Alhazred
13-12-2007, 11.28.35
Premessa - per far creare al client un mailslot con nome diverso dagli altri uso l'id del processo, quindi il mailslot ha un nome del tipo \\.\mailslot\client3600 e lo faccio in questo modo

ID = GetCurrentProcessId();
sprintf(mailslot_id,"\\\\.\\mailslot\\client%d", ID);

a questo punto nella variabile mailslot_id c'è il nome del mailslot da creare ed è sicuramente corretto perché ho controllato mettendo una stamapa.

Mettendo qualche altra stampa per controllare cosa succede ho notato queste cose:

1) Se la variabile CCInfo non è dichiarata
Il client scrive correttamente il nome del mailslot creato nella variabile dedicata a memorizzarlo, accedo al servizio di login, metto il nome utente (ad esempio alhazred) e mailslot_id è ancora intatta, metto la password e mailslot_id è ancora intatta, invio la richiesta, il server la riceve correttamente, attacca senza problemi il mailslot del client e tutto funziona a dovere.

2) Dichiaro la variabile CCInfo (globale visto che va usata in più funzioni), non faccio altro, non c'è alcuna linea di codice che ne faccia uso.
Il client scrive correttamente il nome del mailslot creato nella variabile dedicata a memorizzarlo, accedo al servizio di login, metto il nome utente (ad esempio alhazred) e mailslot_id è ancora intatta, dopo alcune linee di codice mailslot_id diventa \\.\mailslot\clialhazred invece di rimanere una cosa tipo \\.\mailslot\client3600 e in questo codice mailslot_id non compare

/******* leggo username *******/
PosizionaCursore(hOut,34,10);
strcpy(MyMessage,UserInput(MAX_SEND_REC,1));
strcpy(controllo,MyMessage);
strcat(MyMessage,"\n\0");
strcpy(request_message.req.da, MyMessage); //metto la username nel messaggio
PosizionaCursore(hOut,0,1);
printf("%s",mailslot_id); // qui è tutto ok
/******************************/
if(strcmp(controllo,"escape") != 0) { //se è stato premuto esc si torna aalla selezione iniziale
len = strlen(MyMessage);
if( MyMessage[len-1] == '\n' )
MyMessage[len-1] = 0;
len = strlen(MyMessage);
if( MyMessage[len-1] == '\0' )
MyMessage[len-1] = 0;
strcpy(nome, MyMessage); //Sarà il titolo della console
SetConsoleTextAttribute(hOut,normale);
PosizionaCursore(hOut,34,10);
printf("%s",nome);
len = strlen(nome);
for(i=0; i<(12 - len);i++)
printf(" ");
PosizionaCursore(hOut,34,12);
SetConsoleTextAttribute(hOut,invertito);
printf(" ");

PosizionaCursore(hOut,0,2);
printf("%s",mailslot_id); //mailslot_id è stato modificato


Non ne capisco il motivo visto che la differenza tra le due situazioni è solo la dichiarazione di una variabile, non cambia altro. :fool:

Aiuto! :wall: :crying:

Alhazred
13-12-2007, 11.44.01
Rileggendo il messaggio mi è caduta l'attenzione sulla frase "globale visto che va usata in più funzioni".
Ho fatto diventare la variabile locale alle funzioni dove mi serve e tutto funziona bene.
Il problema dunque è risolto, ma se qualcuno conosce il motivo per cui così funziona e con la variabile globale no mi farebbe comunque piacere se me lo spiegasse. :)