Kod który cytuję, nie znaczy to, ze go pochwalam Dodano po 1 W ogóle to chyba użycie samej wartości liczbowej pozyskanej ze wskaźnika jest niezdefinowanym zachowaniem albo przynajmniej specyficzne dla platformy. Głos rozsądku. Myślę że my tu pracowicie rozwiązujemy jaki Problem XY. Różne nieformalności są wynikiem "jakiegoś" pomysłu, a nie źródłem....
Witam Kolegów, Mam prosta funkcję, której zadaniem jest zapisywanie pewnej liczby bajtów pod wskazany adres rejestru na magistrali I2C: [syntax=c] void writeRegisters(uint8_t startRegNr, uint8_t *regValues, uint8_t bytesToWrite) { i2cStart(); i2cWriteByte(DEVICE_WRITE_ADDR); i2cWriteByte(startRegNr); while(bytesToWrite--) i2cWriteByte(*(regValues++));...
Witam, Próbuje usunąć kilka warningów wyrzucanych przez kompilator, tyczących się przypisywania i inicjalizacji niewłaściwych typów ( brak rzutowania ). Nie jestem jednak pewien czy dobrze wykonuje rzutowanie. Mógłby ktoś rzucić okiem? 1. Przypisanie do wskaźnika na funkcję innego typu wskaźnik na funkcję: typy wskaźników: - void (*callback)(uint8_t,uint16_t)...
Utworzyłem typ strukturalny : typedef struct Interface { int Time; BOOL Thread; unsigned char Buffer_I[100]; unsigned char Buffer_O[100]; unsigned char NumberOfBytes; unsigned char CountError; unsigned char Status; }; następnie zmienną tego typu : Interface InterfaceRS; Teraz w funkcji obsługującej wątek, chcę podać adres tablicy...
Dlaczego nie działa rzutowanie tego typu ? A mógłbyś wyjaśnić, co znaczy nie działa? Bo zazwyczaj działa... [edit] Musisz tylko pamiętać, że kompilator jest uprawniony do wyrównywania ułożenia pól w strukturach w zależności od wymagań architektury procesora. Jest prawdopodobne, że pole wskaźnika payload zostanie przesunięte w pamięci (wyrównane) do...
Czyli zostaje tylko taki potworek Tak właśnie powinno być jak napisałeś. Poza tym czemu "potworek"? Powiedziałbym, że to eleganckie wyrażenie. Widać ładnie, jak poszczególne typy kolejno "maszerują". Praktyka programowania wymusza często bardziej skomplikowane twory. Trochę jeszcze skoryguję to, co napisałem poprzednio, bo nie było to do końca poprawne....
C nie ma dynamicznych typów danych (tzn. normalnie typ danej jest ustalony w czasie kompilacji), co powoduje, że do takich zastosowań się trochę słabo nadaje. W każdym razie, ze strukturami chodzi o to, że jeżeli masz funkcje (dynamicznie zmieniające się, co uzasadnia stosowanie wskaźników) o różnych typach argumentów i różnych typach zwracanych danych,...
Witam, Piszę program i napotkałem na następujący problem: Warning133initialization from incompatible pointer type [enabled by default]... Warning134unused variable 'Wskaznik' [-Wunused-variable]... Próbowałem już wszystkiego stąd prośba do Was o pomoc. Dziękuję i pozdrawiam. Dodano po 1 Witam, Udało mi się chyba rozwiązać problem - może...
Próbowałeś wyświetlić adres przekazując wskaźnik na char do cout, ale cout interpretuje zawsze wskaźnik do char jako tekst i wyświetla tekst. Właśnie dlatego trzeba zrobić rzutowanie do (void*), żeby "przekonać" kompilator, że chcemy widzieć wartość wskaźnika. To powinno wyjasnić wszystko: [syntax=c]for(int i = 0; i < 7; i++) { cout << "wsk....
Witam, class test { public: struct a { struct b *wskaznik_b; int dana_A; }; struct b { struct a *wskaznik_a; int dana_B; }; test(); virtual ~test(); ); //------------------------------------- (...) test::b* obiektB = new test::b; test::a* obiektA = new test::a;...
Z rzutowaniem wskaźnika na strukturę na inny wskaźnik jest problem gdy struktura ma elementy różnych typów(a co za tym idzie rozmiarów). Kompilatory różnie zarządzają rozmiarem struktury.Np taka struktura: struct struktura{ int A; char B; int C; }; W programie skompilowanym pod gcc, na architekturze 64bit bez żadnych dodatkowych opcji ma rozmiar...
// tablica "napis" znajduje się w PROGMEM - w kodzie jest pgm_read_byte: OK char napis[] PROGMEM = {"test"}; // zmienna "text"również jest w PROGMEM: wywołanie fun(text.wsk) odwołuje się do złej pamięci t_text text PROGMEM = {napis}; zamień: fun( text.wsk ); na coś pokroju:...
Pozwolę sobie upewnić się. funcxxx(&s1.cde3); Funkcji zostanie przekazany adres od razu do pola cde3? I funkcja zadeklarowana jako void funcxxx(uint8_t *costam) Będzie operować na s1.cde3? Jeśli oczywiście dane pole ma ten sam typ? I dalej w funkcji jak z normalnym wskaźnikiem postępujemy? Rozumiem, że deklaracja: void funcxxx(void* *costam) uniezależnia...
Nie wiem czy dobrze rozumiem do czego dążysz ale możesz napisać coś takiego int funkcja(char *wsk) { *(wsk+3) = 2; return (int)*(wsk+3); } wywołanie char data Nie, nie o to mi chodziło. Tutaj odwołujesz się tylko do 4 elementu tablicy. Dodano po 1 Czyli to: Tym zapisem zwiększasz wartość elementów tablicy tak? A nie można było zapisać tego tak *wsk...
Są to niskie wartości adresy np. 6F0 to jest akurat adres od przeglądarki. Nie jest to adres tylko PID (process identifier). Prawdopodobnie w każdym systemie operacyjnym ogólnego przeznaczenia proces ma swoją pamięć wirtualną. Dostęp do niej (w normalnych warunkach) jest możliwy tylko dzięki systemowym funkcjom. Błąd dostajesz z tego względu, że próbujesz...
Zrób może tak: 1.Ustawiasz rzutowanie perspektywiczne i rysujesz swoją scenę, obracasz itp. nie rysujesz kursora. 2. Zmieniasz rzutowanie z perspektywicznego na ortograficzne, w OGl było z tego co pamiętam glOrtho2d- wtedy masz tylko współrzędne X i Y. 3. Pobierasz pozycję myszy, która jest pozycją 2D, przeliczasz jeżeli jest taka potrzeba na współrzędne...
Problem jest tutaj: [syntax=c]void RunNeuralNet_Classification () { ComputeFeedForwardSignals((double*)input... 100,0); ComputeFeedForwardSignals((double*)hidde... 23,1); } [/syntax] W wywołaniu funkcji masz konwersję tablicy dwuwymiarowej na jednowymiarową (rzutowanie...
Jest to rzutowanie na wskaźnik do zmiennej typu uint8_t, a nie na zmienną. Ta gwiazdka to oznaczenie wskaźnika. Samo z siebie nic nie robi, powoduje tylko, że kompilator nie rzuca ostrzeżeniem lub błędem.
Może coś takiego będzie działać, sprawdziłem tylko, że się kompiluje: // definicja tablicy wskaźników do funkcji void (*f_Function_table[])... PROGMEM = { f_1, ... f_5 } //----------- // wywołanie void (*f)(); // pośredni wskaźnik na funkcję f = (void*)(pgm_read_word(&&...
char ramka[67]; //ramka danych char* wsk_ramki = ramka; for (int i=0;i<50;i++) { *(wsk_ramki+i)=uart_getc(... //TU SIĘ RESETUJE } Ja się nie dziwię, że to się wysypuje czyli że mogą być różne efekty dziwolągowate. Po pierwsze, skoro iteracja jest od 0 do 50 , to po jakiego grzyba deklarujesz zmienną i jako...
To już łapie. Teraz przy "rzutowaniu" bo nie wiem jak to nazwać fachowo[syntax=asm]MOV AX, WORD PTR Byte4 ; <--- po wykonaniu AX = 0x0102 [/syntax] ma taką wartość bo wczytuje Byte4 ale i zahacza Byte1 bo są obie wielkości bajt. Oki lecz rodzi się kolejne pytanie. To znaczy że wskaźnik pokazuje z powrotem na Byte1 przy okazji pobierania wartości...
Przypisanie do kolejnych pól tabeli liczby 0 rzutowanej na wskaźnik do struktury K.
objaw jaknajbardziej prawidlowy. zapomniales o tym, ze jak masz komorki o adresach: 00 01 02 03 04 05 06 07 to na raz odczytac mozesz tylko pod takim warunkiem: - 1 komorke zawsze - 2 komorki na raz (16b) tylko jesli adres jest podzielny przez 2 - 4 komorki na raz (32b) tylko jesli adres jest podzielny przez 4 :) Dzięki, czekałem na potwierdzenie tej...
To rzutowanie to taka informacja, że: "to co odczytałeś spod podanego adresu jest wkaźnikiem do funkcji z takim a takim argumentem i zwracającym to i to" Dobrze? Generalnie tak. Rzutowanie w C to w zasadzie informacja dla kompilatora, że programista wie, co robi. :wink: Z tym typedef to tak: typedef unsigned char (*CallbackFuncPtr_t)(unsigne...
Spróbuj rzutowania static_cast ( ). Z powodzeniem używam go do przekazywania obiektów jak i nawet pojedynczych metod poprzez referencję między obiektami różnych klas. Oczywiście musisz pamiętać, aby metody miały do siebie uprawnienia (albo public albo np. friend), no i oczywiście, żeby obiekty obu klas istniały ;) Przy okazji, przykładowe wywołanie...
Ok, nie wiem już ile razy mam powtarzać, że to do niczego mi nie potrzebne - po prostu w pewnym momencie nie znając dokładnie tych zasad utworzyłem wskaźnik na literał .... i spotkałem się z dziwnym (ale dla mnie zachowaniem) Teraz dopiero z tej dyskusji wyniknęło skąd się to bierze i chyba każdy z was także niechcąco odpowiadając mi sam się dowiedział...
Potrzebuję znać zapis następującego wskaźnika: wskaźnik na funkcję przyjmującą wskaźnik na void, a zwracającą wskaźnik na funkcję która przyjmuje wskaźnik na void (a zwraca wskaźnik na funkcję, która przyjmuje wskaźnik na void a zwraca wskaźnik na funkcję która przyjmuje wskaźnik na void i zwraca wskaźnik na funkcję, która przymuje wskaźnik na void...
to już dawno zrobiłem, tylko rzutowanie prowadzi do takiego ostrzeżenia: warning: cast to pointer from integer of different size a tego już obejść nie potrafię.
W takich przypadkach winno się raczej stosować static_cast, tak jak próbowałeś. funkcja return_data_element() zwraca wskaźnik void Czy funkcja return_data_element() także używa static_cast do stworzenia wskanika na void* z obiektu? (stack_element->return_data_element()) - tutaj zwracany jest wskaźnik *void (dlatego użyłem nawiasu na całe wyrażenie,...
Witam wszystkich Próbuje zapisać dane wygenerowane przez program do pliku ale podczas rzutowania za pomocą reinterpret_cast wskaźnika na prostą strukturę, przykładowo: [syntax=cpp-qt] struct test { unsigned int mark; unsigned int w; unsigned int h; }; [/syntax] na wskaźnik typu char*, rezultat rzutowania ma zmieniony endian na big-endian, co jest bardzo...
Dla makr *_far wymagany jest typ uint32_t. Wskaźnik na AVR jest typem zaledwie 16-bitowym. Stąd też jeśli przekazujesz jako argument 16-bitowy wskaźnik nie ma sensu używać makr z sufiksem _far, gdzie najstarsze 16-bitów będzie miało w efekcie zawsze 0. Możesz pozbyć się ostrzeżenia korygując użyte makro, albo jawnie rzutując typy. Z drugiej strony nie...
W prosty sposób nie uda ci się tego zrobić. Ostrzeżenie można łatwo wyeliminować jwnie rzutując typ, ale to tylko maskuje problem. Musisz wiedzieć na jakiego typu zmienną wskazuje wskaźnik. Ty napisałeś kompilatorowi, że wskaźnik wskazuje na zmienną typu uint8_t. Jeśli zrobisz dereferencję wskaźnika to uzyskasz wartość o typie uint8_t. Jeśli wskaźnik...
O tyle o ile. Jeśli wskaźnik ma być użyty do danych o różnych typach można użyć wskaźnika na void [syntax=c]struct { void *ptr; } Struktura;[/syntax] Do wskaźnika void można przypisać wartość wskaźnika dowolnego typu. [syntax=c]int zmienna; Struktura.ptr = &zmienna;[/syntax] Dostęp do zmiennej wskazywanej przez wskaźnik po odpowiednim rzutowaniu: [syntax=c]*((int*)Struktura.ptr)...
Zmieniło się coś w temacie ? Przykładowo jeśli mam blok w którym na wejściu mam zadeklarowaną tablicę typu INt to w starym step7 dla s7-300 bez problemu jak podam wskaźnik do tablicy to ten numer przejdzie czyli np. P#DB1.DBX2.0 ale jeśli chcę to samo powtórzyć dla s7-1200 to niestety już to nie przechodzi. Czy poza peek/poke można jakoś inaczej podać...
typowa sytuacja rzutowania. masz komorke pamieci o adresie 0x38. poniewaz chcesz odwolac sie do tego adresu musisz LICZBE 0x38 zrzutowac na wskaznik -> (unsigned char*)0x38 poniewaz zas interesuje cie to co jest pod tym wskaznikiem, przez analogie: *wskaznik *((unsigned char*)0x38) rola volatile nie jest znana bez poznania calego programu - w kazdym...
A czym by się różniło *Ptr[0] = 66; od Ptr[0] = 66; ? Przy pierwszym kompilator (GCC) wywala błąd, że "dereferencing 'void *' pointer" i "invalid use of void expression" Różnica jest zasadnicza *ptr[0] to jak **ptr czyli tablica dwu wymiarowa natomiast zapis ptr[0] rownoważny jest *prt czyli początek tablicy jedno wymiarowej. O problemach...
Tak, 10 if'ow. Ale z tablica nie powinno być problemów. Nie wiem co zwraca makro _SFR_IO8. Spróbuj rzutować wszystkie adresy na (unsigned char *). unsigned char *CZUJNIKI_P[3]={(unsigned char *)&_SFR_IO8(0x1B),(unsigned char *)&PORTB,(unsigned char *)&THERM_3_SW_P}; I jeśli wpisujesz sam adres 0x1B to pewnie wystarczy tak jak u mnie (unsigned char *)...
Witam, Mam problem z przyrównaniem wskaźnika do struktury ze zmienną: struct { .... APS_Address_t srcAddress; ... } APS_DataInd_t; int tmp tmp=indData->srcAddress; wyrzuca mi błąd src/WSNCoord.c:247: error: incompatible types in assignment Zapewne trzeba zrobić rzutowanie, ale nie wiem jak to sie wykonuje w przypadku struktury....
Chcę zrobić biblioteki do programowania okienek To czeka Cię kupa roboty, może znajdziesz jakiś prostszy framework i zajrzysz do źródeł. W każdym razie czeka Cię nauka slotów, sygnałów i innych callback'ów. Jaka jest różnica pomiędzy reinterpret_cast<>() a rzutowaniem z C C-cast działa zależnie od kontekstu, można go użyć wszędzie. C++ wprowadza...
Tworzę nowy obiekt z klasy bazowej, następnie biorę istniejący obiekt z klasy pochodnej i rzutuję na podstawową klasę, aby wykorzystać przeładowany operator z klasy bazowej. Następnie dokładam wyświetlanie informacji, które dokłada klasa pochodna.
Masz w tym kodzie na oko z dziesięć sytuacji granicznych, które powinny być ostrzeżeniem kompilacji, albo oczy powinny to zauważyć. W pierwszym impulsie moje niepomierne zdziwienie wzbudziło wifi.send((const uint8_t*)hello, strlen(hello)); Potem zauważyłem źle zadeklarowane typy, rzutowanie aby to naprawić, itd... dziwne (kosztowne) kopiowanie w pętli...
Pytam edukacyjnie. A ta struktura ma tylko 3 pola tutaj. W rzeczywistości będzie ona zawierać całą listę dat i czasów, więc będzie duża. Edukacyjnie więc - do wypełniania w pętli służy tablica, a nie rzutowane struktury czy jakieś unie (wspomniane tutaj pomysły z uniami i type-punning są w standardzie języka opisane jako "undefined behaviour", zabronione...
To wiele wyjasnia, dziękuję bardzo. Korzystając z okazji chciałbym jeszcze zapytać o wyrażenie : *(int*)20000=7 Ja to rozumiem jako wpisanie do zmiennej typu int mieszczącej się pod adresem 20000 wartości 7. Samo (int*)20000 oznacza rzutowanie na wskaźnik do zmiennej typu int, zmienna mieści się pod adresem 20000, Dodanie gwiazdki * przed nawias powoduje...
Trochę się zmaieszałem. Pomocy :-) chodzi mi o rzutowanie wskaźnika np mam taka deklarację (uint32_t *) ?
witam ma ktoś może pomysł jak zrobić wskaźnik laserowy wyświetlający obraz na ścianie?? coś w rodzaju zabawek laserowych,które sprzedają mających nakładki do wyświetlania różnych kształtów. Z tą różnicą,że potrzebuje żeby to wyświetlało prosty obraz zaprojektowany przeze mnie ( jakiś napis albo nieskomplikowany kształt) z góry dzięki za pomoc
Ja w programach zawsze właśnie stosowałem te przykłady które pokazałeś, tego sposobu z rzutowaniem nie znałem. No taka formułka wygląda dość intrygująco :D Ogólnie to przerabiam kod usbasp, dziwne jest adresowanie pamięci zmienna 32bit, przy adresowaniu 16bit zmienną jesteśmy w stanie oprogramować mikrokontroler o pojemności 512kB, więc po co 32bit?...
W takiej sytuacji kompilator wygeneruje błąd niezgodności wskaźników. Wskaźnik na FLASH nie można niejawnie rzutować na zwykły wskaźnik. Jeśli potrzebujesz przesyłać do jednej funkcji wskaźnik na FLASH i na SRAM należy użyć __memx. Ta przestrzeń jest kompatybilna z przestrzeniami FLASH i SRAM, a kompilator generuje kod odbsługujący obie możliwości....
Idea polega na tym, że wskaźniki krążą po buforze w tym samym kierunku, tak jakby koniec bufora połączony był z początkiem, stąd nazwa "bufor cykliczny". Po dojściu do końca bufora wskaźnik przeskakuje na jego początek. Pierwszy zawsze jest wskaźnik zapisu, za nim podąża wskaźnik odczytu. Jeżeli oba wskazują na to samo miejsce to znaczy że bufor jest...
Wyjaśnię może na spokojnie: Kompilator patrząc na PINA widzi: dereferencję wskaźnika na volatile u8 spod inta rzutowanego na wskaźnik na volatile u8. Krok po kroku? "Zrób to sam" ;] - przykład dla wskaznikow 16bitowych, i 8bitowej danej: 1. Wez fizyczny adres chcianego SFRa , np. 0x6666 2. Rzutuj ten adres na wskaźnik na volatile u8: ((volatile u8*)0x6666)...
Alternatywnie możesz skorzystać z dynamicznej alokacji pamięci. Sprawdzi się szczególnie w przypadku dużych tablic. Deklarujesz najpierw typ type tZmienna = array [min...max] of jakis_inny_typ; następnie zmienną wskaźnikową rzutowaną na ten typ var zmienna = ^tZmienna; W inicjalizacji programu musisz przydzielić pamięć new (zmienna);...
"Mu?" ;-) Z pomocą operatora + możesz dodać liczbę do wskaźnika - to przesunie wskaźnik o liczba × rozmiar typu po wyłuskaniu. Oczywiście z void* nie przejdzie, bo void* nie da się wyłuskać. Ale w C tak naprawdę nie trzeba rzutować wskaźnika struktury na void*, bo w C istnieje niejawna konwersja wskaźników. Wychodzi na to, że ten wskaźnik void* jest...
Witam, na wstępie przepraszam za użycie sformuowania "Aligned writes", bo żadnen polski odpowiednik nie przychodzi mi do głowy. Jakiś czas temu udało mi się dzięki pomocy developerów Free Pascala zmusić kompilator do prawidłowego generowania kodu dla platformy Thumb2. Wszystko fajnie hula, nie muszę już się męczyć z przyswajaniem C. Mam tylko jeden...
adres należy rzutować na wskaźnik. ostatnio był podobny temat
Dziwne rozwiązanie z tym rzutowaniem wskaźnika. W STM32F1 nie było takiego kombinowania. Może jednak dane są wyrównywane do lewej, a nie jak pisze w RM do prawej. Co będzie jak dasz tak: [syntax=c]SPI1->DR = dane<<8;[/syntax]
Kopiujesz tylko 2 bajty sizeof(words) No tak, pozostałość z wcześniejszych wersji tego kodu, kiedy words było zadeklarowane w ciele funkcji jako `uint16_t words istotnie ta konstrukcja jest wykrywana w większości platform, choć dla ARM wołane jest memcpy Jest to kwestia użytych flag kompilatora, ponieważ w rzeczywistości konstrukcja taka dla ARM daje...
Co ten zapis w/g Ciebie oznacza? Bo tak w sumie to: &SPI2->DR - bierzesz wkaźnik na rejestr, 32 bit (volatile uint16_t *) - konwertujesz na wskaźnik na liczbę 16 bit, ale wskaźnik, jak to wskaźnik ma tutaj dalej 32 bit (uint32_t) - i rzutujesz 32 bit wskaźnik na 32bit liczbę Na pewno takie rzutowanie jest potrzebne przy długości transmisji poniżej...
To jest rzutowanie . Tzn. jeśli jedna klasa dziedziczy po drugiej i mamy wskaźnik do klasy która jest starsza w hierarchii (tzn. jest "rodzicem", w tym przypadku object) to możemy z pomocą rzutowania otrzymać wskaźnik klasy która jest młodsza w hierarchii (tzn. jest "dzieckiem", w tym przypadku Button).
Po pierwsze jest to kod c++ a nie c. Odpowiednik w c: [syntax=c] int wbuffer[]={1,1,1,1,1,1}; const int *bufor; //1 bufor = (const int*)wbuffer; //2 printf("B: %d\n", bufor[1]); //3 error bufor[1] = 3; printf("B: %d\n", bufor[1]); [/syntax] To co tutaj zachodzi to tak zwane rzutowanie. Umożliwia ono zmianę jednego typu na drugi (o ile jest to możliwe)....
unsigned int *ple=(unsigned int*)&ulamek; wszystko jest ok, bo to mówi mniej więcej tyle, co "postaw wskaźnik na unsigned int na adresie zmiennej ulamek". Jeśli tylko zadeklarowałeś 'ple' nie definiując go, to musisz zmienić wskaźnik (czyli samo ple), a nie to co pod nim jest (czyli *ple), i ten wskaźnik postawić na adresie zmiennej ułamek (czyli &ulamek)....
...Ponadto tablica w kodzie mickpr jest zadeklarowana globalnie, czego podobno należy unikać. Czy dzięki wskazaniu pierwszego elementu tablicy zyskamy dostęp do całej? Czy wewnątrz funkcji da się wtedy zainicjalizować tablicę w ten sposób : tab = {{.....}, {.....}, {.....}} ? Ja założyłem, że zawsze znamy rozmiar tablicy. Autor nie powiedział,...
No to połowa sukcesu za Tobą :) Druga połowa to pokazanie, że kod generowany przez kompilator jest taki sam (lub lepszy) jak przy łopatologicznym: TIMSK |= _BV(3); I tutaj chyba polegniesz, bo z tego co pamiętam to pobranie adresu rejestru, rzutowanie na uint a następnie rzutowanie na wskaźnik będzie skutkowało wygenerowaniem nie sbi/cbi, tylko...
Generalnie - owszem, ale twórca biblioteki nie jest zmuszony do utrzymania trendów specyficznych językowi. Bo w C możesz zawsze dać uint8_t x=(void*)DowolnyWskaźnikLubInt; i zadziała bez ostrzeżeń. Otóż mój drogi Kolego, jako początkujący programista popełniasz ten sam błąd jak 99.9% początkujących programistów, którzy sądzą, że złapali Pana Boga za...
Sprawdz jakich parametrów oczekuje funkcja eeprom_write_byte() Z tego co pamiętam oczekuje ona wskaźnika a nie int'a, Dokładnie o tym informuje Cię kompilator że zrobił rzutowanie. Włóż tam wskaźnik a powinno pomóc.
Linia z #define to makro preprocesora, po, nomen omen, definicję i opis odsyłam do Googli. :) To makro przyjmuje wskaźnik, rzutuje go na wskaźnik na strukturę pole_bitowe (słowo kluczowe volatile to zakładam, że wiesz, co robi) i zwraca samą strukturę. Prawdopodobnie da się to opisać jaśniej, bardziej poprawnie i wciąż po polsku, ale mi się już spać...
Nie można było tak od razu? Teraz przynajmniej mogę Ci powiedzieć dlaczego działa. Deklarując te 8 tablic i wkładając je do tablicy liczb całkowitych, dokonujesz niejawnego rzutowania z wskaźnika na tablicę (którym jest nazwa tablicy) na liczbę całkowitą. Potem jak wkładasz kolejne elementy tablicy tab do funkcji rejestr to dokonujesz znowu konwersji...
(*(TC0_t *) 0x0800).CTRLA = TC_CLKSEL_DIV8_gc; i to to jest? o co tu chodzi? nie kumam tego. (TC0_t*)0x0800 - liczba 0x800 rzutowana na wskaźnik, czyli to wyrażenie jest wskaźnikiem na strukturę TC0_t (która jest pod adresem 0x800, tam gdzie akurat sa odpowiednie rejestry timera) *(TC0_t*)0x0800 - zawartość struktury TC0_t umieszczonej pod adresem...
Adres zmiennej _main_ram_start który jest równy wartości 0x20000000 jest rzutowany na wskaźnik na strukturę framebuffer. W konsekwencji wskaźnik fb też przyjmuje adres 0x20000000.
Postanowiłem liczbę typu float rozbić na 4 bajty stosując rzutowanie na wskaźnik char. A następnie przesyłać bajt po bajcie do PC jednak mam problemy, ze złożeniem tego na PC bo ostatecznie odbieram inną liczbę niż wysyłam.Kody programów zamieszczam poniżej: #include <avr\io.h> unsigned char dane; float wynik=2.9876; int i=0; int a=0; void INI_RS(unsigned...
Już zadeklarowałem ją jako extern i zadziałało :) Tylko nie wiem czemu wątek wykonuje sie tylko raz poczym zamiera .. DWORD WINAPI Thr(PVOID Parameter) { int *wsk =(int*)Parameter; int value = (*wsk); Beep(value,300); Sleep(500); return 0; } Jak sprawić by działał cyklicznie. Zrobiłem na razie tak :...
Rozwiązanie z postu powyżej jest najlepszym według mnie: if(v) PORTB |= (1<<PB3); else PORTB &=~(1<<PB3); Żeby jednak traktować pojedynczy bit portu jako osobną zmienną można wykorzystać fakt, że rejestry io posiadają swój adres w przestrzeni danych, przez co można uzyskać adres i rzutować wskaźnik na jakąś bardziej...
W C rozmiar struktury jest zawsze stały. W C++ pewnego rodzaju rozwiązanie mogą stanowić klasy pochodne (ale też rozwiązanie statyczne). W C można co najwyżej zastosować pseudoobiektowość, tzn. zadeklarować wiele struktur z takim samymi danymi na początku (dane wspólne) i odpowiednio rzutować wskaźnik przy dostępie.
Tablica uint8_t może nie być wyrównana (jej pierwszy adres może być równy np 1 albo 3, a ARM7 nie obsługuje niewyrównanego dostępu. Jeśli odczytasz uint16_t z niewyrównanego (niepodzielnego przez 2) adresu rezultat jest nieprzewidywalny, włącznie z zawieszeniem układu. Sam dodatkowo wprowadzasz zamieszanie, bo adres rzutujesz na wskaźnik ze znakiem,...
...ide zagrać w totka......;/ Zamiast tego po prostu poczytaj jakąś książkę do czystego C - takiego nawet na PC'ty .... poczytaj o typach dokładniej, o rzutowaniu, o wskaźnikach .... bo to jest podstawa podstaw - którą ty jak widać przez długi czas miałeś gdzieś i coś się tam udawało to szedłeś dalej nie oglądając się. Tymczasem każda taka książka...
Zapisywać nie wolno nam w ten sam bajt więcej jak jeden raz bez ponownego skasowania danego obszaru przed kolejnym zapisem. Można zapisywać wielokrotnie, ale jedyne co może się stać to zmiana 1 na 0 - jeśli na danym bicie było już 0, to dalsze zmiany nie są możliwe. Rzutujesz wskaźnik na int16_t, a zmienna uparcie jest "short int" - po co? No i w Option...
Witam, Poszukuję metody napisanej w C++ która zamienia liczbę Hexadecimal na float (hex to float). Do tej pory znalazłem kod: unsigned char adres[4]; //bo float ma 4 bajty unsigned char *wtab = adres; float liczba = 15.6; *(reinterpret_cast<float*>(... = liczba; //do z rzutowanego wskaźnika char na float przypisujemy...
Musisz poszukać w dokumentacji do Keila jak realizują offsetof - masz też wsparcie ze strony producenta. To makro nie jest standardem dla C i jeśli jakiś kompilator jest za bardzo papieski to się czepia, że rzutujesz wskaźnik na int. Niemniej na pewno jest jakieś specyficzne dla Keila rozwiązanie.
Wygląda to na błąd wynikający z niezrozumienia przez programistę tego, czego właściwie jest to adres. Komuś wydawało się zapewne, że ma być +5, bo najmniej znaczący bit wartości ładowanej przez instrukcję skoku w Cortex M musi być jedynką. Rzutowanie na wskaźnik do kodu załatwia to automatycznie, a w tym konkretym przypadku nie chodzi nawet zapewne...
Spróbuj: glcd_str_P((char *)pgm_read_word(&menus No TAK, to takie oczywiste! Odczytujemy adres, a więc 2 bajty (word) i rzutujemy na wskaźnik na char. bo przecie funkcja tego oczekuje. Wiedziałem, że pomroczność mnie zaćmiła. Dziękuję! robiw
Nawet dla takiego małego Miki jak ja już na pierwszy rzut oka jest jasne że te kody to potężne źródło problemów. Co widać bez wgłębienia się w szczegóły: * Funkcja main() jako rozbiegówka to słaby pomysł. Kolega stmx napisał coś na ten temat (nawet podaje link w promowanych tematach), warto to przeczytać. * Stos musi mieć odpowiednie wyrównanie, zwykle...
Keil jest ciut inny niż GCC. Z O2 i O3 kod z Keil armcc jest praktycznie niedebugowalny. Jednak z moich obserwacji wynika, że czasy, gdy optymalizacja powodowała, że program nie działał, raczej już minęły. Odkąd bawię się Cortexami, tylko jeden raz zauważyłem, że optymalizacja O2 na ARM "zepsuła" program, ale tak naprawdę to był błąd w programie (zmieszanie/rzutowanie...
jak poprawnie rzutować na wskaźnik void w języku C Aby poprawnie rzutować na wskaźnik void w języku C, należy zastosować następującą składnię: ```c (void*) pointer ``` Przykładowo, jeśli chcemy rzutować wskaźnik typu `int*` na wskaźnik typu `void*`, można to zrobić tak: ```c int x = 10; int* ptr = &x; void* void_ptr = (void*) ptr; ``` Warto zauważyć,...
(at)-psiak- Znowu zgoda, dzisiaj mam dzień "pomroczności jasnej". :wink: (at)Damian7546 Standardowe rzutowanie z typu całkowitego na float zrobi zwykłą konwersję liczbową tzn. tak, aby wartość była jednakowa, a nie reprezentacja bitowa w pamięci. Stad konieczność użycia "po drodze" typu wskaźnikowego, aby wskazać, że trzeba inaczej interpretować zawartość...
Dzięki :) Teraz mam kolejny problem char* pch; pch = strtok(data,"!(at)#$%")... while (pch != NULL) { myGLCD.print(pch, LEFT, 130); pch = strtok(NULL, "!(at)#$%"); } W przykładzie tej funkcji jest deklaracja char* pch Ogólnie program się kompiluje, niestety używanie w arduino deklaracji z...
Powracam z nowym pomysłem, którym są template'y Może na wstępie napiszę po co mi to w ogóle jest. Otóż mam taką fanaberię, żeby stworzyć "framework" do ARMów w C++. Wszystko byłoby fajnie, gdyby nie trudności z przechowywaniem danych w pamięci FLASH. Otóż taka na przykład klasa Pin dla Cortex-M3 (STM32) wymaga dwóch wskaźników - na komórkę pamięci odpowiedzialną...
ad.1 Aby zrozumieć co się dzieje w tej linijce musisz dowiedzieć się co to są wskaźniki i rzutowanie typów. Jeżeli restart to tablica, to: [syntax=c]x=restart[0];[/syntax] przepisze pierwszy element z tablicy do zmiennej x. Nazwa tablicy to jednocześnie wskaźnik (adres w pamięci) do tej tablicy. I na przykład: [syntax=c]x=restart[1];[/syntax] zadziała...
Język C nie wspiera dynamicznych tablic wielowymiarowych. Masz dwie możliwości: 1- wykorzystać "tablicę tablic" czyli tablicę wskaźników; 2- użyć tablicy jednowymiarowej i liczyć indeksy "na piechotę". Twój przykład jest zbliżony do metody pierwszej, tzn. tabpix jest u Ciebie wskaźnikiem na wskaźnik, a ponieważ w C wskaźnik na element jest równoważny...
W C kod bez rzutowania przechodzi, bo C ma nieco słabsze typowanie niż C++ i dopuszcza niejawną konwersję wskaźników. C++ jest w miarę kompatybilny wstecz, ale nie wszystko z C się skompiluje bez modyfikacji w C++. BTW, zamiast rzutowania w stylu C, lepiej użyć C++-owego static_cast<char*>(mmap()). W C++ rzutowanie w stylu C jest tylko ze względu...
Do funkcji w przykładzie przekazywany jest wskaźnik. W C/C++ nazwa tablicy jest jednocześnie wskaźnikiem na początek tablicy(tłumaczyłem Ci to bodajże przy okazji Twojej walki z jpg:). Czyli: Text_1234 == &Text_1234[0] Więc robisz dobrze w swoim kodzie(a przynajmniej w pierwszej jego wersji). Tak: &Text_1234 mógłbyś zrobić gdyby funkcja przyjmowała...
Witam staram się nie wypowiadać na tematy z pogranicza wiedzy a fantazji. Bo odczucia na słuch to fantazja .Mam jednak pytanie jak wyglądają pomiary samego transformatora jego rezonans zniekształcenia samego pasma.Ja osobiście preferuje wzmacniacze na mos fetach brzmią dla mnie czyściej. Konstrukcja wymagała sporo pracy ładnie to wygląda. i jeszcze...
Spróbuj może użyć do odbierania danych terminala z podglądem w HEX. Jeśli masz dane typu int, a podstawiasz nieduże liczby do większość wysyłanych danych stanowią zera, które tekstowe terminale zwykle ignorują. Okazało się, że problemem jest ignorowanie zer przez funkcję odbierającą dane na PC. Bibliotekę ściągnąłem z Internetu, na razie nie wnikając...
Yakhub: wsk->wsp_x //dokładnie taka notacja.. co do definicji wskaźnika samego do siebie można zrobić wskaźnik typu void a potem go rzutować..
co do twojego robocika i kamerki to chyba dosc latwo mozna by wykrywac przedmioty na jego drodze gdyby jakos rozszczepic promyk wskaznika laserowego i rzucić pod jakims kontem na ziemi przed nim. chyba ktos wspomnial tez o diodzie z dvd albo cd (jesli kamerka by ją widziala) ja bawilem sie ze zwyklym wskaźnikiem. probowalem tez lusterka na malym silniczku...
Uzupełnie temat o post ,,negujący samego siebie". Byłem po piwie - sam ciągle mieszam liby C i C++, tym bardziej używam natywnych bibliotek C a potem mieszam z C++. Jedynie 64 bitowe podejście może zatkać niektóre bilbioteki poprzez brak kompatybilności, głównie przez wskaźniki na voidach * i stare przyzwyczajenia do 4 bajtowego wskaźnika. Rzadkie zdarzenie....
setButton: wydaje mi sie, ze on jedynie zapisuje informacje o tym gdzie znajduje sie button a sprawdzenie nadal ma sie odbyc dopiero w bit_is_clear? Funkcja setButton zapisuje to co jej przekazujesz, a przekazujesz wartość odczytaną z wejść. c i kopiowana do argumentu funkcji foo . Funkcje działają na kopii, więc nawet, jeśli wartość c się zmieni podczas...
A to nie jest tak że z tablicy 255,0,0 to (R,G,B) czyli jeden pixel? Dokładnie. Na początku mam tablicę Pokaż definicję tej tablicy. Bajt to bajt - nieważne jak zapisany, a wskaźnik zawsze możesz rzutować. W C nie ma podstawowego typu 24 bitowego, są 8, 16, 32 ewentualnie 64, ale 24-bitowego nie ma, więc powtórzę: pokaż jak jest zadeklarowana/zdefiniowana...
Najlepiej wykonywać konwersję za pomocą unii: union { float flt; uint8_t u8[4]; } temp; temp.flt = e; /* tutaj robisz co Ci się podoba z temp.u8 */ Rzutowanie float na uint8_t* itp może być mniej efektywne + podpada pod aliasing wskaźników. Pozdrawiam, Dr.Vee
Dla ścisłości dodam, że uint8_t nie jest strukturą . A tym bardziej uint8_t* również nie jest strukturą... (uint8_t*)5 robi z literału 5 wskaźnik No robi, robi. Bądźmy precyzyjni: literał 5 jest rzutowany na "wskaźnik na uint8_t". Czyli jest to informacja dla kompilatora, że literał 5 ma zostać potraktowany jak wskaźnik na uint8_t...
Podany kod działać nie może, bo jak zmiennej typu uint16_t chcesz przypisać coś więcej niż 0xffff? A ostrzeżenie kompilatora mówi tylko, że w sposób niejawny z wartości integer robisz wskaźnik. Wystarczy to zrobić w sposób jawny, czyli wykorzystać rzutowanie typów. A jeśli nadal będziesz miał problemy to pomaga rzut oka na plik lss, zawierający wygenerowany...
Jak dla mnie powinieneś używać funkcji pgm_read_ptr(), która służy do odczytywania wskaźników. Całe to rzutowanie z jednego typu na drugi a potem jeszcze na trzeci to coś na czym bardzo prosto sie przejechać. Istnieje szansa, że tak czy siak to nie usunie wszystkich warningów, wtedy trzeba to zrobić "porządnie": [syntax=c]memcpy_P(¤tFont.Char...
Ale po co komu biblioteki? Wystarczy plik z pięknymi strukturami rzutowanymi na pamięć (są gotowe) , pliki core_cm3 i reference manual. Czy potrzeba aż specjalnej biblioteki żeby ustawić n'ty bit w x rejestrze? Pisząc w IDE (np: eclipse ) samo się pięknie wszystko podpowiada , rzut okiem do reference manual ustawiam/kasuje bit piszę komentarz i tyle....