ATNEL tech-forum
https://forum.atnel.pl/

Prośba o pomoc w zrozumoeniu działania struktury
https://forum.atnel.pl/topic22567.html
Strona 1 z 1

Autor:  miki53 [ 19 wrz 2019, o 17:53 ]
Tytuł:  Prośba o pomoc w zrozumoeniu działania struktury

Witam wszystkich serdecznie

Walczę z strukturami w moim projekcie i doszedłem metodą prób i błędów do oczekiwanego
rezultatu ale w inny sposób niż podpowiadany przez kolegów i chciałbym to zrozumieć
dlaczego mój sposób działa ( mimo że nie wiem dlaczego działa ) czy to zasługa funkcji
czy struktury

Przedstawiam kod dla lepszego zrozumienia


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


PLIK C

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


MAIN .C

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


Wyświetlone błędy

make all
'Building file: ../main.c'
'Invoking: AVR Compiler'
avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=11059200UL -MMD -MP -MF"main.d" -MT"main.o" -c -o "main.o" "../main.c"
../main.c: In function 'main':
../main.c:61:1: error: too many arguments to function 'sterowanie_wyj'
sterowanie_wyj (&datetime,&wyj_1, 17,48,0,1, 17,48,30,1);
^
In file included from ../main.c:15:0:
../STER_WY/ster_wy.h:37:7: note: declared here
void sterowanie_wyj( TDATETIME * dt, TWYJ_PORT * al );
^
../main.c:62:1: error: too many arguments to function 'sterowanie_wyj'
sterowanie_wyj (&datetime,&wyj_2, 17,49,0,2, 17,49,30,2);
^
In file included from ../main.c:15:0:
../STER_WY/ster_wy.h:37:7: note: declared here
void sterowanie_wyj( TDATETIME * dt, TWYJ_PORT * al );
^
../main.c:63:1: error: too many arguments to function 'sterowanie_wyj'
sterowanie_wyj (&datetime,&wyj_3, 17,48,0,1, 17,48,30,1);
^
In file included from ../main.c:15:0:
../STER_WY/ster_wy.h:37:7: note: declared here
void sterowanie_wyj( TDATETIME * dt, TWYJ_PORT * al );
^
../main.c:64:1: error: too many arguments to function 'sterowanie_wyj'
sterowanie_wyj (&datetime,&wyj_4, 17,49,0,2, 17,49,30,2);
^
In file included from ../main.c:15:0:
../STER_WY/ster_wy.h:37:7: note: declared here
void sterowanie_wyj( TDATETIME * dt, TWYJ_PORT * al );
^
../main.c:65:1: error: too many arguments to function 'sterowanie_wyj'
sterowanie_wyj (&datetime,&wyj_5, 17,48,0,1, 17,48,30,1);
^
In file included from ../main.c:15:0:
../STER_WY/ster_wy.h:37:7: note: declared here
void sterowanie_wyj( TDATETIME * dt, TWYJ_PORT * al );
^
../main.c:66:1: error: too many arguments to function 'sterowanie_wyj'
sterowanie_wyj (&datetime,&wyj_6, 17,49,0,2, 17,49,30,2);
^
In file included from ../main.c:15:0:
../STER_WY/ster_wy.h:37:7: note: declared here
void sterowanie_wyj( TDATETIME * dt, TWYJ_PORT * al );
^
../main.c:67:1: error: too many arguments to function 'sterowanie_wyj'
sterowanie_wyj (&datetime,&wyj_7, 17,48,0,1, 17,48,30,1);
^
In file included from ../main.c:15:0:
../STER_WY/ster_wy.h:37:7: note: declared here
void sterowanie_wyj( TDATETIME * dt, TWYJ_PORT * al );
^
../main.c:68:1: error: too many arguments to function 'sterowanie_wyj'
sterowanie_wyj (&datetime,&wyj_8, 17,49,0,2, 17,49,30,2);
^
In file included from ../main.c:15:0:
../STER_WY/ster_wy.h:37:7: note: declared here
void sterowanie_wyj( TDATETIME * dt, TWYJ_PORT * al );
^
make: *** [main.o] Błąd 1

18:07:46 Build Finished (took 282ms)
*****************************************************************
A teraz mój kod działający

mimo że nie ma wskażników w IFACH

PLIK H

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


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


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


Moja pytanie jest następujące dlaczego w ifach gdy zastosuję wskażniki al-> on_hh , al-> on_mm itd
to ten kod nie działa
A ten fragment kodu powinien działać tak jak z wskażnikem dt-> hh

A druga wersja działa mimo że nie ma wskażników i wygląda to tak jakby to robiła funkcja a nie struktura
( zmienne są pobierane z funkcji a nie z struktury )
i tego nie rozumiem

***************************************************************************
Teraz prośba druga
jak doprowadzić do ustawiania czasów włączania portów sterujących za pomocą menu na LCD ?
prosiłbym o podpowiedzi które pomogłyby mi rozwiązać ten supełek

Autor:  mirekk36 [ 19 wrz 2019, o 18:17 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Ja bym z chęcią podpowiedział ale gdybyś pokusił się o wyekstrachowanie problemu - powiedz mi - po jakiego grzyba włączasz do przykładowego kodu żeby pokazać swój problem - jakieś hektolitry kodu ... i dziesiątki plików ? Nie mówię tego broń Boże złośliwie czy w nerwach ale chcę ci tylko podpowiedzieć, że właściwe wyizolowanie problemu - często pomaga nawet żeby samemu go rozwiązać ...

Dlaczego nie stworzysz dla pokazania przykładu pojedynczego przykładu w jednym pliku main.c, gdzie będzie typedef struktury i poza funkcją main() jakaś inna do której ew przekazujesz jakieś wskaźniki ... ?

Polecam ci takie podejście

------------------------ [ Dodano po: 2 minutach ]

chociaż tak na pierwszy rzut oka nawet w tym niby działającym przykładzie robisz dużą kaszanę DEFINIUJĄC zmienne typu strukturalnego w pliku *.H ! to niedopuszczalne w C a jeśli tak będziesz robił - to później napotkasz kolejne mega problemy

masz może Bluebooka? Jeśli tak to czytałeś rozdział o podziale projektu na pliki ? tzn jakie zasady rządzą tym podziałem ? Czy rozumiesz do końca czym różni się DEFINICJA zmiennej od jej DEKLARACJI ?

Autor:  miki53 [ 20 wrz 2019, o 07:12 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Skrócę ten przydługawy kod

Dlaczego ten kod nie działa mimo że są wskażniki w ifah ?

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


Dlaczego ten sposób działa mimo że niema wskażników w ifach ?

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

Autor:  miki53 [ 20 wrz 2019, o 10:10 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Wyszło trochę nie bardzo bo powtarzają się funkcje
to z tego powodu że było to pisane metodą wytnij wklej
z różnych plików i to na szybko

Mam nadzieję że to nie przeszkodzi w rozczytaniu kodu
Pytanie moje było dlaczego pierwszy kod nie działa mimo że
są wstawione wskażniki w ifach

a w main.c pokazuje się błąd mówiący że za dużo argumentów w tym fragmencie kodu

sterowanie_wyj (&datetime,&wyj_8, 17,49,0,2, 17,49,30,2);

Natomiast w drugim przykładzie wszystko działa mimo że wskażników nie ma w ifach

W TAKIM RAZIE DLACZEGO TO DZIAŁA ?
Czy dlatego że argumenty są pobierane z funkcji a nie z struktury ?

Jak to powinno właściwie być ?
Przeglądałem poradniki i opisy w książkach ale nie mogę załapać :oops:

Autor:  mirekk36 [ 20 wrz 2019, o 11:07 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Panie kochany - jeszcze raz - napisz że krótki przykładowy kod nawet dwa dla porównania ... z tego co napisałeś to już w ogóle nie wiadomo o co chodzi i w czym ty masz tam problem ;) istna masakra teraz - tym bardziej, że wygląda to jakbyś wkleił dwa takie same kody wyżej ... tzn w drugim inne ilości argumentów w funkcjach - kompletny misz-masz - nie obraź się.

przy takim podejściu - to nie dziw się, że każdy tu zagląda i ucieka ... żeby uzyskać pomoc - to jednak warto też się wysilić i PORZĄDNIE zadać pytanie

Autor:  miki53 [ 20 wrz 2019, o 12:40 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Proszę o cierpliwość
ale nie wiem już jak prościej mam zapytać ?

Dlaczego ten kod nie działa mimo że są wskażniki do struktury

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


Dlaczego ten kod działa skoro niema w drugiej części warunku wskażników do struktur

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

Autor:  Marhef [ 20 wrz 2019, o 12:55 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Bo w pierwszej wersji przy wywołaniu funkcji powinieneś podać jako argumenty tylko struktury a w drugiej podajesz dodatkowo elementy (chyba) jednej ze struktur.
Pierwszy się nie kompiluje, bo funkcję masz zadeklarowaną jako
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a wywołujesz
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wywołanie powinno być takie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Edit:
miki53 napisał(a):
Dlaczego ten kod działa skoro niema w drugiej części warunku wskażników do struktur

Ponieważ wartości pól struktury podajesz jawnie jako argumenty. I to na tych zmiennych opiera się działanie.

Autor:  miki53 [ 20 wrz 2019, o 13:30 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

jeśli ta funkcja odczytuje zmienne z struktury

void sterowanie_wyj( TDATETIME * dt, TWYJ_PORT * al )

ale muszę ją wywołać w ten sposób

sterowanie_wyj (&datetime,&wyj_1);

tu myślę o wywoływaniu jej z pliku main.c
to jak wtedy ustawić czas włączania i wyłączania porów sterujących

Autor:  Marhef [ 20 wrz 2019, o 13:37 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

miki53 napisał(a):
ale jak wtedy ustawić czas włączania i wyłączania porów sterujących
Ustawiając odpowiednie pola dla zmiennych wyj1, wyj2...
Swoją drogą, dziwna ta struktura. Co oznaczają pola ON_WYJ, OFF_WYJ?
Wiesz, że przy drugim sposobie nie musisz przekazywać do funkcji struktury wyj_x? I tak z niej nie korzystasz. Z przedstawionego fragmentu wynika, że w ogóle z tych struktur nie korzystasz.

Autor:  miki53 [ 20 wrz 2019, o 13:52 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Właśnie tak podejrzewam że drugi kod działa nie jako struktura lecz jako funkcja z zmiennymi zawartymi w niej
a nie w strukturze

pola ON_WYJ
pole OFF_WYJ

oznaczają zmienne portów które mają być włączone lub wyłączone

if ( (czas == alarm) && ( ON_WYJ == 1)) {
PORTD &= ~(1<<PD5);
}

if ((czas == walarm) && ( OFF_WYJ == 1)) {
PORTD |= (1<<PD5);
}

jeśli ON_WYJ = 1 to włącz port PD5
jeśli OFF_WYJ = 1 to wyłącz port PD5

Autor:  miki53 [ 20 wrz 2019, o 18:35 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Czy ta struktura jest dobrze napisana ?
jeśli nie to jak ją poprawnie napisać

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

Autor:  rudy.ini [ 20 wrz 2019, o 19:31 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

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


i kod w pliku c:

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

Autor:  miki53 [ 21 wrz 2019, o 14:21 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

jak ustawiać czasy włączania i wyłączania każdego portu niezależnie

jak z tego wyjść

void test(void)
{
//najpierw trzeba zainicjowac strukturke TWYJ_PORT
init_port(&strTWYJ_PORT1,1,2,3,4,5,6,7,8);
//a tak ja mozna wykorzystac
sterowanie_wyj(&strDateTime, &strTWYJ_PORT1);
}
i doprowadzić do miejsca w którym mógłbym ustawiać godziny , minuty i porty które mają się włączyć

tak jak było w tym fragmencie kodu
sterowanie_wyj (&datetime,&wyj_1, 17,49,0,2, 17,49,30,2);
w nim ustawiam dla wyjścia 1 godziny,minuty,sekundy,nr portu który ma się włączyć - po tej stronie czasy wyłączania portu

proszę o cierpliwość chcę zrozumieć
A widzicie że jestem zielony jak szczypiorek na wiosną

Autor:  miki53 [ 21 wrz 2019, o 18:52 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Jak w tej strukturze byłoby rozwiązane ustawianie parametrów
sterujących 8 portami ( jak je wpisywać ) ?
Czy każdy port który chcemy ustawić musi mieć osobną funkcję ?

Autor:  Wirnick [ 21 wrz 2019, o 20:15 ]
Tytuł:  Re: Prośba o pomoc w zrozumoeniu działania struktury

Tablice, struktury(rekordy), unie i pola bitowe to zdefiniowane pola pamięci mikroprocesora. Struktury można napełniać danymi lub je odczytywać - nic więcej. Odczytaną daną z tablicy, struktury, unii poprzez odpowiednią funkcję możesz przesłać na porty równoległe(np. LCD), szeregowe(RS232). Książka BB lub poradniki wiele by Ci wyjaśniły zagadnienie.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/