Nie działa zmienna globalna

0

Na Form1 definiuję dwie zmienne globalne:

int a;
int b;

Na Form2 podłączam dwie zmienne globalne zainicjowane na Form1:

extern a;
extern b;

Na Form2 wprowadzam zależność:

a = a + b;

Gdy chcę odpalić program to mi wyrzuca błąd E2034 Cannot convert 'TButton *' to 'int'. Błąd ten odnosi się tylko do jednej zmiennej b, gdyż jak ją usuwam z równania na Form2 to program działa. Jak to możliwe, że dwie zmienne są tak samo zdefiniowane i tylko przy jednej z nich wywala błąd? Jak ten błąd naprawić?

2

Zmienne globalne to samo zło. To, że bulder używa ich do tworzenia okien, nie znaczy, że wszystko może być globalne.
Błąd wskazuje na typ TButton *, a ty piszesz o zmiennych typu int, więc podane przez ciebie informacje są niepełne lub nieprawdziwe.

0

Po pierwsze nie używaj zmiennych globalnych, po drugie podaj więcej kodu. Tak to mogę tylko wróżyć, że masz w formatce Form2 przycisk/wskaźnik typu TButton o nazwie b. Tak sugeruje komunikat.

0

Już rozwiązałem problem. Na Form2 umieściłem przycisk i nazwałem go b. Po kliknięciu tego przycisku miało wyliczyć mi równanie:

a = a + b;

Kompilator wyrzucał błąd bo nazwa przycisku była taka sama jak nazwa zmiennej.

0

@Gryfinder właśnie dlatego zmienne oraz komponenty warto nazywać sensownie. Pewnie narażę się tu wielu użytkownikom. Jednak notacja węgierska dla komponentów wyklikanych w BCB jest jedynym miejscem gdzie jej używam. Jednak i tak nie nazywam przycisku btnA, btnB. Dodatkowo zmienne globalne to zło wcielone i nie warto ich używać.

0

Czemu zmienne globalne to zło? Ja tylko taki sposób programowania na zmiennych znam. Podaj jakiś prosty kod w którym użyjesz innej metody by dwie Formy ze sobą współpracowały i przekazywały dane.

0

Zmienne globalne sprzęgają między sobą dużo kodu, w niewidoczny sposób, prowadząc do nieprzewidzianych i trudnych do wykrycia błędów.

0

Właśnie dlatego, że zmienne globalne są globalne. Oznacza to, że mogą być zmieniane z dowolnego miejsca w programie i nikt nie ma nad tym kontroli. Wprowadzają wiele niejawnych zależności. Jeśli jakaś funkcja używa zmiennej globalnej to ciężko to czasami dostrzec. Co więcej jeśli funkcja opiera się na zmiennej globalnej, to na jej działanie może mieć wpływ kod który znajduje się w 20 innych modułach, co może prowadzić do błędów. Dalej zaśmiecają globalną przestrzeń nazw, kolidują ze zmiennymi lokalnymi o tej samej nazwie (co wynikło u Ciebie).

Co do przykładu można by po prostu zmienne a oraz b uczynić składowymi public klasy Form1. Wtedy używałbyś tego w ten sposób:

Form1->a = Form1->a + Form1->b;

Nie wiem dokładnie co Twoj kod robi, ale równie dobrze można zmienne a oraz b przekazać przez referencję/wskaźnik i też osiągniesz podobny efekt.

1
Gryfinder napisał(a):

Czemu zmienne globalne to zło? Ja tylko taki sposób programowania na zmiennych znam. Podaj jakiś prosty kod w którym użyjesz innej metody by dwie Formy ze sobą współpracowały i przekazywały dane.

Skoro dwie formy lub więcej potrzebuje dostępu do tych samych danych to warto wydzielić te dane do osobnej klasy i niech ona informuje wszystkich zainteresowanych o tym, że ktoś zaktualizował dane i powinni oni jakoś na to zareagować.

0
Mr.YaHooo napisał(a):

Nie wiem dokładnie co Twoj kod robi, ale równie dobrze można zmienne a oraz b przekazać przez referencję/wskaźnik i też osiągniesz podobny efekt.

Wszyscy tu uczestniczymy w ciuciubabce w jakimś extra tajnym projekcie, pewnie dla CIA albo NASA

Sugerowałbym zmienne zazwać odpowiednio do tego, jakie znaczenie niosą, np Kilowatogodziny, iloscJablek, iloscGruszek

1 użytkowników online, w tym zalogowanych: 0, gości: 1