Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 18 kwi 2024, o 18:23


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 6 maja 2018, o 07:54 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

wachcio napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jeśli zrobisz w ten sposób, w momencie wywołania funkcji zostaje utworzona (na stosie) kopia struktury, którą przekazałeś jako argument 'sekcja'. Wszystkie zmiany dokonywane wewnątrz funkcji wykonywane są na tej kopii, a nie bezpośrednio na przekazanej strukturze. Kiedy funkcja się zakończy dane zawarte w zmiennej lokalnej funkcji sprawdz_sekcje() (lub inaczej w argumencie) 'sekcja' zostają utracone, a wartości pól struktury przekazanej do funkcji pozostają niezmienione.

Jeśli chcesz, żeby funkcja zmieniała bezpośrednio pola struktury przekazanej jako argument, musisz zrobić to poprzez wskaźnik:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wachcio napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Kiedy warunek ( datetime.ss == 0 ) jest spełniony zostają wykonane instrukcje wewnątrz bloku warunkowego, więc również m.in. sekcja.stan = 1;
W związku z tym uart_putint( sekcja.stan, 10 ); zwróci prawidłowy wynik.
Jednak po wykonaniu tego bloku instrukcji warunek ( datetime.ss == 1 ) nie jest jeszcze spełniony.
Funkcja kończy swoje działanie i dane zmiennej lokalnej sekcja zostają utracone.
Warunek ten będzie spełniony dopiero przy kolejnym obiegu pętli głównej i kolejnym wywołaniu funkcji sprawdz_sekcje().
Wtedy jednak zmienna lokalna sekcja ponownie zostanie zainicjowana danymi zmiennej globalnej z tablicy struktur sekcja[i], która przecież w poprzednim wywołaniu funkcji nie została zmieniona, więc nadal będzie wynosiła -1.

Reasumując, jeśli zrobisz to tak jak pokazałem (poprzez wskaźnik), powinno być OK, choć nie analizowałem kodu szczegółowo, więc nie mogę wykluczyć innych błędów.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2018, o 09:46 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Nie można definiować długości tablicy przy użyciu zmiennych. Użyj literałów:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2018, o 12:18 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

no panie kolego panie kolego ... podstawy się jednak kłaniają ;) - to ty chcesz DEFINICJE zmiennych w plikach nagłówkowych *.h dawać ?

DEFINICJE dajesz do jakiegoś pliku *.c
ich DEKLARACJE do pliku *.h

i ten plik *.h inkludujesz tam ... czyli w tych plikach *.c w których masz korzystać z tychże zmiennych

------------------------ [ Dodano po: 1 minucie ]

Masz Bluebooka - wróć może do niego - do rozdziału gdzie pokazuję podział projektu na pliki z przykładami ... tam masz to jasno przedstawione. Bo cosik mi się wydaje, że pewnie zapomniałeś czym różni się DEKLARACJA od DEFINICJI zmiennej - a zawsze powtarzam, że wtedy są same problemy z myśleniem - "co gdzie umieścić" ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2018, o 14:22 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

wachcio napisał(a):
Chodziło mi o to, że DL_TAB mogę użyć do określenia wielkości tablicy struktur ale aby korzystać z wyliczeń w innych plikach (np. z pętli for) zdefiniowałem nową zmienną dl_tab która ma jednakową wartość co DL_TAB


Nie musisz definiować żadnej zmiennej. Fragment:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
nie umieszczaj w pliku "main.c" tylko w pliku "komunikaty.h". DL_TAB będzie wtedy dostępne w każdym pliku *.c, w którym dołączysz ten plik dyrektywą include:
#include "komunikaty.h"

Jeśli w jakimś pliku *.c będziesz używał pętli do obsługi tablicy struktur, to przecież i tak musisz dołączyć do niego plik nagłówkowy "komunikaty.h", ponieważ zawiera on definicję struktury.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2018, o 14:46 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

wachcio napisał(a):
Mirek ale zgodnie z tym co pisałem w pierwszym poście strukturę mam zadeklarowaną w pliku komunikaty.h. W ostatnim poście to kawałek main.c

A ja napisałem, że strasznie mieszasz i warto to uporządkować jak się należy wg tego co masz np w Bluebooku.

Ale może kolega andrews lepiej to uzmysłowi tobie - bo to TO dokładnie chodzi

------------------------ [ Dodano po: 1 minucie ]

andrews napisał(a):
Jeśli w jakimś pliku *.c będziesz używał pętli do obsługi tablicy struktur,

a jeśli to jakieś wielkie struktury to warto w ogóle dać im nowe życie logiczne w nowym pliku jeśli chodzi o ich definicje czyli np w

komunkaty.c

zaś ich deklaracje w

komunikat.h

i później TAK JAK MÓWIŁEM wcześniej inkludować sobie wszędzie te: komunikaty.h - no w czym problem ? To się załatwia w 5 SEKUND ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO