CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Symbol dziesiętny

Symbol dziesiętny

dział ogólny

Re: Symbol dziesiętny

Nowy postprzez Cyfrowy Baron » sobota, 9 lutego 2013, 12:20

Cyfrowy Baron napisał(a):że nie widzę większej różnicy między umieszczaniem SParametry Param; w pliku źródłowym skoro równie dobrze mogę to umieścić w pliku nagłówkowym i też mi działa:


No cóż... przyznaję się do błędu. To co prawda działa, tylko, że każdy formularz ma inne - własne - struktury, czyli jeśli np. na Form1 przypisze do zmiennej Param.Sep[0] = '.', a na Form2 (mimo, że nie definuję tam tej zmiennej) Param.Sep[0] = 'A', to na każdym formularzu struktura zawiera co innego, a tymczasem - skoro to struktura globalna - powinny zawierać to samo.
Dopiero umieszczenie definicji w pliku źródłowym sprawia, że na obydwu formularza struktura zawiera to samo.

Chyba czegoś tu nie rozumiem, skoro definicja jest jedna: SParametry Param; - to dlaczego jej lokalizacja ma takie znaczenie, dlaczego Form2 zdaje się korzystać z innej struktury, skoro nie ma własnej deklaracji, w sytuacji gdy ta definicja znajduje się w pliku nagłówkowym dla Form1?
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
    Windows XPFirefox

Re: Symbol dziesiętny

Nowy postprzez polymorphism » sobota, 9 lutego 2013, 13:03

skoro definicja jest jedna: SParametry Param; - to dlaczego jej lokalizacja ma takie znaczenie

Jak dasz definicję w nagłówku, to definicja tej zmiennej będzie w każdej jednostce kompilacji, która ma załączony nagłówek (ergo: każda jednostka będzie miała swoją wersję zmiennej). A jak dasz definicję tylko w jednym pliku CPP, to siłą rzeczy definicja będzie tylko jedna, pozostałe jednostki kompilacji, dzięki deklaracji z extern, będą miały informacje, że zmienna zdefiniowana jest w innej jednostce, i że to do niej powinien odwoływać się kod. Dlatego mówi się, że nielokalne zmienne mają zewnętrzne wiązanie (external linkage), dzięki czemu masz do nich dostęp z każdego miejsca w programie.
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
    Windows XPFirefox

Re: Symbol dziesiętny

Nowy postprzez oneiro » sobota, 9 lutego 2013, 13:23

Znalazłem błąd (pytanie, dlaczego kompilator pozwolił na takie coś). Dalszy wycinek mojego nagłówka:
KOD cpp:     UKRYJ  
//naglowek
struct SParametry
{
char Sep[2];
bool tab_opt_enable[9];
char Sep[2];
};
SParametry Param;
extern SParametry Param;
 


I tak jest w kodzie za tab_opt_enable[9] jest od razu Sep[2] i wygląda na to, że "przekręciłem licznik" tablicy, bo numeracja jest jest chyba od "0" do "8", a ja podpinam się pod element "9" - kod ponżej
KOD cpp:     UKRYJ  
   char a7=Param.Sep[0];  //wynika a7='.'
   char b7=Param.Sep[1];  //wynik b7=','

   Param.tab_opt_enable[1]=Ini->ReadBool("PARAMETERS","Check_Opt_x0",0);
   Param.tab_opt_enable[2]=Ini->ReadBool("PARAMETERS","Check_Opt_x1",0);
   Param.tab_opt_enable[3]=Ini->ReadBool("PARAMETERS","Check_Opt_x2",0);
   Param.tab_opt_enable[4]=Ini->ReadBool("PARAMETERS","Check_Opt_x3",0);
   Param.tab_opt_enable[5]=Ini->ReadBool("PARAMETERS","Check_Opt_x4",0);
   Param.tab_opt_enable[6]=Ini->ReadBool("PARAMETERS","Check_Opt_m",0);
   Param.tab_opt_enable[7]=Ini->ReadBool("PARAMETERS","Check_Opt_t",0);
   Param.tab_opt_enable[8]=Ini->ReadBool("PARAMETERS","Check_Opt_A",0);
   Param.tab_opt_enable[9]=Ini->ReadBool("PARAMETERS","Check_Opt_H",0);   //TO POWODUJE BŁĘDY

   char a8=Param.Sep[0];  //tutaj pod a8 pojawia się '/x01' zamiast '.'
   char b8=Param.Sep[1]; //b8=','
 



Pytanie, dlaczego kompilator pozwoził mi na taką głupotę? Może jest jakiś parametr odpowiedzialny za to?

PS. Na początku definicję
KOD cpp:     UKRYJ  
SParametry Param;
 

miałem w poliku cpp formularza Form1 (zaraz po incudach), przeniosłem do nagłówka i też działa. Ale z Waszej rozmowy nic nie wynika, pogubiłem się - jak powinno być?
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: Symbol dziesiętny

Nowy postprzez Mironas » sobota, 9 lutego 2013, 13:34

oneiro napisał(a):numeracja jest jest chyba od "0" do "8"

Nie chyba ale na pewno.

oneiro napisał(a):dlaczego kompilator pozwoził mi na taką głupotę?

To nie jest błąd składniowy więc w trakcie kompilacji nie nie wykryje Ci tego. Dopiero kiedy podczas wykonywania programu odwołasz się do nieistniejącego elementu wywali błąd.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Symbol dziesiętny

Nowy postprzez Cyfrowy Baron » sobota, 9 lutego 2013, 13:45

oneiro napisał(a):PS. Na początku definicję

KOD cpp:     UKRYJ  
SParametry Param;


miałem w poliku cpp formularza Form1 (zaraz po incudach), przeniosłem do nagłówka i też działa. Ale z Waszej rozmowy nic nie wynika, pogubiłem się - jak powinno być?


Dobrze miałeś! Jak widzę nie czytałeś mojej dyskusji z polymorphism. Teraz masz źle.
Co do reszty Mironas już ci to wyjaśnił.



Trochę się pogubiłem pomiędzy zmiennymi globalnymi, a publicznymi. Mógłbym zgadywać dlaczego... pewnie dlatego, że nie zdarza mi się używać zmiennych globalnych w plikach formularza.
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
    Windows XPFirefox

Poprzednia strona

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 4 gości