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

Wskaźnik i funkcja w strukturze
https://forum.atnel.pl/topic22979.html
Strona 1 z 1

Autor:  abel11 [ 31 mar 2020, o 08:59 ]
Tytuł:  Wskaźnik i funkcja w strukturze

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!

Autor:  fofex [ 31 mar 2020, o 09:17 ]
Tytuł:  Re: Wskaźnik i funkcja w strukturze

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.

Autor:  abel11 [ 31 mar 2020, o 09:41 ]
Tytuł:  Re: Wskaźnik i funkcja w strukturze

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

Autor:  fofex [ 31 mar 2020, o 09:51 ]
Tytuł:  Re: Wskaźnik i funkcja w strukturze

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:  abel11 [ 31 mar 2020, o 10:23 ]
Tytuł:  Re: Wskaźnik i funkcja w strukturze

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.

Autor:  abel11 [ 3 kwi 2020, o 07:38 ]
Tytuł:  Re: Wskaźnik i funkcja w strukturze

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).

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