Jak ze zmiennej lokalnej zrobić zmienną globalna?
?????????? hmmmm o ile wiem to się nie da :) najlepiej utwórz zmienną globalną i do niej przypisz wartość zmiennej lokalnej.
Zaznaczasz, wycinasz, wklejasz poza wszystkimi funkcjami, czyli w zasiegu globalnym i już :P. Nie można inaczej "przenieść" zmiennej ;)
Ale jak mam tak:
int stan;
funkcja()
{
stan=1;
}
funkcja2()
{
if(stan==1)//i tu nie działa
{
//rób coś tam
}
}
#include <iostream>
using namespace std;
int zm;
void fun(){zm=1;}
void fun2(){if(zm==1)cout<<"tekst"<<endl;}
int main()
{
fun();
fun2();
system("pause");
}
Cos takiego u mnie poszło na DevCpp
#include <iostream>
using namespace std;
int zm;
void fun(){zm=1;}
void fun2(){if(zm==1)cout<<"tekst"<<endl;}
int main()
{
fun();
fun2();
system("pause");
}
Cos takiego u mnie poszło na DevCpp
hmmm...a jak to przerobić pod CASE?
Ja chce tak pod WinAPI:
int stan;
//wchodzimy w funkcje komunikatów
case WM_COMMAND:
ID2=LOWORD(wParam);
kom=HIWORD(wParam);
if(IsDlgButtonChecked(hWnd,200)==1)
{
stan=1; //nadaje wartość zmiennej
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
memDC = CreateCompatibleDC(hdc);
if(stan==0)//i tu nie działa
{
SelectObject(memDC, hBit1);
}
if(stan==1)//i tu nie działa
{
SelectObject(memDC, hBit2);
}
BitBlt(hdc, 155, 60, 20, 20, memDC, 0,0,SRCCOPY);
EndPaint(hWnd,&ps);
DeleteDC(memDC);
break;
Nie wiem czy dobrze opisałem ale jak by co to pytaj. Jest mi to bardzo potrzebne z góry dzięki.
Cóż, chyba widzę problem: czy zmienna jest zdeklarowana wewnątrz procedury okna? Przy każdym wywołaniu przez system procedury okna zmienne w niej zdefiniowane przyjmują wartość nieokreśloną /przypadkową/. Spowodowane jest to tym, że pamięć dla tych zmiennych jest alokowana na stosie. Proponuję tego typu dane przechowywać w WndExtra /pamięć dodatkowa okna, którą definiuje się podczas wypełniania struktury WNDCLASS(EX)/. Odczyt czy zapis przy pomocy SetWindowLong/GetWindowLong.
Czyli jak to będzie wyglądać możesz pokazać na kodzie w tedy najlepiej się naucze... ;)
Przy wywołaniu RegisterClassEx (RegisterClass) w strukturze WNDCLASSEX (WNDCLASS) musisz w polu cbWndExtra wpisac 4 (sizeof(void*)) a odczytujesz i zapisujesz do tego pola wskaznik za pomocą GetWindowLong/SetWindowLong (drugi parametr to DLGWINDOWEXTRA.)
Po co sobie tak zycie komplikowac? Napisz przed zmienna "static" i po problemie. :)
Przy wywołaniu RegisterClassEx (RegisterClass) w strukturze WNDCLASSEX (WNDCLASS) musisz w polu cbWndExtra wpisac 4 (sizeof(void*)) a odczytujesz i zapisujesz do tego pola wskaznik za pomocą GetWindowLong/SetWindowLong (drugi parametr to DLGWINDOWEXTRA.)
Możesz pokazać to na kodzie :) ? I jeszcze pytanie czy zadziała to na VC++6.0, bo to co podałeś nie działa mi, albo coś źle robie :-/
Po co kod, przeciez wszystko jest dokladnie napisane, jak to trzeba zrobic.
Mozesz tez kazde okienko umiescic w jakies klasie dziedziczacej np z CWindow, ktorej definiujesz obluge komunikatow w statycznej funkcji. Ja wlasnie tak robie i jest to IMO dobre rozwiazanie. Jedyne co wtedy robisz to przy CreateWindow (CreateDialogParam/DialogBoxParam) podajesz w lpParam wskaznik this. A nastepnie odczytujesz go w komunikacie WM_CREATE (WM_INITDIALOG) w strukturze CREATESTRUCT i przesylasz do lokalnej zmiennej statycznej. Jest to bardzo pomocne, gdy prowadzisz projekt, gdzie jest wiele okienek.