Zmienna

dział ogólny

Zmienna

Nowy postprzez Pitek » sobota, 14 listopada 2009, 18:20

Witam !
Mam zadeklarowaną zmienną globalną w Unit1.cpp i chcę żeby Unit2.cpp widział ją i rozpoznawał jej wartość mam dane #include "Unit1.cpp" w Unit2.cpp.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Zmienna

Nowy postprzez Cyfrowy Baron » sobota, 14 listopada 2009, 18:59

Jeżeli chcesz, żeby Unit2 "widział" zmienną z Unit1 to musisz ja zadeklarować w pliku nagłówkowym Unit1.h w sekcji public, przykład:

Unit1.h:
Kod: Zaznacz cały
public:
        int Value;


Zakładając, że formularz dla Unit1 nosi nazwę Form1, do takiej zmiennej odwołujesz się w Unit2 w sposób następujący:

Unit2.cpp:
Kod: Zaznacz cały
#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
int x = Form1->Value;
}
//---------------------------------------------------------------


Sugeruję byś zapoznał się z artykułem: ► patrz serwis: Cyfrowy Baron dział: teoria -> Przekazywanie obiektów i funkcji pomiędzy formularzami.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zmienna

Nowy postprzez polymorphism » sobota, 14 listopada 2009, 20:52

Jeżeli chcesz, żeby Unit2 "widział" zmienną z Unit1 to musisz ja zadeklarować w pliku nagłówkowym Unit1.h w sekcji public,

Jemu chodzi o zmienne globalne.

mam dane #include "Unit1.cpp" w Unit2.cpp.

Błąd. W ten sposób załączasz tylko pliki nagłówkowe (.h/.hpp/itp). Pliki .cpp dołączasz do projektu odpowiednią funkcją środowiska, add to project bodajże.

Co do istoty problemu, jeśli w pliku Unit2.cpp masz zmienną globalną zdefiniowaną np. tak:
Kod: Zaznacz cały
int g_variable;

w pliku Unit2.h1) daj deklarację tej zmiennej:
Kod: Zaznacz cały
extern int g_variable;

extern informuje kompilator, że zmienna została zdefiniowana w innym module.

Oczywiście plik z tą deklaracją dołączasz wszędzie tam, gdzie chcesz użyć tej zmiennej - to oczywiste.
____
1) jeśli zmienna ma być widoczna tylko w pliku Unit1.cpp, deklarację extern możesz przenieść do tego pliku. Wtedy dodatkowy plik nagłówkowy nie będzie potrzebny.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zmienna

Nowy postprzez Cyfrowy Baron » niedziela, 15 listopada 2009, 08:27

Tak też mozna, tylko po co sobie tak komplikować życie.
Zakładam, że on ma jakąś tam zmienną w jednostce Unit1 z której w tej jednostce korzysta i chce z niej skorzystać również w Unit2, by czymś sterować w ten sposób na Unit1. W takim wypadku wystarczy zmienna publiczna.

W przypadku o którym ty piszesz najlepiej jest stworzyć odrębny moduł w którym będą zbierane zmienne, funkcje, metody itp. i w miarę potrzeb wykorzystywane w jednostkach, które je potrzebują.

Przykład tworzenia modułów opisałem: ► patrz serwis: Cyfrowy Baron dział: teoria -> tworzenie modulów.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zmienna

Nowy postprzez polymorphism » niedziela, 15 listopada 2009, 10:30

Tak też mozna, tylko po co sobie tak komplikować życie.

Dodanie extern przy deklaracji zmiennej to żadna komplikacja.

Zakładam, że on ma jakąś tam zmienną w jednostce [...] W takim wypadku wystarczy zmienna publiczna.

Być może, ale pytał o zmienną globalną, więc napisałem mu, jak się ją poprawnie deklaruje.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zmienna

Nowy postprzez Cyfrowy Baron » niedziela, 15 listopada 2009, 11:57

Dodanie extern przy deklaracji zmiennej to żadna komplikacja.


To prawda, niewiele wiadomo o całym projekcie, gdyż pytanie dotyczy tylko jednej zmiennej. Gdyby było wiadomo więcej, można by udzielić precyzyjnej odpowiedzi. Co do extern i deklaracji zmiennej, to równie dobrze można posłużyć się plikiem nagłówkowym Unit1.h i zadeklarować zmienną z poleceniem extern poza klasą formularza, w ten sposób można obejść się bez dodatkowych plików. Pisząc o komplikacji chodziło mi o to, że dla jednej zmiennej lepiej jest się posłużyć zmienną publiczną, bo czemu ma służyć deklarowanie jednej zmiennej o tej samej nazwie dla dwóch modułów. Ma to jakiś sens w sytuacji, gdy obydwa modułu ściśle ze sobą współpracują i wymagają jednego obiektu do sterowania czymś tam i robią to jakoś naprzemiennie. W sytuacji gdy zmienna steruje czymś, przechowuje jakąś wartość w module Unit1, a moduł Unit2 tylko coś zmienia w tej zmiennej, to chyba lepiej jest się posłużyć zmienną publiczną, kod będzie przejrzystszy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zmienna

Nowy postprzez polymorphism » niedziela, 15 listopada 2009, 12:49

Co do extern i deklaracji zmiennej, to równie dobrze można posłużyć się plikiem nagłówkowym Unit1.h i zadeklarować zmienną z poleceniem extern poza klasą formularza, w ten sposób można obejść się bez dodatkowych plików.

No tak, napisałem to w odnośniku.

W sytuacji gdy zmienna steruje czymś, przechowuje jakąś wartość w module Unit1, a moduł Unit2 tylko coś zmienia w tej zmiennej, to chyba lepiej jest się posłużyć zmienną publiczną, kod będzie przejrzystszy.

Gorzej jeśli będziesz chciał taką zmienną użyć w innym module, sprawa się znacznie skomplikuje, a kod będzie mniej przejrzysty. Dodatkowo publiczny składnik klasy, o ile nie jest statyczny, może występować w kilku instancjach, tak jak jego właścicielka - klasa (pomijam singletony). Tego nie możesz powiedzieć o zmiennych globalnych.




p.s. żeby nie było, nie jestem gorącym zwolennikiem zmiennych globalnych. Można je zastąpić bardziej eleganckimi, nierzadko obiektowymi sposobami.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zmienna

Nowy postprzez Cyfrowy Baron » niedziela, 15 listopada 2009, 15:01

Co do zmiennych globalnych to rzadko je stosuję, tylko w sytuacjach, gdy tworzę moduł zawierający zbiór metod, obiektów, zmiennych i funkcji wykorzystywanych w całym programie.
Co do występowania obiektu jako składnika publicznego w różnych klasach, to nie powinien wywoływać problemów, gdyż zawsze musi być adresowany jako element konkretnej klasy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zmienna

Nowy postprzez polymorphism » niedziela, 15 listopada 2009, 15:34

Cyfrowy Baron napisał(a):Co do występowania obiektu jako składnika publicznego w różnych klasach, to nie powinien wywoływać problemów, gdyż zawsze musi być adresowany jako element konkretnej klasy.

Ale ja nie pisałem o różnych klasach, tylko o kilku instancjach (obiektach) tej samej klasy.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zmienna

Nowy postprzez Pitek » niedziela, 22 listopada 2009, 20:02

Czy moge zribić to samo ze zmienną bool jężeli tak to jak bo nie wiem ?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Zmienna

Nowy postprzez Cyfrowy Baron » poniedziałek, 23 listopada 2009, 10:12

Jak to nie wiesz? Nie ma znaczenia jakiego typu jest zmienna, robisz dokładnie to samo. Sprecyzuj jednak, czy chcesz tworzyć zmienna globalną, czy publiczną.

Jeżeli jeszcze nie wiesz jak posługiwać się extern to przeczytaj w serwisie Cyfrowy Baron artykuł: teoria -> Tworzenie modułów.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zmienna

Nowy postprzez Pitek » poniedziałek, 23 listopada 2009, 16:48

Dobra mój błąd przepraszam już jest ok !
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości