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



Teraz jest 28 mar 2024, o 18:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 19 wrz 2019, o 17:53 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2019, o 18:17 
Offline
Moderator
Avatar użytkownika

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

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 ?

_________________
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: 20 wrz 2019, o 07:12 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2019, o 10:10 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

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:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2019, o 11:07 
Offline
Moderator
Avatar użytkownika

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

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

_________________
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: 20 wrz 2019, o 12:40 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2019, o 12:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2019, o 13:30 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2019, o 13:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2019, o 13:52 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2019, o 18:35 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2019, o 19:31 
Offline
Użytkownik

Dołączył(a): 21 lip 2014
Posty: 28
Pomógł: 4

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 postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2019, o 14:21 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

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ą



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2019, o 18:52 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 408
Lokalizacja: Puck
Pomógł: 7

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ę ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2019, o 20:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

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.



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: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO