<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=58&amp;t=19291&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-12-19T11:07:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=19291&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-12-19T11:07:32+01:00</updated>
<published>2017-12-19T11:07:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200798#p200798</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200798#p200798"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200798#p200798"><![CDATA[
<div class="quotetitle">Robert_1967 napisał(a):</div><div class="quotecontent"><br />Ponieważ moje zapytanie związane jest z tym tematem, to nie zakładam nowego.<br /></div><br />Szanowny kolega jest już długo z nami na forum, żeby wiedzieć, że jak się ma jakiś problem to się zakłada nowy wątek .... bo inaczej forum byłoby JEDNYM MEGA WĄTKIEM jakby się tak każdy &quot;dopisywał&quot; - no bez sensu kompletnie.<br /><br />Dlatego kolega otrzymuje w nagrodę WARNA ...<br /><br />a ten wątek zamykam .... jednocześnie proszę o nie dopisywanie się do innych wątków tylko zakładanie własnego jak się ma kolejne pytanie ok?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 19 gru 2017, o 11:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[riddik]]></name></author>
<updated>2017-12-19T10:16:59+01:00</updated>
<published>2017-12-19T10:16:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200796#p200796</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200796#p200796"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200796#p200796"><![CDATA[
Nazwy portów i pinów są ze sobą związane. Dlatego zapis[syntax=c]PORTC &amp;= ~(DCBA_1 | DCBA_2 | DCBA_3 | DCBA_4);[/syntax]  jest mało czytelny bo odwołuje się do portu za pomocą bitów których znaczenia trzeba szukać w innym miejscu w kodzie. Jeżeli używasz abstrakcji DCBA_4 to również powinieneś  użyć abstrakcyjnego odwołania do portu. Dla mnie poniższy kod byłby czytelniejszy (pomijając fakt, że nie wiadomo co to jest dcba_7()):<br />[syntax=c]main.c<br /> <br />#include &lt;util/delay.h&gt;<br />#include &quot;dcba.h&quot;<br /> <br /> <br />int main(void)<br />{<br />        dcba_init();         <br />        _delay_ms(100);<br />                 while(1)<br />                {<br />                        dcba_7();<br />                }<br />}<br /> <br />//-----------------------------------------------------<br /> <br /> <br /> dcba.c<br /> <br />#include &lt;avr/io.h&gt;<br /> <br />void dcba_init(void)<br />{<br />        DDRC |= (1&lt;&lt;PC5) | (1&lt;&lt;PC3) | (1&lt;&lt;PC1) | (1&lt;&lt;PC0);                     <br />        PORTC &amp;= ~((1&lt;&lt;PC5) | (1&lt;&lt;PC3) | (1&lt;&lt;PC1) | (1&lt;&lt;PC0));         <br />} <br /> <br />void dcba_1(void)<br />{<br />        PORTC &amp;= ~((1&lt;&lt;PC5) | (1&lt;&lt;PC3) | (1&lt;&lt;PC1) | (1&lt;&lt;PC0));<br />}<br /> <br />void dcba_2(void)<br />{<br />        PORTC |= (1&lt;&lt;PC0);<br />        PORTC &amp;= ~((1&lt;&lt;PC5) | (1&lt;&lt;PC3) | (1&lt;&lt;PC1));<br />}<br /> <br />void dcba_3(void)<br />{<br />        PORTC |= (1&lt;&lt;PC1);<br />        PORTC &amp;= ~((1&lt;&lt;PC5) | (1&lt;&lt;PC3) | (1&lt;&lt;PC0));<br />}<br /> <br />void dcba_4(void)<br />{<br />        PORTC |= (1&lt;&lt;PC1) | (1&lt;&lt;PC0);<br />        PORTC &amp;= ~((1&lt;&lt;PC5) | (1&lt;&lt;PC3));<br />}<br /> <br />//----------------------------------------------------------<br /> <br /> <br /> dcba.h<br /> <br /> <br />#ifndef DCBA_H_<br />#define DCBA_H_<br /> <br />void dcba_1(void);      // 0000<br />void dcba_2(void);      // 0001<br />void dcba_3(void);      // 0010<br />void dcba_4(void);      // 0011<br />  <br />#endif /* DCBA_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16099">riddik</a> — 19 gru 2017, o 10:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Robert_1967]]></name></author>
<updated>2017-12-19T09:37:57+01:00</updated>
<published>2017-12-19T09:37:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200794#p200794</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200794#p200794"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200794#p200794"><![CDATA[
Dzięki riddik za odpowiedź na mojego posta.<br /><br />W takim razie, czy mógłbyś poprawić moje wcześniejsze pliki tak, jak Ty to widzisz ?. Oczywiście są to, Twoje osobiste opinie i <br />potraktuje to, jako przykład jeden z wielu, ale czy może ktoś jeszcze podzieli się swoimi uwagami ? <br /><br />Nie na temat  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> Zdrowych i Wesołych Świąt riddik i Do Siego Roku Wszystkim... <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10257">Robert_1967</a> — 19 gru 2017, o 09:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[riddik]]></name></author>
<updated>2017-12-19T09:26:37+01:00</updated>
<published>2017-12-19T09:26:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200793#p200793</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200793#p200793"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200793#p200793"><![CDATA[
Wg mnie includowanie pośrednie nie jest zbyt dobrą praktyką. Ja jeżeli używam jakiejś deklaracji z pliku .h w pliku .c to w tym konkretnym pliku .c robię includa na tą deklarację. Liczenie że zaciągną się includy gdzieś w łańcuszku kolejnych wywołań może być złudne. Nie wiem czy jest to dobra praktyka, wzorzec czy antywzorzec, ale dla mnie przynajmniej każdorazowe includowanie potrzebnych rzeczy w danym pliku .c jest czytelniejsze. #ifndef w .h załatwia sprawę unikania powtórnych includów tego samego. Ponadto jeżeli jest jakiś includ wołany w innym includzie to znaczy że ten pierwszy jest potrzebny tylko w tym drugim includzie a nie w plikach .c. Jeżeli z jakiegoś powodu chciałbym użyć deklaracji z pierwszego .h to zainkludowałbym go bezpośrednio do .c  Oczywiście wszystko powyższe jest wyłącznie moją prywatną opinią i moją prywatną praktyką.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16099">riddik</a> — 19 gru 2017, o 09:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Robert_1967]]></name></author>
<updated>2017-12-19T08:36:10+01:00</updated>
<published>2017-12-19T08:36:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200792#p200792</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200792#p200792"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=200792#p200792"><![CDATA[
Witam<br />Ponieważ moje zapytanie związane jest z tym tematem, to nie zakładam nowego. W tej kwestii wiele napisano i również wiele<br />czytałem, ale jak w różnych przypadkach, tak i tutaj pozostaje pewien niedosyt i wątpliwości. Obecnie ćwiczę sobie ustawianie<br />stanów na porcie C. Podzieliłem sobie projekt na pliki źródłowe i wygląda to następująco:<br /><br />[syntax=c]main.c<br /><br />#include &lt;util/delay.h&gt;<br />#include &quot;dcba.h&quot;<br /><br /><br />int main(void)<br />{<br />DDRC |= DCBA_1 | DCBA_2 | DCBA_3 | DCBA_4;<br />PORTC &amp;= ~(DCBA_1 | DCBA_2 | DCBA_3 | DCBA_4);<br />_delay_ms(100);<br /><br /><br /><br />while(1)<br />{<br />dcba_7();<br />}<br />}<br /><br />//-----------------------------------------------------<br /><br /><br /> dcba.c<br /><br />#include &quot;dcba.h&quot;<br /><br /><br />void dcba_1(void)<br />{<br />PORTC &amp;= ~(DCBA_1 | DCBA_2 | DCBA_3 | DCBA_4);<br />}<br /><br />void dcba_2(void)<br />{<br />PORTC |= DCBA_4;<br />PORTC &amp;= ~(DCBA_1 | DCBA_2 | DCBA_3);<br />}<br /><br />void dcba_3(void)<br />{<br />PORTC |= DCBA_3;<br />PORTC &amp;= ~(DCBA_1 | DCBA_2 | DCBA_4);<br />}<br /><br />void dcba_4(void)<br />{<br />PORTC |= DCBA_3 | DCBA_4;<br />PORTC &amp;= ~(DCBA_1 | DCBA_2);<br />}<br /><br />//----------------------------------------------------------<br /><br /><br /> dcba.h<br /><br /><br />#ifndef DCBA_H_<br />#define DCBA_H_<br /><br />#include &lt;avr/io.h&gt;<br /><br />#define DCBA_1 (1&lt;&lt;PC5)<br />#define DCBA_2 (1&lt;&lt;PC3)<br />#define DCBA_3 (1&lt;&lt;PC1)<br />#define DCBA_4 (1&lt;&lt;PC0)<br /><br /><br />void dcba_1(void);// 0000<br />void dcba_2(void);// 0001<br />void dcba_3(void);// 0010<br />void dcba_4(void);// 0011<br /><br /><br /><br />#endif /* DCBA_H_ */[/syntax]<br /><br /><br />Program kompiluje się prawidłowo i działa dobrze, ale proszę o wyjaśnienie, czy aby na pewno dobrze napisany. Czytałem, że np.<br />biblioteka #include &lt;avr/io.h&gt; musi być wszędzie dołączana, ponieważ jest to podstawowa biblioteka C. Ja w main.c mam tylko<br />#include &lt;util/delay.h&gt;, ponieważ używam po konfiguracji portu. Nie dołączałem biblioteki #include &lt;avr/io.h&gt; ani w main.c<br />ani w dcba.c. Dopiero jest ona dołączona w dcba.h. Oczywiście dcba.h jest zainkludowana do dcba.c i main.c. Czy tak powinno być,<br />jak ja napisalem ?. Pytanie to jest w szerszym znaczeniu, ponieważ tyczy się innych plików w podobnych sytuacjach.<br />Wiem, że zapytanie śmieszne i na bardzo początkującym poziomie, ale bez zrozumienia tego potem same problemy. Oczywiście<br />inkludowałem przykładową bibliotekę we wszystkich plikach projektu tak dla sprawdzenia, ale niczego to nie wnosi. program i tak<br />się kompiluje bez problemu, tylko gdzie lezy prawda ?. Jak powinno być.<br />Proszę o jakieś szersze Wytłumaczenie zasad, jeśli ktoś znajdzie chwilę i chęci. Wiem, że w BB jest i czytałem, ale każdy chwyta<br />inaczej... Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10257">Robert_1967</a> — 19 gru 2017, o 08:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-10-05T10:49:43+01:00</updated>
<published>2017-10-05T10:49:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196464#p196464</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196464#p196464"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196464#p196464"><![CDATA[
<div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent">Jeszcze muszę zapytać o &quot;nieużywanie zmiennych globalnych&quot;. Sam często spotykam się z taką tezą, ale szczególnie precyzyjnego wyjaśnienia to nie znalazłem.<br /></div><br /><br />Nie ma dużo do wyjaśniania - tak konstruujesz kod by nie było zmiennych globalnych: wszelkie zmienne zamykasz albo w funkcji z dostępem przez argumenty funkcji i zwracaną wartość albo co najwyżej w ramach modułu (jednostki kompilacji) a dostęp do takich zmiennych robisz przez tzw. settery i gettery. <br />Przy AVRowych ISR definiujesz zmienne w ramach modułu czyli jako &quot;static volatile&quot;. Obejrzyj sobie bibliotekę do UART Petera Fleury, tam jest to bardzo ładnie zrobione.<br /></div><br /><br />Niestety nie odpowiedziałeś na moje pytanie. Pytałem dlaczego, a nie jak to zrobić.<br />No bo oszczędzę pamięć? Czy łatwiej zdebuguję, czy może jeszcze co?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 5 paź 2017, o 10:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[APAP75]]></name></author>
<updated>2017-10-05T10:17:48+01:00</updated>
<published>2017-10-05T10:17:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196462#p196462</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196462#p196462"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196462#p196462"><![CDATA[
Skoro tak rozkładamy te zmienne na czynniki pierwsze, to mam pytanie.<br /><br />Dlaczego, jeśli zdefiniujemy zmienną globalną np. w projekcie jedno-plikowym  typu uint8_t to &quot;Data: 1 bytes&quot; natomiast jeśli tą sama zmienną przy definicji inicjujemy jakąś wartością, to po kompilacji mamy: &quot;Data: 2 bytes&quot; ??? W przypadku zmiennych zajmujących więcej niż jeden bajt już tak nie jest (czy inicjujemy ją czy nie, po kompilacji rozmiar  .data odpowiada jej faktycznemu rozmiarowi).<br /><br />Kolejna sprawa - mechanizm &quot;tentative definition&quot; (tutaj dowiedziałem się, że w ogóle coś takiego jest - nie wiem też czy go dobrze zrozumiałem)- zauważyłem, że gdy w różnych plikach zdefiniujemy trzy takie same zmienne, ale różniące się typem (8, 16 i 32 bity) i ich nie inicjujemy żadną wartością, to kompilator przy .data pokazuje nam wielkość największej z nich (coś ala unia), gdy inicjujemy jedną (Tylko jedną) z nich, to po kompilacji .data pokazuje wielkość tej, którą inicjowaliśmy i wywala wora (nie wywala go, gdy inicjujemy zmienną 16 bitową - jakaś może promocja do int ??? ). Co ciekawe, przy braku inicjacji takich zmiennych, gdy w funkcji nadamy im wartość i  przekroczymy zakres (np. w pliku mamy zmienną 8 bitów, wpiszemy 300, lub w innym pliku mamy 16 bitów i wpiszemy 300000) to dostajemy o tym wora. Wygląda to tak, że kompilator rezerwuje miejsce dla największej z nich, a i tak pilnuje ich wielkości w danym pliku.<br />I jeszcze jeden ciekawy eksperyment - ta sama nazwa zmiennej o różnym rozmiarze w trzech różnych plikach. Inicjujemy tylko tę 16 bitową - brak worningów. W pliku, gdzie zmienna jest 32 bitowa piszemy funkcję, która przypisuje jej wartość 1000000 - poza zakresem zmiennej 16 bitowej. Po kompilacji:  &quot;.data 2&quot;. Możemy tą funkcję wywołać w main. Zero worningów. Ciekawe, gdzie on zmieści ten 1000000;<br />Chyba dziś to po testuję na LCD....<br /><br />I ostatnie pytanie - jeśli w jakimś pliku użyjemy jakiejś nazwy zmiennej (i ją zainicjujemy), to nie możemy jej już użyć nigdzie indziej, mimo, że bez extern nie mamy do niej dostępu. Jak sobie z tym radzą programiści - np. jeden pisze bibliotekę i użyje np. zmiennej licznik, drugi w swojej bibliotece także użyje tej samej nazwy. Trzeci programista połączy te dwie biblioteki i bach - error. Co wówczas? prze-edytować jedną z bibliotek i zmienić nazwy? W definicji jednej ze zmiennych dodać static? Dobrze jak to jest małe, ale jak np. piszą gry (wiem, wiem nie piszą w C, choć nie wiem czy np. w C++ nie jest podobnie) lub inne duże programy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6195">APAP75</a> — 5 paź 2017, o 10:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-10-05T09:54:38+01:00</updated>
<published>2017-10-05T09:54:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196459#p196459</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196459#p196459"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196459#p196459"><![CDATA[
<div class="quotetitle">kisiel napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent">&quot;Pamiętaj, aby w pliku nagłówkowym nigdy nie umieszczać definicji, powinny tam znajdować się wyłącznie deklaracje.<br />Nielicznymi wyjątkami są definicje zmiennych typu const oraz krótkich funkcji&quot;<br /></div><br /><br />W przytoczonym fragmencie jest napisane że nie powinno się ale skoro są wyjątki, standard to dopuszcza, dopiero DOBRA PRAKTYKA programowania tego zabrania. Ot różnica o którą mi cały czas chodzi.</div><br /><br />W przytoczonym fragmencie napisane jest &quot;nigdy&quot; i to się tyczy zmiennych,<strong> o których rozprawialiśmy w całym tym wątku.</strong><br />Co prawda za chwilę jest &quot;powinno&quot;, więc dość ciężko się zdecydować, być może dlatego później takie dysputy jak nasza ... <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Nikt z uczestników dyskusji nawet nie wspomniał o przypadku <strong>const</strong>, prawdopodobnie po prostu nikt tego nie wiedział, na pewno ja nie wiedziałem.<br />Należało użyć tego argumentu i tyle.<br /><br />Jeszcze muszę zapytać o &quot;nieużywanie zmiennych globalnych&quot;. Sam często spotykam się z taką tezą, ale szczególnie precyzyjnego wyjaśnienia to nie znalazłem.<br />Wg mnie, dla procesorów AVR, jest to niemożliwe, jeśli korzystamy np z przerwań, gdzie musimy korzystać ze zmiennych globalnych. <br />No chyba, że można samemu definiować funkcje ISR, tak by podawać dodatkowe parametry - ale czy to nie byłby jakieś nadużycie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 5 paź 2017, o 09:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kisiel]]></name></author>
<updated>2017-10-05T07:46:02+01:00</updated>
<published>2017-10-05T07:46:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196442#p196442</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196442#p196442"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196442#p196442"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />&quot;Pamiętaj, aby w pliku nagłówkowym nigdy nie umieszczać definicji, powinny tam znajdować się wyłącznie deklaracje.<br />Nielicznymi wyjątkami są definicje zmiennych typu const oraz krótkich funkcji&quot;<br /></div><br /><br />W przytoczonym fragmencie jest napisane że nie powinno się ale skoro są wyjątki, standard to dopuszcza, dopiero DOBRA PRAKTYKA programowania tego zabrania. Ot różnica o którą mi cały czas chodzi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18008">kisiel</a> — 5 paź 2017, o 07:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-04T23:44:39+01:00</updated>
<published>2017-10-04T23:44:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196432#p196432</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196432#p196432"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196432#p196432"><![CDATA[
<div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br />Wszystkie zmienne definiowane poza ciałem funkcji opatruje się specyfikatorem 'static', wtedy ich zasięg i widoczność ograniczają się do danej jednostki kompilacji.<br /></div><br />A kto mówił inaczej ?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br /><div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br />W zamieszaniu umknęła wam, ludkowie<br /></div><br /><br />a to już TYPOWE chamskie teksty zadętych Śpeców <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> co to obrażają wszystkich - nie mając już żadnych innych argumentów<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 18 minutach ]</span></strong><br /><br /><div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br />Zmienne globalne są gorsze nawet od instrukcji &quot;goto&quot;. Naprawdę. I nie wierzcie gdy ktoś, kimkolwiek by nie był, mówi inaczej.<br /></div><br />Widzisz roske - przez twoje ZADĘCIE nawet nie zauważyłeś, że ZAWSZE to samo powtarzam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... ale nie ma to jak odkryć koło od nowa <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />hasta lawista dziecko <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 20 minutach ]</span></strong><br /><br /><div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br />Jedynie naprawdę ważna z wszystkiego co tu powiedziano: zmiennych globalnych się NIE używa.<br /></div><br /><br />hahahaha jak się okazało że kolega roske - w końcu zrozumiał co znaczy &quot;tentative definition&quot;<br /><br />to w końcu zaczyna mówić tym samym językiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />roske<div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br />Jedynie naprawdę ważna z wszystkiego co tu powiedziano: zmiennych globalnych się NIE używa.<br /></div><br /><br />nie się &quot;NIE&quot; używa - lecz ... panie kochany - ZALECA się nie używać .... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> a gdzież twoje wcześniejsze bzdury o tym że zmienne globalne to całkiem innego niż opowiadałeś bajki - nie wiedząc co to oznacza: &quot;tentative definition&quot;<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 21 minutach ]</span></strong><br /><br />hahahaa nie ma to jak edytować swój post gdy się bzdur nagadało co ? <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 paź 2017, o 23:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Harry]]></name></author>
<updated>2017-10-04T20:45:47+01:00</updated>
<published>2017-10-04T20:45:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196417#p196417</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196417#p196417"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196417#p196417"><![CDATA[
Chłopaki, dajcie już spokój z tymi kłótniami - niech robią jak chcą, w końcu to oni będą mieli kiedyś problemy.<br />Dopóki nie uczą innych jest ok <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14685">Harry</a> — 4 paź 2017, o 20:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-10-04T20:40:48+01:00</updated>
<published>2017-10-04T20:40:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196415#p196415</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196415#p196415"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196415#p196415"><![CDATA[
<div class="quotetitle">kisiel napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent">Ja bym się z tym nie zgodził - bo wg mnie definiowane zmiennych w plikach *.h to BŁĄD i nie jest to niezalecane - tak się nie robi w<br /></div><br /><br />WEDŁUG CIEBIE - Ale na szczęście to nie Ty definiujesz standard. </div><br />Dobrze byłoby poznać źródło w literaturze tych zdecydowanych twierdzeń.<br /><br />Próbowałem poszukać jakiegoś podparcia do rozsądzenia tej wątpliwości. Ciężko jest. Oczywiście przeglądnąłem książki, które mam.<br />Nie znalazłem nic co by potwierdzało Twoją wersję. Być może jestem źle nastawiony, ale jedynie co znalazłem to:<br />Tomasz Francuz &quot;AVR. Praktyczne projekty&quot;<br />&quot;Pamiętaj, aby w pliku nagłówkowym nigdy nie umieszczać definicji, powinny tam znajdować się wyłącznie deklaracje.<br />Nielicznymi wyjątkami są definicje zmiennych typu const oraz krótkich funkcji&quot;<br />No to Co? Tomasz Francuz też się myli?<br />Naprawdę trudno zaakceptować Twoje zalecenia, bo niczym tego nie popierasz.<br /><br />Póki co ja zapamiętuję, żeby NIE UMIESZCZAĆ. Dwa źródła, które znalazłem wskazują jednoznacznie, żeby tego nie robić. Z chęcią poznam jeszcze coś, co temu zaprzecza.<br /><br />Każdy może sobie wybrać jak pracować, ale w przypadku obwieszczania &quot;w internecie&quot; swoich racji to warto mieć jakieś poparcie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 4 paź 2017, o 20:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-04T19:47:04+01:00</updated>
<published>2017-10-04T19:47:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196408#p196408</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196408#p196408"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196408#p196408"><![CDATA[
<div class="quotetitle">kisiel napisał(a):</div><div class="quotecontent"><br />Myślę że tym programem obaliłem ostatni mit na temat tego że zmienne są globalne tylko w momencie dopisania extern - poniakąd to jest prawda, ale to extern jest niejawnie dopisywane przez kompilator.<br /></div><br />Napisałeś bzdurę bo &quot;tentative definition&quot; to nie ŻADNE dopisywanie extern przez kompilator - i żadnego mitu nie obaliłeś, Bo to że kompilator podłoży kilku zmiennym o tej samej nazwie TEN SAM ADRES w ram - NIE MA NIC WSPÓLNEGO ze zmienną globalną. A teksty, że kompilator &quot;łyknie&quot; a tylko kompilator sobie nie radzi to już zupełny odlot.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br /><div class="quotetitle">kisiel napisał(a):</div><div class="quotecontent"><br />Twojego podejścia do osób, które się z Tobą nie zgadzają.<br /></div><br /><div class="quotetitle">kisiel napisał(a):</div><div class="quotecontent"><br />Reszta to zwykłe oszczerstwa i obrażanie mojej osoby. Nic nie wiesz na temat jakie kody piszę, jak pracuje w grupie ani jak realizuje projekty. Ja w  żadnym poście nie napisałem nic na temat Twojego zachowania, Twojego podejścia do osób, które się z Tobą nie zgadzają. Po prostu skandal i żenada. Tyle ode mnie.<br /></div><br />No no i kot odwrócony ogonem - zostawię to i niech każdy sobie oceni w tym całym wątku co i jak .... tymczasem ja panie kochany, ponieważ dla mnie tajemnica korespondencji mailowej to rzecz święta, nie będę tu przytaczał cytatów z tego co ty do mnie napisałeś na PW i jakie oszczerstwa - i tylko dlatego, że ja się nie zgadzałem z twoim podejściem - napisałem ci na PW, tylko że to co przeczytałem od ciebie w mailu to dziecinada ... <br /><br />Ja niby źle traktuję osoby które się ze mną nie zgadzają - a jak ty traktujesz takie osoby kochany ? Żegnam cię i życzę ci powodzenia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 paź 2017, o 19:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kisiel]]></name></author>
<updated>2017-10-04T18:20:39+01:00</updated>
<published>2017-10-04T18:20:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196403#p196403</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196403#p196403"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196403#p196403"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />zatem zmyślne teorie kolegów roske i kisiel upadają, żeby nie było proszę obrazek<br /></div><br /><br />To samo zaprezentowałem tutaj - zero nowości, <br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic19291-30.html#p196297" >topic19291-30.html#p196297</a><!-- l --><br /><br />Czy muszę wspominać również że nigdzie w kodach, które zaprezentowałem nie występuje taka konstrukcja jak definicja 2 tych samych zmiennych w 2 plikach?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Ja bym się z tym nie zgodził - bo wg mnie definiowane zmiennych w plikach *.h to BŁĄD i nie jest to niezalecane - tak się nie robi w C. Oczywiście - jeśli ktoś zrobi to czasem nie wywoła to błędów bo język C nie traktuje tego jako błąd syntaktyczny ale niestety można się do tego przyzwyczaić jak kisiel i weź wtedy po kilku latach wyjaśnij takiej osobie że tak się nie robi - a ona twierdzi że programuje zawodowo od kilku lat więc wie co robi ... Tyle że nie wierzę, że w ciągu tych kilku lat nie pojawiły się problemy przy takim podejściu - ale pewnie były rozwiązywane &quot;na partyzanta&quot; i jakoś tam szło dalej - więc nie znając zasad - można taki błąd wciąż powielać i powielać<br /></div><br /><br />WEDŁUG CIEBIE - Ale na szczęście to nie Ty definiujesz standard. Reszta to zwykłe oszczerstwa i obrażanie mojej osoby. Nic nie wiesz na temat jakie kody piszę, jak pracuje w grupie ani jak realizuje projekty. Ja w  żadnym poście nie napisałem nic na temat Twojego zachowania, Twojego podejścia do osób, które się z Tobą nie zgadzają. Po prostu skandal i żenada. Tyle ode mnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18008">kisiel</a> — 4 paź 2017, o 18:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-04T11:46:43+01:00</updated>
<published>2017-10-04T11:46:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196397#p196397</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196397#p196397"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196397#p196397"><![CDATA[
A w tzw międzyczasie bo też mam takie zacięcie, żeby wszystko samemu sprawdzić a do tej pory (może wstyd się przyznać) ale nie miałem i nie używałem żadnego kompilatora C na PC pod windowsem, więc nie mogłem do końca sprawdzić np ew różnic w kompilacji pomiędzy tym co opowiadał roske albo kisiel. <br /><br />Zainstalowałem więc sobie CodeBlocks + kompilator MinGW i stworzyłem identyczny projekt testowy - no i proszę - jeśli w więcej niż jednym pliku inicjalizujemy zmienną &quot;dwa&quot; to KICHA - tu nawet nie zadziała tentative definition, tylko kompilator zwymiotuje błędem &quot;multiple definitions&quot;<br /><br />zatem zmyślne teorie kolegów roske i kisiel upadają, żeby nie było proszę obrazek. A przy okazji obaj koledzy dowiedzieli się, o co chodzi z tentative definition a jednocześnie mam nadzieję, że zrozumieli jak działa mechanizm zmiennych globalnych w C i jak należy prawidłowo do tego podchodzić.<br /><br /><img src="https://obrazkiforum.atnel.pl/54/e9365c9b84f378e00e6acdf03c8bb6c0.jpg" alt="Obrazek" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 paź 2017, o 11:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-04T10:27:38+01:00</updated>
<published>2017-10-04T10:27:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196395#p196395</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196395#p196395"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196395#p196395"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Zapis ten, wg mnie, sugeruje, że tylko jawna (przez użytkownika) inicjalizacja zmiennej zrobi z tego zapisu definicję<br />Jeśli nie sugeruje tego autor intencjonalnie, to sam zapis i brak wyjaśnienia mąci innym w głowach, bo faktycznie użytkownik nie musi jawnie inicjować zmiennej, żeby była definicją, zrobi to automatycznie kompilator - bo taki jest standard języka C.<br /></div><br /><br />I właśnie na takim czymś - wg takich materiałów uczy się część osób programować w C a później po kilku latach używania tego - jak kolega kisiel - piszą, że tutaj ja opowiadam jakieś bzdury albo swoje zasady na temat języka C<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Niestety, jak wiemy z wątku, to bardzo potrzebne &quot;extern&quot; jest najczęściej doklejane przez kompilator jeśli go brakuje w plikach nagłówkowych, stąd mogą rodzić się nieporozumienia.<br /></div><br /><br />No tutaj bym tylko doprecyzował , że kompilator nie dokleja extern .... za to próbuje włączać mechanizm &quot;Tentative definitions&quot; czyli próbuje sprawdzać czy pojawiły się aby przypadkiem dwie TAKIE SAME definicje TAKIEJ SAMEJ zmiennej tzn o TAKIEJ SAMEJ nazwie, co więcej sprawdza czy tylko w jednym przypadku zmienna została ew jawnie zainicjalizowana a jeśli tak - to przydzieli w przypadku każdej z tych definicji JEDEN adres w RAM a zatem niejako sklei je w JEDNĄ zmienną. Czyli nie ma to nic wspólnego z doklejaniem extern tak wprost. ALE WARTO wiedzieć jak to działa bo to pozwoli nam często wyszukać jakiś dziwny błąd ....<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 7 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Powrócę za to jeszcze do rodzaju zmiennych, czy lokalna czy globalna.<br />Uknułem sobie taką oto skrótową definicję: każda definicja zmiennej wewnątrz funkcji robi z niej zmienną lokalną.<br />Wszystkie inne definicje (poza funkcjami, również poza main() ) to są zmienne globalne, są bowiem umieszczone w sekcji zmiennych globalnych, ale o różnym zakresie widoczności, którą definiuje użytkownik poprzez deklarację zmiennych w odp. plikach nagłówkowych, które to następnie można inkludować do kolejnych plików źródłowych rozszerzają widoczność na inne moduły.<br /></div><br /><br />No i bardzo dobra teoria - chociaż ja również piszę już o tym w Bluebooku ale zrozumiałe jest - że nie od razu czasem wszystko do nas dotrze z jednego źródła - dlatego warto wtedy sięgać również do innych książek - rzadziej tylko do internetu bo jak widać po powyższym twoim przykładzie można w 50% trafić na takie bzdury że szok<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 11 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Definiować zmienne można również w plikach nagłówkowych (nie spowoduje to błędów kompilacji), ale nie jest to zalecenie (silnie niezalecane), bo może powodować lawiny błędów, szczególnie przy rozbudowanych, wieloplikowych projektach.<br /></div><br /><br />Ja bym się z tym nie zgodził - bo wg mnie definiowane zmiennych w plikach *.h to BŁĄD i nie jest to niezalecane - tak się nie robi w C. Oczywiście - jeśli ktoś zrobi to czasem nie wywoła to błędów bo język C nie traktuje tego jako błąd syntaktyczny ale niestety można się do tego przyzwyczaić jak kisiel i weź wtedy po kilku latach wyjaśnij takiej osobie że tak się nie robi - a ona twierdzi że programuje zawodowo od kilku lat więc wie co robi ... Tyle że nie wierzę, że w ciągu tych kilku lat nie pojawiły się problemy przy takim podejściu - ale pewnie były rozwiązywane &quot;na partyzanta&quot; i jakoś tam szło dalej - więc nie znając zasad - można taki błąd wciąż powielać i powielać<br /><br />krótko - w C nie DEFINIUJE się zmiennych w plikach nagłówkowych<br /><br />nie definiuje się również funkcji - chociaż tutaj jest pewien wyjątek <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> - otóż można w plikach *.h definiować krótkie funkcje typu inline <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 12 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Ja bym jeszcze dodał jeszcze, że ten zapis powyższy będzie poprawny tylko i wyłącznie w jakiejś funkcji zdefiniowanej w main.c.<br />Proszę o komentarz, ja spróbuję tak skomentować.<br /></div><br /><br /><span style="color: #FF0000">OCZYWIŚCIE <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> sorki mój błąd</span> - powinienem to był napisać w ramach np funkcji main() i zaraz to na górze poprawię. DZIĘKI za sprostowanie i wskazanie mojego błędu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 16 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Oczywiście wymądrzam się, bo sobie zrobiłem projekt i dostałem błędy, a potem wymyśliłem odpowiedź<br /></div><br /><br />eeee tam jakie wymądrzanie - mnie osobiście bardzo się podoba tego typu dochodzenie do pewnych wniosków, na forum niewiele osób tak jak ty - testuje pewne rzeczy na żywym organizmie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... tak na gorąco - to chyba przychodzi mi na myśl tu nick kolegi Daro69 - który również dzięki takiemu podejściu - jak ja obserwuję co wyrabia na forum - to BARDZO szybko podnosi swój skill w C <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 paź 2017, o 10:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-10-04T09:41:03+01:00</updated>
<published>2017-10-04T09:41:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196391#p196391</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196391#p196391"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196391#p196391"><![CDATA[
Szanowni Czytelnicy, jeszcze pociągnę temat deklaracji i definicji, bo chyba wreszcie wbiłem sobie to do głowy, może komuś jeszcze to pomoże.<br />Przygotowałem kilka cytatów z czeluści ksiąg tajemnych i internetów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Cytat z niniejszego wątku:<br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><strong><span style="font-size: 150%; line-height: normal"><span style="color: #0080FF">1. extern int dwa;<br />2. int dwa;</span></span></strong><br /><br />czym to się różni ? otóż <strong><span style="color: #0080FF">PIERWSZY </span></strong>zapis to DEKLARACJA z linkowaniem zewnętrznym (external linkage)<br /><strong><span style="color: #0080FF">DRUGI</span></strong> zapis to jest panie DEFINICJA a ta dzięki regułom &quot;tentative definition&quot; jest również z linkowaniem zewnętrznym (external linkage) Dzięki czemu może w ogóle dojść do połączenia definicji zmiennej dwa w twoim przykładzie pod jednym adresem w RAM.<br /></div><br /><br />Na potwierdzenie jeszcze raz to samo źródło, czyli BB. Pozwolę sobie zacytować cześć dot. zmiennej:<br />&quot;Przykłady <strong>Deklaracji</strong>:<br /><span style="color: #408000">extern</span> int a1;<br /><span style="color: #408000">extern</span> uint8_t tab[];<br />Przykłady <strong>Definicji</strong>:<br />int b1;<br />int c2 = 5;&quot; Koniec cycatu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Szukamy zatem innego źródła: &quot;Podstawy języka C++&quot; Stanley B. Lippman&quot;<br /><br />&quot;<strong>Definicja </strong> zmiennej służy do zarezerwowania dla tej zmiennej, wprowadzenia jej nazwy i określenia typu&quot;<br />&quot;<strong>Deklaracja</strong> służy do oznajmiania, że zmienna taka istnieje i została zdefiniowana w innym miejscu programu. Deklaracja składa się ze specyfikatora typu oraz nazwy zmiennej, poprzedzonych słowem kluczowym <span style="color: #408000">extern</span>&quot;<br /><br />Najważniejszy wniosek dla mnie tutaj płynie taki, że jawne pisanie <span style="color: #408000">extern </span>wskazuje bezbłędnie na deklarację, zatem używajmy go wszędzie gdzie trzeba, nie liczmy na kompilator. Poprawne użycie tego słowa zwiększa czytelność kodu!<br /><br />A teraz pojęcia prosto z &quot;interneta&quot;:<br /><!-- m --><a class="postlink" href="http://cpp0x.pl/forum/temat/?id=20322" >http://cpp0x.pl/forum/temat/?id=20322</a><!-- m --><br />No i mamy podsumowanie:<br />[syntax=c]int x; //deklaracja<br />x = 10; //inicjalizacja<br />int y = 5; // definicja = deklaracja + inicjalizacja[/syntax]<br /><br />Zapis ten, wg mnie, sugeruje, że <strong>tylko jawna</strong> (przez użytkownika) inicjalizacja zmiennej zrobi z tego zapisu <strong>definicję</strong><br />Jeśli nie sugeruje tego autor intencjonalnie, to sam zapis i brak wyjaśnienia mąci innym w głowach, bo faktycznie użytkownik nie musi jawnie inicjować zmiennej, żeby była definicją, zrobi to automatycznie kompilator - bo taki jest standard języka C.<br />Zatem każda definicja zmiennej rezerwuje pamięć i daje jej wartość. Użytkownik oczywiście tę wartość może zmienić, ale to banał <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Zapis:<br />[syntax=c]int x; // deklaracje[/syntax]<br />to oczywisty błąd, zapis ten nie jest deklaracją.<br />Linijka ta oczywiście jest definicją, bo nie zawiera słowa kluczowego &quot;<span style="color: #00BF00">extern</span>&quot;. Niestety, jak wiemy z wątku, to bardzo potrzebne &quot;extern&quot; jest najczęściej doklejane przez kompilator jeśli go brakuje w plikach nagłówkowych, stąd mogą rodzić się nieporozumienia.<br /><br />No i chyba wreszcie zaskoczyło i łatwiej mi już dzielić na pliki, błędów nie ma i jest git <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Powrócę za to jeszcze do rodzaju zmiennych, czy lokalna czy globalna.<br />Uknułem sobie taką oto skrótową definicję: każda <strong>definicja </strong>zmiennej wewnątrz funkcji robi z niej zmienną lokalną.<br />Wszystkie inne definicje (poza funkcjami, również poza main() ) to są zmienne globalne, są bowiem umieszczone w sekcji zmiennych globalnych, ale o różnym zakresie widoczności, którą definiuje użytkownik poprzez deklarację zmiennych w odp. plikach nagłówkowych, które to następnie można inkludować do kolejnych plików źródłowych rozszerzają widoczność na inne moduły.<br /><br />Definiować zmienne można również w plikach nagłówkowych (nie spowoduje to błędów kompilacji), ale nie jest to zalecenie (silnie niezalecane), bo może powodować lawiny błędów, szczególnie przy rozbudowanych, wieloplikowych projektach.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 26 minutach ]</span></strong><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />main.c<br />[syntax=c]#include &quot;common.h&quot;<br /><br />mojastruktura.ala = 23;<br />int a = mojastrutura.as;[/syntax]<br /></div><br /><br />Ja bym jeszcze dodał jeszcze, że ten zapis powyższy będzie poprawny tylko i wyłącznie w jakiejś funkcji zdefiniowanej w main.c.<br />Proszę o komentarz, ja spróbuję tak skomentować.<br /><br />1. Dostępu do pól struktur nie ma w sekcji zmiennych globalnych. Jedynie podczas definiowania zmiennej można ją zainicjalizować po swojemu:<br />TMYSTRUCT mojastruktura = {7,2};<br /><br /><br />2. Zmiennych globalnych nie można inicjować zmiennymi, tylko stałymi. Stąd m.in. częsty błąd podczas kompilacji:<br />&quot;error: initializer element is not constant.&quot;<br /><br />Oczywiście wymądrzam się, bo sobie zrobiłem projekt i dostałem błędy, a potem wymyśliłem odpowiedź <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 4 paź 2017, o 09:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-04T09:39:10+01:00</updated>
<published>2017-10-04T09:39:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196390#p196390</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196390#p196390"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196390#p196390"><![CDATA[
<div class="quotetitle">APAP75 napisał(a):</div><div class="quotecontent"><br />Tam, gdzie includuję comon.h i z niej korzystam jest niby ok - program się kompiluje, nie wywala błędów, ale robiłem to trochę jak ruski saper - &quot;na macajewa&quot;.<br /></div><br /><br />Nie, nie zrobiłeś jak ruski saper - zrobiłeś MEGA POPRAWNIE:<br /><br /><br />common.c<br />[syntax=c]#include &quot;common.h&quot;<br /><br />TMYSTRUCT mojastruktura;[/syntax]<br /><br /><br />common.h<br />[syntax=c]typedef struct {<br />  uint8_t ala;<br />  int as;<br />}  TMYSTRUCT; // definiujemy nowy typ strukturalny<br /><br />extern TMYSTRUCT mojastruktura;[/syntax]<br /><br />main.c<br />[syntax=c]#include &quot;common.h&quot;<br /><br />int main( void ) {<br />    mojastruktura.ala = 23;<br />    int a = mojastrutura.as;<br /> <br />    while(1) {<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 paź 2017, o 09:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[APAP75]]></name></author>
<updated>2017-10-04T09:29:39+01:00</updated>
<published>2017-10-04T09:29:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196389#p196389</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196389#p196389"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196389#p196389"><![CDATA[
A jak postępować ze zmiennymi będącymi strukturami?<br />W wielu miejscach natchnąłem się: &quot;ten iclude musi być pierwszy bo inaczej nie działa&quot;<br /><br />Zrobiłem mały test - definicję nowego TYPU zmienne strukturalnej wrzuciłem do  common.h, definicję ZMIENNEJ strukturalnej do common.c, deklarację tejże zmiennej (ze słowem extern) do common.h.<br />Tam, gdzie includuję comon.h i z niej korzystam jest niby ok - program się kompiluje, nie wywala błędów, ale robiłem to trochę jak ruski saper - &quot;na macajewa&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6195">APAP75</a> — 4 paź 2017, o 09:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-03T20:05:38+01:00</updated>
<published>2017-10-03T20:05:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196360#p196360</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196360#p196360"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196360#p196360"><![CDATA[
Wydaje mi się, że już kiedyś o tym i to tobie pisałem - ale może mi się wydaje <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> więc jeszcze raz:<br /><br /><div class="quotetitle">procek87 napisał(a):</div><div class="quotecontent"><br />Co zrobić jeśli main.c nie ma swojego pliku nagłówkowego<br /></div><br /><br />A dlaczego piszesz, że on nie ma swojego pliku? A kto tak powiedział? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> toż to od ciebie zależy, toż możesz sobie stworzyć plik main.h - kto ci zabroni - i tak czasem ludzie robią - ale mi się to nie do końca podoba osobiście , ja wolę nieco inne podejście - ale to tylko moja propozycja a nie że ja mówię że tak trzeba. Ja po prostu tak robię w swoich programach.<br /><br />PO PIERWSZE - ZAWSZE warto umieszczać zmienne w plikach z którymi one się jakoś wiążą logicznie, w których są najczęściej używane a rzadziej będą używane w innych plikach projektu.<br /><br />Podajesz tu przykład troszkę oczywiście oderwany od rzeczywistości - ale fajnie że prosty przykład oczywiście ...<br /><br />otóż zakładając, że zmienna pomoc miałaby być wykorzystywana zarówno w main.c ale też w innych przypadkowych plikach projektu - to ja z marszu zakładam sobie w ścieżce głównej projektu od razu dwa pliki:<br /><br />common.c<br />common.h<br /><br />i już sam czujesz, że właśnie umieściłbym jej definicję w pliku common.c zaś deklarację w common.h a następnie tam gdzie będę jej potrzebował czy to w main.c czy w innych plikach - rozumiesz? Zawsze w plikach &quot;common&quot; wtedy umieszczam tego typu wspólne i nie mające logicznego powiązania zmienne z konkretnym modułem. Podobnie z jakimiś wspólnymi funkcjami czy definicjami preprocesora<br /><br />ALE ... ty tu w tym przykładzie napisałeś że potrzebujesz zrobić pliki<br /><br />main.c<br /><br />pomoc.c<br />pomoc.h<br /><br /><br />no to jak widzę nazwę zmiennej &quot;pomoc&quot; to sam powiedz - nie wiąże się ona logicznie z tymi plikami pomoc.c -.h ??? A jeśli tak to niestety wymyśliłeś NAJMNIEJ zdrowe podejście, żeby:<br /><br />a) DEFINICJĘ tej zmiennej walnąć w main.c<br />b) DEKLARACJĘ tej zmiennej dać w pomoc.h<br /><br />ja bym jak pisałem wyżej dał jej definicję w pomoc.c, jej deklarację w pomoc.h i zainkludowałbym w main.c plik pomoc.h<br /><br />Mam nadzieję, że teraz jaśniej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 paź 2017, o 20:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[procek87]]></name></author>
<updated>2017-10-03T19:39:42+01:00</updated>
<published>2017-10-03T19:39:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196357#p196357</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196357#p196357"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196357#p196357"><![CDATA[
Mirku jeszcze jedno w tym temacie bo dziś na to się natknąłem a o to nie spytałem i nie daje mi św.spokoju , nasunęło mi się kolejne pytanie , podejrzewam jak postąpić ale nie jestem pewien dlatego popraw mnie .<br /><br /><br /> definiuje załużmy  zmienną globalną w main.c  w projekcie składającym się z plików main.c i pomoc.c<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">//***main.c<br /><br />int globalna=4;  // zmienna globalna, którą chce uwidocznić w pliku pomoc.c<br /><br />int main(void){<br />}</div><br /><br />Co zrobić jeśli <strong>main.c</strong> nie ma swojego pliku nagłówkowego i nie można przerzucić do niego deklaracji zmiennej globalnej <strong>extern</strong>,<br /> bo nie ma pliku main.h przerzucić tą deklaracjie <strong>extern int globalna</strong> do pomoc.h , by uwidocznić ją, dla pliku pomoc.c , w którym chce się zapewnić dostęp do niej ?<br /><br /><br /> ja bym przerzucił deklaracjie do pliku nagłówkowego pomoc.h   , ale nie wiem czy dobrze myśle?<br /><br />main.c<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">//***main.c<br /><br />int globalna=4;<br /><br />int main(void){<br />orange();<br />}</div><br /><br />pomoc.c<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">//**pomoc.c<br /><br />void orange (void){<br />globalna=6<br />}<br /><br />}</div><br /><br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">//**pomoc.h<br />#ifndef GH_H_<br />#define GH_H_<br /><br /><br />extern int globalna;<br /><br />void orange(void);<br /><br />#endif /* GH_H_ */<br />}</div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17263">procek87</a> — 3 paź 2017, o 19:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-03T14:38:01+01:00</updated>
<published>2017-10-03T14:38:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196351#p196351</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196351#p196351"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196351#p196351"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />&quot;Obie są globalne, bo jedną zdefiniowano w main.c, a drugą w foo.c, obie w sekcjach zmiennych globalnych oraz zmienna dwa, poprzez extern, jest widoczna w main.c i jest globalna.&quot;<br /></div><br />no tak - obie zmienne o nazwie &quot;dwa&quot; w obu plikach są globalne względem tych plików ale dzięki &quot;Tentative definitions&quot; posiadają coś takiego jak &quot;external linkage&quot; dzięki czemu kompilator może te dwie zmienne o nazwie &quot;dwa&quot; widzieć pod jednym adresem RAM. Ale jak już zdążyłem napisać w kolejnym poście - gdyby w ten sposób chcieć korzystać z globalności zmiennych - to sam popatrz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zamiast dawać zmienną &quot;dwa&quot; tak jak &quot;jeden&quot; ze specyfikatorem extern do pliku &quot;h&quot; to co ? logicznym wydaje się napierniczanie w KAŻDYM pliku w którym chcesz użyć tej zmiennej &quot;dwa&quot; aby była widoczna w całym projekcie ???? Toż to byłaby bzdura <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> a pomyśl o bibliotekach <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to już w ogóle nie dałoby rady zrobić - bo byś musiał kazać użytkownikowi swojej biblioteki definiować w KAŻDYM własnym pliku zmienną &quot;dwa&quot; zamiast przekazać ją jako &quot;extern int dwa&quot; przez plik nagłówkowy biblioteki ... no tu roske popłynął <br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Natomiast dwa jest zmienną globalną, bo umieszczono ją w sekcji zmiennych globalnych pliku foo.c, ale nie jest widoczna dla innych modułów, nawet jeśli includują foo.h, bo nie ma jej deklaracji poprzedzonej extern w pliku foo.h?<br /></div><br />Tak nie jest widoczna dokąd nie zadziała Tentative definitions - co WCALE NIE SPOWODUJE, że każda z nich stanie się widoczna dla innego pliku ale spowoduje, że kompilator zrobi porządek za plecami i obydwie zmienne przypisze do JEDNEGO adresu w RAM ... i będzie to dziwnie wyglądało nieprawdaż ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Czy może robi się z niej lokalna, bo zabrakło extern i deklaracji w nagłówku foo.h?<br /></div><br />Nie, jest tak jak wyżej doprecyzowuję<br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />A może brak widoczności, pomimo umieszczenia w sekcji zmiennych globalnych, automatycznie robi ze zmiennej lokalną?<br /></div><br />też nie - patrz wyżej &quot;Tentative definitions&quot;<br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Co zatem ze zmienną static w jakiejś funkcji.<br />Piszą, że to jest &quot;zmienna lokalna, ale umieszczona w sekcji zmiennych globalnych&quot;, która jest widoczna tylko dla tej konkretnej funkcji, gdzie nastąpiła definicja.<br />Czy takie umieszczenie nie robi z niej jednak globalnej, tak jak te nieszczęsne dwa<br /></div><br /><br />nie nie nie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> nie ... spokojnie na pewno wiedziałeś co robi static albo co zrobiłby dla zmiennej dwa ale pewnie zapomniałeś. Specyfikator static daje tylko powiązanie wewnętrzne czyli zmienna będzie mogła być widoczna TYLKO I WYŁĄCZNIE w ramach tego samego pliku i będziesz miał błąd nawet jak spróbujesz ją wyeksportować przez plik h za pomocą extern <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> - to całkiem oddzielna sytuacja. Wyłączamy widoczność dla innych plików jeśli chodzi o zmienne globalne w pliku jeśli dajemy im static<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota  napisał(a):</div><div class="quotecontent"><br />Może źle rozumiem &quot;sekcja zmiennych globalnych&quot; i nie chodzi tu o miejsce w plikach źródłowych &quot;.c&quot;, tylko o miejsce w pamięci?<br />Dla mnie to miejsce to: &quot;wszędzie&quot; poza funkcjami w plikach źródłowych, a wg dobrych zasad zaraz za includami?<br /></div><br />DOBRZE rozumiesz - chodzi o miejsce i widoczność w pliku źródłowym - zaś możliwość powiązań później zależy albo od EXTERN albo od tego co robił roske czyli znowu - reguł &quot;Tentative definitions&quot;<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Dlaczego mamy w wyniku 200? Bo dwa z funkcji main() zasłoniła dwa z foo.c?<br /></div><br />Bo jednak kompilator połączył obie zmienne &quot;dwa&quot; pod jednym adresem. Udało się to dzięki ? ... &quot;Tentative definitions&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 10 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Dlaczego zatem w kolejnym przypadku jest już 2, gdy nie przypiszemy 200 w funkcji main(), bo nagle &quot;wskoczyło&quot; dwa z foo.c<br /></div><br /><br />No bo teraz zobacz - a to jest CIEKAWE i dlatego pokazałem taki przypadek<br /><br />Najpierw wykonuje się funkcja fun1() prawda ? Zmienna &quot;dwa&quot; dzięki (mantra) Tentative definitions - ma ten sam adres a jej inicjalizacja nastąpiła w foo.c i na wartość = 2 zgadza się ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Dlatego zanim nie zmienimy tej wartości to ukazała nam się wartość = 2 ! Następnie w main() przypisując wartość 200 zmieniamy z 2 na 200 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo znowu mamy do czynienia z tym samym adresem w RAM<br /><br />ale tym przypadkiem chciałem pokazać również koledze roske - jakie głupoty mogą wychodzić podczas analizy kodu - i nie dziwię się, że ty Zealota się dziwisz skąd się wzięło 2 - ale teraz już chyba jasne ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 12 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Ja to zrobiłem, bo nie wytrzymałem . I co bym nie robił, jak nie kombinował, zawsze jest error &quot;multiple definition&quot;.<br />Nawet gdy foo2.c ma tylko jedną linijkę int dwa = 3; .<br />Zawsze linker się pluje, bo chyba właśnie tak działa, że nie mnoży nie potrzebnych bytów<br /></div><br /><br />Jeśli w trzech plikach - ZROBISZ TYLKO jedną inicjalizację to oczywiście zadziała <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> sprawdź to też sobie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> - warto sprawdzać to na naszym złomie prockowym - bo wtedy człowiek się najwięcej uczy wg mnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />ale też dzięki temu zrozumiesz jak i dlaczego działa Tentative definitions, które kolega roske pomylił sobie z globalnością w całym projekcie - QUNIEC na razie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 paź 2017, o 14:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-10-03T14:26:45+01:00</updated>
<published>2017-10-03T14:26:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196350#p196350</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196350#p196350"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196350#p196350"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent">Ta druga przecież wcale nie jest zdefiniowana tylko zadeklarowana<br /></div><br />Toż OBYDWIE zmienne o nazwie &quot;dwa&quot; są ZDEFINIOWANE <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jedna w main.c zaś druga w foo.c - proszę przeczytaj wyżej moje wyjaśnienie<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br />ale to powiedz od którego momentu ?</div><br />No tak walnąlem kulą wpłot. Wracam do przemyśleń na temat definicji i deklaracji <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />choć czytam to i jeszcze nadal nie rozumiem<br /></div><br /><br />Nadal to jest takie rozwleczone. Gdzieś dzwoni, ale nie wiadomo gdzie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Powrócę na razie do stwierdzenia:<br /><br />&quot;Obie są globalne, bo jedną zdefiniowano w main.c, a drugą w foo.c, obie w <strong>sekcjach zmiennych globalnych</strong> oraz zmienna <strong>dwa</strong>, poprzez <strong>extern, </strong>jest widoczna w main.c i jest globalna.&quot; <br />Jednak źle to chyba napisałem, chodziło oczywiście o zmienną <strong>jeden</strong>, bo to ona ma extern i jest globalna oraz widoczna dla tych co inkludują foo.h.<br />Zgadza się teraz?<br /><br />Natomiast <strong>dwa</strong> jest zmienną globalną, bo<strong> umieszczono ją w sekcji zmiennych globalnych</strong> pliku foo.c, ale nie jest widoczna dla innych modułów, nawet jeśli includują foo.h, bo nie ma jej deklaracji poprzedzonej extern w pliku foo.h?<br /><br />Czy może robi się z niej lokalna, bo zabrakło extern i deklaracji w nagłówku foo.h?<br /><br />A może brak <strong>widoczności</strong>, pomimo umieszczenia w sekcji <strong>zmiennych globalnych</strong>, automatycznie robi ze zmiennej lokalną?<br /><br />A może to po prostu nieporozumienie: umieszczenie w sekcji zmiennych globalnych, ale ograniczenie widoczności powoduje, że ktoś uważa, że jest lokalna?<br />Taki błąd komunikacyjny?<br /><br />Co zatem ze zmienną static w jakiejś funkcji.<br />Piszą, że to jest &quot;zmienna lokalna, ale umieszczona w sekcji zmiennych globalnych&quot;, która jest widoczna tylko dla tej konkretnej funkcji, gdzie nastąpiła definicja.<br />Czy takie umieszczenie nie robi z niej jednak globalnej, tak jak te nieszczęsne <strong>dwa </strong> <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Może źle rozumiem &quot;sekcja zmiennych globalnych&quot; i nie chodzi tu o miejsce w plikach źródłowych &quot;.c&quot;, tylko o miejsce w pamięci?<br />Dla mnie to miejsce to: &quot;wszędzie&quot; poza funkcjami w plikach źródłowych, a wg dobrych zasad zaraz za includami?<br /><br />Zatem te wyniki, które wspólnie kompilowaliśmy...<br /><br />Dlaczego mamy w wyniku 200? Bo <strong>dwa </strong>z funkcji main() zasłoniła dwa z foo.c?<br />Dlaczego zatem w kolejnym przypadku jest już 2, gdy nie przypiszemy 200 w funkcji main(), bo nagle &quot;wskoczyło&quot; dwa z foo.c <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Poczytam jeszcze te wcześniejszy obszerny wywód, ale moje wątpliwości właśnie tu się kumulują, w tych powyższych zdaniach <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Co zrobić jak talentu poskąpiło <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Po trzecie - ZAŁÓŻ ŻE PLIK --- FOO1.c i tam zdefiniuj po raz kolejny zmienną dwa - i skompiluj<br /></div><br /><br />Ja to zrobiłem, bo nie wytrzymałem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. I co bym nie robił, jak nie kombinował, zawsze jest error &quot;multiple definition&quot;.<br />Nawet gdy foo2.c ma tylko jedną linijkę <strong>int dwa = 3;</strong> .<br />Zawsze linker się pluje, bo chyba właśnie tak działa, że nie mnoży nie potrzebnych bytów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />No chyba, że zamienimy na <strong>int dwa;</strong> już jest bez błędów hmm....<br />Taka definicja jest usuwana przez kompilator? Bo nie rezerwuje pamięci i jest ogólnie niepotrzebna? Podobnie jak w przykładzie nr 1 Kolegi roske?<br />Czy to chodzi o te magiczne 1 vs 4 od Mirka? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Dobra tyle tego dumania...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 3 paź 2017, o 14:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-03T14:18:55+01:00</updated>
<published>2017-10-03T14:18:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196349#p196349</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196349#p196349"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196349#p196349"><![CDATA[
a teraz <strong><span style="color: #0080FF">roske </span></strong>- co to jest &quot;tentative definition&quot; - to nie jest trudne - także nie jest trudne do przetłumaczenia na polski <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Ja bym to nazwał &quot;niepewną definicją&quot; ... albo może lepiej &quot;orientacyjną definicją&quot; ... o co chodzi ?<br /><br />Otóż ta reguła &quot;tentative definition&quot; wprowadzona do C pozwala na utworzenie wielu definicji tej samej zmiennej i najwyżej jedna z nich posiada jawny inicjalizator. A zatem taki kod:<br /><br />[syntax=c]int dwa;<br />int dwa=7;[/syntax]<br /><br />też się skompiluje dzięki tej regule - co może wydawać się dziwne, ale kompilator C tak &quot;z tyłu zza węgła&quot; łączy wszystkie wstępne definicje w jedną definicję. I masz rację, że zachodzi tu jak pisałeś &quot;tentative definition&quot; ale na ZEUSA no BZDURĄ jest tworzenie definicji o tej samej nazwie i to w różnych plikach ! Co to ma w ogóle wspólnego z pojęciem zmiennych globalnych ? <br /><br />dla twojej wiadomości:<br /><br /><strong><span style="font-size: 150%; line-height: normal"><span style="color: #0080FF">1. extern int dwa;<br />2. int dwa;</span></span></strong><br /><br />czym to się różni ? otóż <strong><span style="color: #0080FF">PIERWSZY </span></strong>zapis to DEKLARACJA z linkowaniem zewnętrznym (external linkage)<br /><strong><span style="color: #0080FF">DRUGI</span></strong> zapis to jest panie DEFINICJA a ta dzięki regułom &quot;tentative definition&quot; jest również z linkowaniem zewnętrznym (external linkage) Dzięki czemu może w ogóle dojść do połączenia definicji zmiennej dwa w twoim przykładzie pod jednym adresem w RAM.<br /><br />I teraz - jak się spojrzy na taki projekt gdzie będą trzy pliki:<br /><br />main.c<br />[syntax=c]int dwa=7;  // &lt;---- pierwszy raz w projekcie DEFINICJA zmiennej &quot;dwa&quot;<br /><br />int main( void ) {<br />  // bla bla bla<br />}[/syntax]<br /><br /><br />foo1.c<br />[syntax=c]int dwa;  // &lt;---- drugi raz w projekcie DEFINICJA zmiennej &quot;dwa&quot;<br /><br />void fun1( void ) {<br />   // bla bla bla<br />}[/syntax]<br /><br /><br />foo2.c<br />[syntax=c]int dwa;  // &lt;---- trzeci raz w projekcie DEFINICJA zmiennej &quot;dwa&quot;<br /><br />void fun1( void ) {<br />   // bla bla bla<br />}[/syntax]<br /><br />i w każdym definicja zmiennej o nazwie &quot;dwa&quot; to też się skompiluje dzięki temu mechanizmowi .... ale czy TAK PISZE się programy ? No bój się Pan Boga! ... Ty chcesz używać świadomie &quot;tentative definition&quot; - w KAŻDYM projekcie pisząc tę samą DEFINICJĘ zmiennej ? sorry ale to już wręcz niedorzeczność - owszem to zadziała ale to MEGA BZDURA - tyle że pokazuję ci dlaczego to zadziała <br /><br />zamiast więc pisać z uporem maniaka - jak sam to określałeś - WYSTARCZY korzystać z PRZEJRZYSTEGO określania zakresu widoczności zmiennych, które mają być GLOBALNE - dla innych plików ... toż wystarczy na ZEUSA tylko w jednym pliku *.h tak jak to zrobiłeś ze zmienną &quot;jeden&quot; użyć extern !<br /><br />extern int dwa;<br /><br />czym JASNO określasz zakres widoczności i linkowania tej zmiennej. Widząc to w kodzie - JESTEM nie tylko przekonany, że gdzieś w jednym z np 50-ciu plików projektu znajduje się JEDNA (Qurczę) DEFINICJA zmiennej - która może być również jawnie inicjalizowana ....<br /><br /><br />-------------------------------------------------------<br /><br />i na sam KONIEC chłopie teraz o ile nie bawisz się w pisanie kodu w konsoli tylko w jakimś porządnym <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> graficznym środowisku jak ECLIPSE <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zrób sobie taki mały niewinny super krótki teścik;<br /><br />Gdy będziesz miał w tych trzech plikach w KAŻDYM definicję &quot;dwa&quot; to spróbuj trzymając wciśnięty LEWY CONTROL plus kliknięcie MYCHĄ - kliknąć na nazwie &quot;dwa&quot; ..... KICHA ! nic się nie stanie bo stoisz niby na definicji - ale tych fantomowych definicji masz aż trzy ? <br /><br />Za to kliknij sobie w ten sposób na nazwę &quot;jeden&quot; w main.c <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i zobacz jak ładnie poprowadzi cię środowisko do miejsca gdzie jest DEFINICJA tej zmiennej !<br /><br />----------------------------------<br /><br />jak sobie zrobisz te trzy pliki - to zauważ, że ZAWSZE w pliku w którym będziesz miał inicjalizację zmiennej &quot;dwa&quot; to w objectdumpie zobaczysz <br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">O .data.dwa</div><br /><br />zaś w pozostałych plikach<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">O *COM* 00000001 dwa </div><br /><br />u mnie tu na końcu będzie jeden a u ciebie 4 - ale jak pisałem wcześniej to zagadka dlaczego <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />gdzieś znalazłem takie wyjaśnienie:<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Tentative definitions were invented to standardize various pre-C89 approaches to forward declaring identifiers with internal linkage.<br /></div><br /><br />więc kończąc - ma to tyle wspólnego z twoim pojęciem globalności co ... no właśnie co z czym ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 paź 2017, o 14:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-03T13:07:21+01:00</updated>
<published>2017-10-03T13:07:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196347#p196347</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196347#p196347"/>
<title type="html"><![CDATA[Re: Projekt podział na pliki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19291&amp;p=196347#p196347"><![CDATA[
<div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br />...zmienna dwa odzyskuje swoją &quot;globalnowato-alokowalność&quot;. Są dwie zmienne globalne, konsolidator nie może tego rozwiązać. Co się stało? Zastosowanie znalazło &quot;tentative definition&quot;:<br /></div><br />W AVR GCC jak widać to nie zadziała co ci pokazałem i udowodniłem a ty dalej z uporem maniaka dowodzisz swojego - zamiast podchodzić do zmiennych globalnych jak się należy i nie byłoby żadnego problemu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jak mówię skompiluj trzeci plik z trzecią definicją tej samej zmiennej - ja nie mam kompilatora C na PC więc nie mam jak sprawdzić - może u ciebie też zadziała <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Tyle że NAWET jeśli zadziała to fakt, że kodzie projektu w 40 plikach będziesz miał definicję zmiennej &quot;dwa&quot; - zamiast rozprzestrzeniać jej widoczność za pomocą extern - jest po prostu (delikatnie mówiąc) tragicznym pomysłem na podejście do programowania<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br /><div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent">korzystamy z różnych kompilatorów<br /></div><br />Ja używam GCC.  A Ty nie AVR-GCC? ...Czyli GCC.</div><br /><br />No i co? dla ciebie nie ma różnic ? pomimo że pokazałem ci objecdumpy ? z AVR ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 paź 2017, o 13:07</p><hr />
]]></content>
</entry>
</feed>