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



Teraz jest 30 sty 2026, o 13:29


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 28 lip 2016, o 11:58 
Offline
Moderator
Avatar użytkownika

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

mpo napisał(a):
Co robię źle?

Robisz źle to, że przecież sam zobacz, upraszczam twój kod:

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


Przecież ty nie sprawdzasz tu operatorem sizeof rozmiaru struktury tylko ? no jak myślisz ? ;) rozmiar panie kochany wskaźnika i pewnie się dziwisz dlaczego wychodzi ci 2. Dwa bo wskaźniki są dwubajtowe .... sizeof nie obliczy rozmiaru struktury na podstawie wskaźnika więc albo przekaż rozmiar ręcznie albo użyj sizeof( pixel_t )

------------------------ [ Dodano po: 3 minutach ]

Przy okazji zastanów się na przyszłość dla lepszej przejrzystości kodu nad nadawaniem porządnych nazw typów gdy definiujesz strukturę, bo teraz to można powiedzieć, że jest bajzelek w kodzie ... Ja bym dał nazwę typu

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


później gdy definiuje się zmienną albo podaje jako argument to ładnie widać

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


nieprawdaż ? ;)

_________________
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: 28 lip 2016, o 12:16 
Offline
Użytkownik

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

sizeof() to operator rozmiaru. Obliczenie rozmiaru dokonywane jest na etapie kompilacji, więc nie da się określić rozmiaru na podstawie wskaźnika przekazywanego do funkcji, który przecież może wskazywać na obiekty o różnym rozmiarze, więc na etapie kompilacji nie da się ustalić rozmiaru tablicy przekazanej do funkcji.

Jeśli tablica ma zawsze ten sam rozmiar można zadeklarować funkcję tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a jeśli rozmiar wskazywanej tablicy będzie zmienny, można użyć dodatkowego parametru z rozmiarem:
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: 28 lip 2016, o 12:38 
Offline
Moderator
Avatar użytkownika

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

mpo napisał(a):
Właśnie sizeof(pixel_t) da w wyniku 2.

Nigdy w życiu ;) jak podasz nazwę typu do sizeof() to dostaniesz rozmiar struktury w bajtach ... AAAAAAAAAA sorry dopiero teraz zobaczyłem że chodzi jeszcze o tablicę struktur ;) to przepraszam ... wtedy pozostaje ręczne przekazanie rozmiaru jako dodatkowy argument funkcji. A wyżej kolega andrews pokazał nawet jak to zrealizować również z sizeof.

jeśli masz oczywiście własną konwencję nazw to ok - nie było mojej uwagi ;)

_________________
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: 28 lip 2016, o 12:45 
Offline
Użytkownik

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

mpo napisał(a):
Właśnie sizeof(pixel_t) da w wyniku 2.
Taki szczegół dla ścisłości, sizeof(pixel_t*) da w wyniku 2, podobnie jak sizeof(node). Z kolei sizeof(*node) będzie równoznaczne z sizeof(pixel_t).

mpo napisał(a):
Czy jest sposób aby to jakoś wyłuskać bez przekazywania funkcji "na chama" tej informacji?
Obawam się, że nie ma. Funkcja void draw_polygon(pixel_t *node) na etapie kompilacji nie wie nawet, że node to wskaźnik do tablicy (jak już chyba sam zauważyłeś, sizeof(*node) zwraca wartość rozmiaru tylko jednego jej elementu).

Jak Cię nuży pisanie: "polygon1, sizeof(polygon1)/sizeof(pixel_t)" bo za długie, zawsze możesz sobie stworzyć makro preprocesora, które będzie robić to za Ciebie.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lip 2016, o 13:37 
Offline
Moderator
Avatar użytkownika

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

a próbowałeś tak?

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


bo jakoś tak troszkę zakręcone było to co robisz - tak mi się wydaje no ale jak działa to działa ;)

_________________
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: 28 lip 2016, o 14:40 
Offline
Moderator
Avatar użytkownika

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

mpo napisał(a):
A jak podmieniłem swoją funkcję na tą elegancką

Jaką tam zaraz elegancką ... ot jakaś tam wersja

a jak już używasz debugera to załóż pułapkę i sprawdź czy ci do write_register(reg, val); są przekazywane poprawne wartości

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

tylko czy ty nie powinieneś zrobić tam

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


?? w pętli for (albo nawet na razie wstaw ręcznie ilość elementów dla testu)

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

sorki, że jak tak z doskoku bez dokładnego sprawdzenia i na szybko odpowiadam ale po prostu odrywam się co chwilę od innego już nużącego mnie zajęcia ...


Autor postu otrzymał pochwałę

_________________
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: 28 lip 2016, o 17:17 
Offline
Użytkownik

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

Ja bym proponował coś takiego:
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: 28 lip 2016, o 19:08 
Offline
Użytkownik

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

mpo napisał(a):
A jaka jest zaleta wyciągania danych ze struktury w zewnętrznej funkcji, bo nie dostrzegam
Nie wiem do czego używasz funkcji write_registers() (do tej funkcji przekazywałeś elementy struktury w swoim przykładzie), więc trudno mi się w tej kwestii wypowiadać. Jeśli jest Ci tak wygodniej, to możesz rozbić strukturę we funkcji regs_set() i przekazać do funkcji write_registers() jej poszczególne składniki (tak, jak to miałeś zrobione):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wielkiej różnicy nie będzie, gdzie to będziesz rozbijał, gdzieś i tak musisz.

Zrobiłem tak, bo według mnie jest czytelniejsze przekazanie do funkcji wskaźnika na strukturę, niż poszczególnych elementów. Być może jest i szybsze (nie sprawdzałem), bo przekazujesz 2 bajty (wskaźnik) zamiast 3 bajtów (rozmiar struktury). W tym przypadku to nie ma większego znaczenia, ale zastanów się, co by było, gdyby struktura zawierała więcej elementów (może nawet jakąś tablicę) i chciałbyś je wszystkie osobno przekazywać do funkcji write_register()... Odpowiedz sobie sam ;)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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