Newsgroup: it.comp.programmare.win32
Titolo: strano comportamento

Con VC6, esempio tratto dal Petzold:
perche' se scrivo questa funzione in winmain
while (TRUE)
     {	 
          if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
          {
               if (msg.message == WM_QUIT)
                    break ;
 
               TranslateMessage (&msg) ;
               DispatchMessage (&msg) ;
          }
          else { 
		DrawRectangle (hwnd) ;
		int i = 10000000;	// err. manca ; prima di type
		while ( i--) ;          // err. i non dichiarata
          }
     }
mi da errore come se non avessi dichiarato i
mentre se la dichiaro prima di DrawRectangle() tutto funziona?
Manfry

Io ho fatto letteralmente un copia&incolla del tuo codice così come sta, e
non dà nessun problema in compilazione (a parte DrawRectangle che non
esiste, e quindi l'ho tolta...).
    Marco

Guarda che non esiste alcuna API con DrawRectangle. esiste un
DrawFocusRect(RECT rc);
Se invece la funzione è tua devi dichiararne un prototipo prima di
WinMain
Per quello ti dice che manca ; prima di int i, proprio perchè quella
funzione o non esiste o viene dichiarata dopo. Quindi quella chiamata
a DrawRectangle non permette al compilatore di andare avanti e di
capire che i è una variabile i. Insomma, togli DrawRectangle e tutto
sarà a posto.
Ciao



hai ragione scusa, e' colpa mia;
la funzione drawrectangle e' implementata nel cpp e dichiarata prima
di essere usata, ho riportato un frammento di codice insufficiente per
la comprensione.
Il problema non lo da la funzione ma la mia dichiarazione della
variabile i (che ho inserito io insieme al while):
	int i = 10000000;
	while ( i--) ;          
se non lo metto (sul libro non c'e' ) funziona tutto correttamente.
cio' che e' strano e' che dichiarando int i subito prima del while, il
compilatore da errore:
C:\Prova\Petzold\Chap05\RandRect\RandRect.c(61) : error C2143: syntax
error : missing ';' before 'type'
C:\Prova\Petzold\Chap05\RandRect\RandRect.c(62) : error C2065: 'i' :
undeclared identifier
mentre se sposto la dichiarazione subito prima della chiamata della
funzione (oppure altrove purche' ancora prima) tutto funziona come
dovrebbe.
Manfry

esiste, e quindi l'ho tolta...).
ho provato anch'io e funziona, ma perche' se ci metto la funzione non
va?
riporto  la struttura del mio programma:
- dichiarazioni varie, tra cui drawrectangle
- win main:
	- dichiarazione e registrazione di window class
	- creazione di una finestra
	- ciclo while seguente:
while (TRUE)
     {	  int j = 0;
          if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
          {
               if (msg.message == WM_QUIT)
                    break ;
 
               TranslateMessage (&msg) ;
               DispatchMessage (&msg) ;
          }
          else {
			    DrawRectangle (hwnd) ;
			    int i = 10000000;	 
				while ( i--) ;             
		  }
     }
- windows procedure
- definizione di drawrectangle:
void DrawRectangle (HWND hwnd)
{
     HBRUSH hBrush ;
     HDC    hdc ;
     RECT   rect ;
 
     if (cxClient == 0 || cyClient == 0)
          return ;
 
     SetRect (&rect, rand () % cxClient, rand () % cyClient,
                     rand () % cxClient, rand () % cyClient) ;
 
     hBrush = CreateSolidBrush (
                    RGB (rand () % 256, rand () % 256, rand () % 256))
;
     hdc = GetDC (hwnd) ;
     FillRect (hdc, &rect, hBrush) ;
     ReleaseDC (hwnd, hdc) ;
     DeleteObject (hBrush) ;
}     
se dichiaro la variable i subito prima del ciclo while non compila, se
invece la dichiaro in qualsiasi altro punto di winmain, purche' prima
della chiamata di drawrectangle, tutto funziona correttamente.	
Manfry

 dovrebbe.
No, solo se la metti subito dopo un '{' (o subito dopo un'altra
dichiarazione locale); se la metti dopo un qualsiasi statement,
ti si rompera` esattamente nello stesso modo (a meno che tu non
dica al compilatore di seguire invece le regole del _C++_, il
che si ottiene nel modo piu` semplice chiamando .cpp il sorgente
che gli passi:-).
Alex -- MVP C++ di Brainbench

 wrote:
grazie Alex, adesso ho capito.
Non sono abituato ad usare il C, infatti sto leggendo il Petzold per
prepararmi al Prosise :-)
Ora che ci faccio caso ho dato anche una indicazione errata sulla
estensione del file, ho scritto .cpp mentre evidentemente e' .c
ciao
Manfry
p.s.
se avessi guardato prima su 
programmare.it/win32
 avrei risparmiato
130.000 lire di Petzold

 }
Ti sei assicurato che l'estensione del file sorgente sia .CPP?
Altrimenti il VC++ te lo compilera` trattandolo come C anziche` C++, da
qui l'impossibilita` di definire variabili in mezzo a un blocco.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/