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



Teraz jest 27 kwi 2024, o 23:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 14 sty 2021, o 17:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Witam

Mam takie pytanie, może banalne, ale się zakopałem w tym.
Mamy taką strukturę:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Powołujemy do życia tablicę złożoną z takich struktur:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Następnie deklarujemy funkcję do której przekazywany będzie wskaźnik na powyższą tablicę struktur:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pragnę zauważyć, że deklaracja jest identyczna do tej, gdyby do funkcji przekazywać wskaźnik nie na tablicę ale na samą pojedynczą strukturę.
Ale jest to analogiczna deklaracja do sytuacji gdy do funkcji przekazujemy string tekstowy (wskaźnik do tablicy char * s).
W przypadku gdy przekazujemy wskaźnik na pojedyncza strukturę, sprawa jest oczywista, np:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jednak jak przekazać wskaźnik do tablicy struktur typu DSData?
I jak odwołać się do wartości poszczególnych elementów tej tablicy i poszczególnych pól w strukturze?

Pozdrawiam serdeczenie
Wszystkiego dobrego w Nowym Roku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 sty 2021, o 18:48 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Zobacz to co kiedyś sobie skrobnąłem
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.


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


Nie wiem czy o to Ci chodziło ale podaje szkielet
objekt_regulacji[] to twój DS_array[]


Autor postu otrzymał pochwałę

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 sty 2021, o 20:24 
Offline
Użytkownik
Avatar użytkownika

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

sq8dsr napisał(a):
Jednak jak przekazać wskaźnik do tablicy struktur typu DSData?

Tak jak zrobiłeś. Tyle że kompilator nie ma informacji o wielkokści tablicy więc trzeba dodać drugi parametr.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Alternatywnie można wstawić wielkość tablicy w argumencie ale będze to bardzo nieelastyczne bo do funkcji będzie można przekazać tablicę o tylko takiej wielkości.


Autor postu otrzymał pochwałę

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2021, o 23:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Jeszcze mam kolego jedno pytanie. Otóż, tak jak napisałeś:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Przekazujemy wskaźnik do wskaźnika. Sytuacja jest analogiczna jak przy tablicy dwuwymiarowej.
Utworzyłem taką funkcję:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Jednak kompilator wywala warning "warning: passing argument 1 of 'DS_process' from incompatible pointer type"

Gdzieś robię jakiś durny błąd....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sty 2021, o 01:44 
Offline
Moderator
Avatar użytkownika

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

sq8dsr napisał(a):
//w nagłówku funkcji jest DSData ** array czyli przekazujemy wskaźnik do wskaźnika

Moim zdaniem ... ale przemyśl to ... jest to bardzo przekombinowane przekazywanie wskaźnika ... bo ...

Po jakiego grzyba przekazywać do jakiejś funkcji wskaźnik na całą (GLOBALNĄ) tablicę ? .... to się mija z celem !

Owszem - dla podniesienie skilla i większego hardcora - można tak się bawić ale po co ?

.... czasem warto przemyśleć ogólnie działanie całego softu ...

bardziej użyteczne jest przekazywanie wskaźnika do konkretnego elementu takiej tablicy ! ... i wtedy twój przykład zadziała dobrze ... o ile poprawnie przekażesz argument


... a jak się uprzesz przekazać wskaźnik do tablicy wskaźników ? ... no można ... ale po co ? .... ot takie krótkie 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: 16 sty 2021, o 09:53 
Offline
Użytkownik
Avatar użytkownika

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

Po co? To kwestia potrzeb i wybraźni ;-). Na przykład dla przeszukiwania tablicy

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


(NB. Jest fajna funkcja do przeszukiwania tablic w bibliotece standardowej ale wymaga jej posortowania więc nie zawsze się nadaje.)

...ale rzeczywiście przekazywanie do funkcji DS_process całej tablicy nie ma sensu (i narusza zasadę hermetyzacji).

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

Warning bierze się stąd że w nagłówku funkcji pierwszy arg to wskaźnik do wskaźniaka a w wywołaniu przekazujesz wskaźnik - typy są niezgodne.

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sty 2021, o 10:24 
Offline
Moderator
Avatar użytkownika

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

fofex napisał(a):
ale rzeczywiście przekazywanie do funkcji DS_process całej tablicy nie ma sensu.

Szczególnie jeśli tablica jest globalna...

ja bym lepiej autora zapytał co chce uzyskać - bo wtedy łatwiej podpowiedzieć w jaki sposób można tego dokonać

_________________
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: 16 sty 2021, o 17:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Myślę, że takie programistyczne wygibasy wyrosły w mojej głowie na skutek fascynacji strukturami, obiektami i dziwnymi deklaracjami, dziwnych wskaźników :P
Oczywiście, ze można się zastanawiać na tym czy jest sens. Faktycznie, za bardzo to zawinięte i forma przerosła treść hahahah
Ale w sumie dobrze by było wiedzieć jak coś takiego zrobić, w sensie takim by wiedzieć czemu jest Warning.
Na pewno to podnosi skilla, to też fakt.

Sens ogólny był taki, że czujników DS będzie kilka ich liczba w różnym czasie może być różna, więc chciałem właśnie
uniezależnić program od ich ilości.
Oczywiście to można na wiele sposobów zrobić.



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 1 gość


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