[Visual C++] Miejsce do zadeklarowania zmiennych globalnych

Jakie jest najlepsze miejsce do zadeklarowania zmiennych globalnych w projekcie Visual C++? Zmiennych potrzebuje użyć w 3 formach.

Dotychczas robiłem to tak jak zawsze, w zwykłym projekcie C++ (np. w Form1, a w pozostałych oknach jedynie poprzedzone przez extern wypisane zmienne).

Jednak gdy w grę weszły struktury, pomimo poprzedzenia jej externem kompilator wywala redefinicje.

Korzystam z Visual Studio 2008.

W jednym pliku nagłówkowym wsadzasz deklarację poprzedzoną słówkiem extern. To będzie znaczyło, że w każdym pliku źródłowym, w którym będziesz includował ten nagłówek, będziesz mógł normalnie używać tych zmiennych globalnych, ale dopiero linker poda informację, gdzie one się znajdują w pamięci. A żeby się gdzieś znalazły, to musisz zdefiniować (tzn. to samo co w nagłówku, tylko bez extern) te zmienne dokładnie w jednym pliku źródłowym (np. tym z funkcją main(), jeśli są to zmienne używane rzeczywiście w całym programie).

Przypuszczam, że wcześniej definiowałeś te zmienne w każdym pliku źródłowym. Definicja może nastąpić tylko jeden raz.

Pozdrawiam

I właśnie wtedy wszystko działa - oprócz struktury, która jest niby redefiniowana… :?

Pokaż minimalne przykładowe źródła, które nie Ci działają. Ja jasnowidzem nie jestem.

Najlepsze rozwiązanie to nie używanie zmiennych globalnych, które są be, fuj i tylko zaśmiecają kod.

Tu niestety są konieczne. :frowning:

Spodziewałem się, że jest jakiś uniwersalny sposób. Ale, udało mi się poradzić z tym samemu dziś w nocy :slight_smile:

Przed meinem mam wszystkie zmienne, a strukturę wymieniam tylko w stdafx.h, poprzedzoną externem.

Szczerze mówiąc wątpię, żeby były konieczne, ale jak tam uważasz.

Bo jest. Podałem go w pierwszej odpowiedzi. Jeżeli coś Ci nie działało, to znaczy, że robiłeś to inaczej, niż tam napisałem.

Jak przenieść dane z jednej formy do drugiej (w obu po kilka funkcji) bez zapisywania danych do pliku?

A ja podałem jaki błąd w takim wypadku mi wyskakuje.

Skoro dane należące do jednej klasy chcesz pokazać drugiej, wystarczy je przekazać przy wywołaniu funkcji (przez referencję najlepiej). A jeżeli dane te mają być współdzielone, to powinny należeć do jakiejś ogólniejszej klasy. Nie pisałem nigdy w Windows Forms (mają bardzo poważną wadę - działają tylko pod Windows), ale C++ to C++ i w tej kwestii to chyba nie ma tam różnic.

I miałem zgadywać, jaki błąd dokładnie popełniasz? Nadal tego nie wiem. Ja podałem ogólną zasadę, która zawsze działa, a jeśli nadal nie widziałeś błędu, to trzeba było pokazać (jak najmniejszy) kod, który się nie kompiluje.

A co z serią danych? Jak zwrócić serie danych? Wszystkie operacje koniecznie wykonywane w postaci jednej funkcji.

Ten temat już przemilczmy, bo jakoś poradziłem sobie sam.

Albo ja jestem tępy, albo Ty wyrażasz się niezrozumiale/nieprecyzyjnie. Nie mam pojęcia, czym jest seria danych w programowaniu - z takim terminem spotkałem się tylko przy wykresach.

Nie rozumiem, co dokładnie chcesz uzyskać i w jaki obecnie sposób to osiągasz.

Widocznie się nie dogadamy - nie wszyscy, którzy programują myślą jak programiści.

Z problemem sobie poradziłem -> można zamknąć.

Nigdy nie ma potrzeby korzystania ze zmiennych globalnych*. Dane między formatkami przekazuje się w argumentach metod albo w klasach pomocniczych i nie ma w tym zbyt wielkiej filozofii.

*a nawet jeśli by była, to w tak zaawansowanym przypadku, że nikt o to nie pytałby na tym forum.