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



Teraz jest 28 mar 2024, o 21:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 31 mar 2020, o 08:59 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Hej wszystkim.

Piszę program, w którym te same funkcje wykonują się wiele razy dla innych danych wejściowych, więc chce go nieco uprościć, wstawiając do struktur wskaźniki na funkcje (ala metody) oraz tworząc coś na kształt instancji. Tu pojawił się problem ponieważ z tego co wiem C nie wspiera tego typu operacji i trzeba to robić na piechotę.

To co chce osiągnąć wyglądało by jak kod poniżej, gdyby nie to, że nie mogę wykorzystać typu Buffer_t jako argument wskaźnika na funkcję bool (*ReadFilteredSample)(signed _Fract* , Buffer_t*) w deklaracji struktury ponieważ to definicja Buffer_t więc kompilator nie będzie wiedział co tam wstawić.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Alternatywą jest przerobienie funkcji bool ReadFilteredSample(signed _Fract* , Buffer_t*) na bool ReadFilteredSample(signed _Fract* , void*) i rzutowanie wewnątrz funkcji wskaźnika void* na wewnętrzną zmienną typu Buffer_t*.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Moje pytanie brzmi czy da się to zrobić nieco prościej bez wskaźnika typu void i rzutowania różnych typów na siebie - wydaje mi się że jest to mało bezpieczne rozwiązanie.

Z góry dzięki za wszelkie rady!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 mar 2020, o 09:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

abel11 napisał(a):
czy da się to zrobić nieco prościej bez wskaźnika typu void i rzutowania różnych typów na siebie

Deklarujesz typ przed jego definicją:

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: 31 mar 2020, o 09:41 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Dzięki za radę.
Niestety tą metodą otrzymam konflikt typów, przez słowo kluczowe typedef ta opcja nie wchodziła w gre wcześniej. Być może coś mi umknęło i da się to obejść w ten sposób tylko jeszcze nie wiem jak.

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


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


edit:
Nie dodałem w pierwszym poście informacji o C w wersji C99



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 mar 2020, o 09:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

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


lub

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: 31 mar 2020, o 10:23 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

O coś takiego mi chodziło tyle, że pomimo kompilacji bez błędów na koniec dostaje komunikat jak niżej - dlatego wcześniej odrzuciłem ten pomysł i poszedłem w wskaźniki (na których nie dostaje tego błędu). Może coś jest skopane w ustawieniach projektu, bo nie chce mi się wierzyć, że wpadłeś na identycznie błędny pomysł jak ja.
Sprawdzę ustawienia projektu i zobaczę czy dalej będzie generowało uszkodzonego hex'a.

Obrazek

------------------------ [ Dodano po: 50 minutach ]

Na starszej wersji kompilatora rozwiązanie zaproponowane przez kolegę fofex działa poprawnie, na nowszej ciągle otrzymuje błąd z hex'em - poszedł ticket do MCP.
Dzięki za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 kwi 2020, o 07:38 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Otrzymałem odpowiedź w sprawie hex error, umieszczam ją tu dla porządku.

Środowisko:
MPLAB X ver 5.30, kompilator XC16 ver 1.50

Problem:
MPLAB X ver 5.30 po skopiowaniu projektu może generować błąd niewykonalnego/nieistniejącego hex'a.

Rozwiązanie:
Zmusić MPLAB X do ponownego wygenerowania nbproject/Makefile-default.mk, np. poprzez usunięcie go lub przełączenie kompilatora na inną wersję (można wrócić do najnowszej po przeładowaniu projektu).



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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