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



Teraz jest 20 kwi 2024, o 01:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 9 lut 2023, o 11:35 
Offline
Użytkownik

Dołączył(a): 07 paź 2011
Posty: 77
Pomógł: 0

cześć
zastanawiam się jaka jest różnica pomiędzy tymi dwoma rzutowaniami.

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



Nie chodzi o to, czy to będzie jawne, czy niejawne rzutowanie. Chodzi o nawiasy.
Jak odczytać taki zapis gdzie nazwa tak jest brana w nawiasy przed nawiasem kwadratowym.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2023, o 13:41 
Offline
Moderator
Avatar użytkownika

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

Nie pogniewaj się, ale ja polecam tobie może najpierw - samemu fizycznie napisać taki kod i sprawdzić w ogóle czy to co próbujesz robić ma w ogóle jakikolwiek sens?

Bo stawiasz pytanie z tezą - jakby można było rozwiązać twoją zagadkę, którą sobie ... hmmm jakby to delikatnie powiedzieć totalnie zmyśliłeś nie wiedząc prawie w ogóle jakimi regułami rządzi się proces rzutowania. Coś tam wiesz ale nie do końca - widać po tym iście teoretycznym pytaniu.

Tymczasem sam zobacz co się dzieje po wrzuceniu tego do kompilatora, co mógłbyś sam zrobić przed zadaniem tego pytania i już dalej byś go przynajmniej w ten sposób nie zadawał albo sam byś sobie odpowiedział na swoje pomysły - proszę zrobiłem to za ciebie:

Obrazek

widzisz ? w konsoli zaś masz informację jak byk podaną o totalnym błędzie:

Obrazek

więc jaki wniosek z tego płynie dla ciebie - jeśli chodzi o wątpliwości jakie opisujesz wyżej ?

------------------------ [ Dodano po: kilkunastu sekundach ]

Slawek napisał(a):
Jak odczytać taki zapis gdzie nazwa tak jest brana w nawiasy przed nawiasem kwadratowym.

chodzi mi szczególnie o to twoje pytanie, bo odpowiedź nasuwa się sama - ale jeśli jej nadal nie dostrzegasz to śmiało pisz ... rozjaśnimy to ;)

_________________
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: 9 lut 2023, o 21:12 
Offline
Użytkownik

Dołączył(a): 07 paź 2011
Posty: 77
Pomógł: 0

Nie obraź się ale wiem dlaczego pytam. Znalazłem taki przykład na githubie. Wstawiłem tylko fragment że swoimi testami i zadałem proste pytanie jak to odczytać. Wiem że się to nie kompiluje. Nie chciałem też wstawiać setki linii bo szanuje czas czytających. W sumie pytanie powinno paść jak odczytać linę kodu
zm = ((uint16_t )tab)[1];



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2023, o 21:25 
Offline
Moderator
Avatar użytkownika

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

Slawek napisał(a):
Znalazłem taki przykład na githubie.

Nie obraź się ale jak znajdziesz na githubie zapis typu:

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


to też będziesz pytał jak należy to odczytać??? skoro kompilator ci podpowie

Obrazek

że to wierutna bzdura i błąd ?

Tak samo w twoim przypadku kompilator ci podpowiada

Obrazek

.... ok ja rozumiem, że można nie znać angielskiego - ale wystarczy wziąć BYLE pierwszą lepszą stronę do translacji z angielskiego na polski żeby sobie przetłumaczyć komunikat kompilatora: "error: subscripted value is neither array nor pointer nor vector"

Obrazek

skoro zatem widzisz, że "błąd: wpisana wartość nie jest ani tablicą, ani wskaźnikiem, ani wektorem" to naprawdę nic tobie to nie mówi??? i nadal będziesz się upierał o to o co pytasz? skoro to taka sama bzdura jak wyżej podałem ci przykład? Skoro kompilator nie może tego skompilować i podaje ci jak BYK na talerzu błąd - to ty będziesz się upierał że skoro widziałeś to na githubie to jest to prawda objawiona i da się to inaczej interpretować niż potrafi kompilator C ???? No proszę cię zastanów się chociaż chwilę nad tym co piszesz. Jeszcze żeby to był zapis który generuje jedynie WARNING a nie error - to można byłoby sobie dyskutować - co to oznacza i o czym ostrzega kompilator, ale w tym wypadku - jeszcze raz się powtórzę - masz ERROR a nie warning, error jak BYK!

Tym bardziej, że być może nawet widziałeś tam inny zapis i się np pomyliłeś i tu wstawiłeś inny

_________________
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: 10 lut 2023, o 10:09 
Offline
Użytkownik

Dołączył(a): 25 lut 2022
Posty: 39
Pomógł: 6

Slawek napisał(a):
W sumie pytanie powinno paść jak odczytać linę kodu
zm = ((uint16_t )tab)[1];

Nie ma sensownego wyniku dla tego działania, więc trudno tu cokolwiek powiedzieć.
Jesteś pewien, że nie brakuje gwiazdki?
zm = ((uint16_t*)tab)[1];
Takie wyrażenie jest prawidłowe, czasem nawet sensowne i działa tak: wskaźnik na liczbę ośmiobitową jest rzutowany na wskaźnik na liczbę 16 bitową, następnie operator indeksowy zgodnie z arytmetyką wskaźników zwraca liczbę 16 bitową złożoną z zawartości 2 i 3 komórki tablicy "tab". Przy architekturze little endian komórka 2 będzie młodszym a 3 starszym bajtem czyli otrzymamy liczbę 1027, przy big endian otrzymamy 772. Dla indeksu większego niż (sizeof(tab)-1)/2 nastąpi wyjście poza zakres tablicy i otrzyma się śmieci lub nastąpi wyjątek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2023, o 15:16 
Offline
Użytkownik

Dołączył(a): 09 paź 2016
Posty: 71
Lokalizacja: Olsztyn
Pomógł: 1

O, i to jest KONKRETNA odpowiedź.
Tylko czy na pewno: (sizeof(tab)-1)/2 ?
Z tablicy n elementów można zrobić n-1 par.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2023, o 22:11 
Offline
Użytkownik

Dołączył(a): 25 lut 2022
Posty: 39
Pomógł: 6

Wskaźnik jest inkrementowany/dekrementowany o sizeof(*ptr) bajtów więc tak, na pewno. (Z tym że max index to max(sizeof(tab)/2-1,0) a nie jak wyżej).
Dostęp bajt po bajcie (pomijam kwestię sensowności) tak:
zm = *(uint16_t*)&tab[1];
Z tym że dostęp do niewyrównanej danej może być mniej wydajny lub wręcz zakończyć się wyjątkiem (zależy od architektury mikrokontrolera).



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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