<?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=4&amp;t=1701&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-11-08T22:55:06+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1701&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-08T22:55:06+01:00</updated>
<published>2014-11-08T22:55:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102964#p102964</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102964#p102964"/>
<title type="html"><![CDATA[Re: Specyfikator extern]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102964#p102964"><![CDATA[
no dokładnie tak<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 lis 2014, o 22:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2014-11-08T22:42:12+01:00</updated>
<published>2014-11-08T22:42:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102962#p102962</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102962#p102962"/>
<title type="html"><![CDATA[Re: Specyfikator extern]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102962#p102962"><![CDATA[
Chodzi mi o czysto teoretyczną sytuację dla jednej zmiennej. Nazwy plików podałem przykładowe. <br />Wiem, że jeżeli mammy kilka zmiennych to lepiej jest utworzyć pliki 'common'. <br />Ale dla jednej zmiennej, to raczej nie ma sensu tworzenia common i lepiej jest użyć 'extern' ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 8 lis 2014, o 22:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-08T18:36:34+01:00</updated>
<published>2014-11-08T18:36:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102924#p102924</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102924#p102924"/>
<title type="html"><![CDATA[Re: Specyfikator extern]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102924#p102924"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Jeżeli w innym pliku powiedzmy ds18b20.c potrzebuję korzystać z jednej zmiennej x zdefiniowanej w lcd.c, to z punktu widzenia kompilatora lepiej do pliku ds18b20 dołączyć plik lcd.h ( #include &quot;lcd.h, gdzie zmienna x jest zadeklarowana) czy w pliku ds18b20 użyć extern x ?<br />Pozdrawiam.<br /></div><br /><br />Może powiedz o jaką zmienną chodzi ? bo jeśli w pliku ds18b20 korzystasz i tak z wyświetlania LCD to naturalne jest że tam zainkludujesz lcd.h<br /><br />ale jeśli ty sam dodałeś jakąś specyficzną zmienną do plików lcd i nagle okazuje się że korzystać z niej musisz w innych plikach to zastanów się czy nie warto utworzyć jakichś plików wspólnych dla wszystkich innych bibliotek np<br /><br />common.c z definicją zmiennej<br />common.h z deklaracją zmiennej<br /><br />o wtedy inkludować tam gdzie trzeba common.h - żeby było tak jakoś logicznie. Bo po co np inkludować lcd.h do ds18b20 jeśli w nim nie korzystasz z ŻADNEJ funkcji lcd ? Przy takim podejściu i przy większym projekcie będzie groch z kapustą wtedy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 lis 2014, o 18:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2014-11-08T18:30:46+01:00</updated>
<published>2014-11-08T18:30:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102921#p102921</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102921#p102921"/>
<title type="html"><![CDATA[Re: Specyfikator extern]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=102921#p102921"><![CDATA[
Witam.<br />Mam jeszcze takie pytanie odnośnie extern. <br />Są 2 pliki:<br />lcd.h oraz lcd.c <br />Jeżeli w innym pliku powiedzmy ds18b20.c potrzebuję korzystać z jednej zmiennej x zdefiniowanej w lcd.c, to z punktu widzenia kompilatora lepiej do pliku ds18b20 dołączyć plik lcd.h ( #include &quot;lcd.h, gdzie zmienna x jest zadeklarowana) czy w pliku ds18b20 użyć extern x ?<br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 8 lis 2014, o 18:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lukas]]></name></author>
<updated>2012-10-25T16:54:01+01:00</updated>
<published>2012-10-25T16:54:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=17615#p17615</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=17615#p17615"/>
<title type="html"><![CDATA[Re: Specyfikator extern]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=17615#p17615"><![CDATA[
Tak, teraz już rozumiem. Wróciłem jeszcze raz do tego miejsca w książce i wszystko stało się już jasne. Dziękuję za wytłumaczenie <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=554">Lukas</a> — 25 paź 2012, o 16:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-25T12:25:23+01:00</updated>
<published>2012-10-25T12:25:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=17593#p17593</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=17593#p17593"/>
<title type="html"><![CDATA[Re: Specyfikator extern]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=17593#p17593"><![CDATA[
Ależ nic się nie wyklucza <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Ja bym nawet tylko nieco uściślił swoją wypowiedź z książki, o tak:<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Poprzedzenie zmiennej słowem extern informuje kompilator, że zmienna ta jest już <strong><span style="color: #0040FF">zdefiniowana</span></strong> w innym module programu<br /></div><br /><br />Ja powiedziałbym, że ta <strong>definicja</strong>, którą przytoczył kolega jest wręcz mniej precyzyjna<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Oznacza, że <span style="color: #FF0000">deklaracja nie jest deklaracją</span> w sensie fizycznym, a jedynie odwołaniem do deklaracji znajdującej się w innej jednostce kompilacji (module, pliku, bibliotece - przyp. autora). Jednym słowem, jest to sposób na poinformowanie kompilatora, <span style="color: #FF0000">by nie szukał danej zmiennej globalnej w aktualnym pliku</span><br /></div><br /><br />deklaracja nie jest deklaracją ? ... a co to ? ...... <br /><br />DEKLARACJA zmiennej z przydomkiem extern (bo tylko wtedy jest do deklaracja gdy przy zmiennej jest extern) nie jest DEFINICJĄ (i jak się tak napisze to nawet nie trzeba dodawać że &quot;w sensie fizycznym&quot;) .... Bo jak ktoś zna różnicę pomiędzy DEKLARACJĄ a DEFINICJĄ (co wałkuję wciąż w książce) to chyba jest to zrozumiałe. Ale przypomnę:<br /><br /><span style="color: #008000"><strong><span style="font-size: 150%; line-height: normal">DEKLARACJA</span></strong> - nie rezerwuje miejsca w pamięci na zmienną lub funkcję</span><br /><br /><span style="color: #0040FF"><strong><span style="font-size: 150%; line-height: normal">DEFINICJA</span></strong> - rezerwuje miejsce w pamięci na zmienną lub funkcję.</span><br /><br />No i to ostatnie zdanie:<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Jednym słowem, jest to sposób na poinformowanie kompilatora, by nie szukał danej zmiennej globalnej w aktualnym pliku<br /></div><br /><br />jest hmm lekkim nieporozumieniem wręcz. Bo pomyśl sobie, masz np plik <strong><span style="color: #0040FF">lcd.h</span></strong> w którym masz <br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">extern int zmienna; // DEKLARACJA zmiennej</div><br /><br />za to w pliku <strong><span style="color: #0040FF">lcd.c</span></strong> , w którym na początku inkludujemy lcd.h mamy właściwą DEFINICJĘ tejże zmiennej, czyli:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">int zmienna; // DEFINICJA ZMIENNEJ</div><br /><br />to pytam - jak to się ma do tego zdania ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... przecież &quot;zmienna&quot; jest w ramach tego pliku jednocześnie zmienną globalną - widoczną w całym pliku nawet gdyby nie było deklaracji w lcd.h - zgadzasz się z tym?<br /><br />a zatem co ? gdy dodamy lcd.h - to nagle kompilator co ? nie będzie szukał zmiennej globalnej w aktualnym pliku ???? sam chyba teraz widzisz to nieporozumienie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />zresztą kompilator nic nie szuka, ktoś być może nie zdaje sobie sprawy z etapów kompilacji programów w języku C....<br /><br />każdy plik *.C jest kompilowany oddzielnie, i teraz jeśli np mam plik main.c , w którym mam zainkludowany nasz lcd.h z tą DEKLARACJĄ zmiennej jak wyżej - to po PIERWSZYM etapie kompilacji w pliku przejściowym jest tylko informacja, że gdzieś w innej części programu (w innym pliku *.c nie ważne na tym etapie, wystąpi zmienna i będzie określony jej adres) ... i rzeczywiście w trakcie ostatniego procesu kompilacji jakim jest LINKOWANIE - dopiero zostają podstawiane fizyczne adresy - gdy wszystkie kawałki kodu zostają LOKOWANE w poszczególnych miejscach pamięci a jednocześnie gdy w pamięci RAM przydzielane są adresy zmiennych.<br /><br />Więc ja określiłbym przytoczoną przez ciebie definicję jako delikatnie nieprecyzyjną - ale na pewno nie wykluczającą z tym co napisałem w książce. I co więcej - nie ma to nic wspólnego z AVR , STM czy jakimkolwiek innym procesorem. Tu jest mowa o języku C całkowicie w oderwaniu jak widzisz od platformy.<br /><br />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> — 25 paź 2012, o 12:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lukas]]></name></author>
<updated>2012-10-25T12:06:07+01:00</updated>
<published>2012-10-25T12:06:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=17591#p17591</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=17591#p17591"/>
<title type="html"><![CDATA[Specyfikator extern]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1701&amp;p=17591#p17591"><![CDATA[
Witam, mam pytanie, które właściwie kieruję do Pana Mirka. Programowania w C uczyłem się z Pana pierwszej książki, teraz zająłem się nauką programowania w tym języku STM32, czytając książkę, która mi w mojej nauce pomaga natknąłem się na takie zdanie: &quot;Poprzedzenie zmiennej słowem <em>extern</em> informuje kompilator, że zmienna ta jest już zadeklarowana w innym module programu&quot;. Definicja ze strony <a href="http://4programmers.net/c/extern"  class="postlink">http://4programmers.net/c/extern</a> mówi podobnie:<br /><br /><strong>Extern</strong><br /> <div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Oznacza, że deklaracja nie jest deklaracją w sensie fizycznym, a jedynie odwołaniem do deklaracji znajdującej się w innej jednostce kompilacji (module, pliku, bibliotece - przyp. autora). Jednym słowem, jest to sposób na poinformowanie kompilatora, by nie szukał danej zmiennej globalnej w aktualnym pliku.<br /></div><br /><br />Natomiast Pan extern tłumaczy jako: &quot;przydomek extern powoduje, iż zmienne będą dostępne we wszystkich modułach, które dołączą plik nazwa.h za pomocą dyrektywy #include&quot;. jest to zdanie wycięte z pliku nagłówkowego w którym była deklaracja zmiennych poprzedzona słowem extern.<br /><br />Według mnie definicje przytoczone powyżej wykluczają się z Pana definicją, ponieważ one tłumaczą extern jako przydomek informujący, że dana zmienna została już zadeklarowana w innym module, a Pan tłumaczy, że przydomek ten sprawia, że zmienne będą dostępne w innych modułach, które dołączą plik nagłówkowy, w którym zostały zadeklarowane. Chciałem zapytać jak to jest rzeczywiście? Czy tylko dla AVR'ów jest inaczej?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=554">Lukas</a> — 25 paź 2012, o 12:06</p><hr />
]]></content>
</entry>
</feed>