Myślę, że już otrzymałeś odpowiedź, jak to zrobić. Podejrzewam, że zmienną modul_depth masz zadeklarowaną jako uint16_t ...dlatego uint16_t musisz zamienić na uint32_t na czas tych operacji, np. przez rzutowanie typów więc powinno być: [syntax=c] procentowo=((uint32_t)modul_depth*1000)/... //wspolczynnik zmian [/syntax] ponieważ bez rzutowania kompilator...
1 jest typu int więc jest 16 bitowa Dokładnie, po prostu pierwszy argument w wyrażeniu przesunięcia x : ( x << y ) jest 16-bitowy , więc jeśli chcemy użyć 32-bitowego - to trzeba zrobić rzutowanie typu.
Można użyć operacji stałoprzecinkowych zamiast operacji na float. Autor nie ma nigdzie operacji float. (100 - volume_coefficient) *127)/100 Ta część obliczeń jest stałą w pętli, więc nie powinna wprowadzać żadnych obciążeń. W wielu miejscach rzutujesz typ na 32-bity, podczas, gdy wynik operacji nie może przekroczyć 16 bitów. Takie rzutowanie wprowadza...
Poprawki, które powinieneś nanieść do kodu, aby pozbyć się warningów (łącznie z sugestiami kolegów wyżej): lcd_ILI9341.c: In function 'lcd_pisz_tekst_32': lcd_ILI9341.c:377: warning: operation on 'temp' may be undefined Zainicjalizuj zmienną temp zanim zostanie użyta: [syntax=c]void lcd_pisz_tekst_32(uint16_t x, uint16_t y, char * str,uint16_t kolor,uint16_t...
Gdzie masz funkcję write_text(); ? Tworzysz w ogóle jakieś pliki nagłówkowe? extern możesz też zastosować do tej funkcji syscalls.c który współgra ze skryptem linkera a o tym poczytaj na stronie Freddiego http://www.freddiechopin.info/
Chcę obliczyć współczynnik b = 256*(x1-x2)/(y1-y2) A mnożysz przez 255 :P wsp_b = wsp_b*0xff; Jeżeli nie jest Ci potrzebny wsp_a, możesz zrobić tak: long int wsp_b; wsp_b = (((long int) (x1-x2))<<8) / ((long int) (y1-y2)); Nie wiem, jakiego typu są zmienne x1, x2, y1 i y2, a jeżeli jest...
Witam, 1. UL to jest unsigned long (32bitowa liczna bez znaku) standardowo wszystkie stale liczby traktowane są jako int ponieważ 4000000 nie zmieści się na 16bitowym int , wiec musi być jako long lub też unsined long 2. uint8_t to tak naprawde unsigned char w pakiecie WinAVR znajduje się plik inttypes to właśnie w nim są zdeklarowane podobne typy zmiennych...
jesli dostosujesz w jakis sposob swoje dane, to miej swiadomosc, ze stracisz 75% pamieci na 'puste miejsca' miedzy tymi char'ami. napisz lepiej funkcje, ktora bedzie w stanie poskladac z 4 bajtow (dowolnie umieszczonych) jedna 32-bitowa zmienna. analogoicznie dla zmiennych 16-bitowych na poczatku takich funkcji mozesz sprawdzic, czy mozliwy jest odczyt...
zmieniłem wynik z milisekund na sekundy poprzez elapsedTIme = (millis() - startTime)/1000, jednakże "elapsedTime" nie wyświetla wyniku po przecinku a zaokrągla liczby. Jak sprawić by zmienna elapsedTIme wyświetlała liczby niecałkowite? Wstępna ocena dostępnych informacji Analiza podanych przez użytkownika danych: - Użytkownik zmienił wynik pomiaru...
Zawsze można w if sprawdzać R zamiast powtarzać operację odejmowania. Tak, to też przyszło mi do głowy, ale to mnoży zmienne w programie. Cały program testowy wziął się stąd, że tak się odlicza opóźnienia w programie tylko zamiast zmiennej Tim odczytuje się wartość z systemowego SysTic. No i przyszło mi do głowy "... a co jak urządzenie będzie działać...
rzutowanie zmiennych poprostu...
Spróbowałem napisać programik w Verilogu tak, by można było to samo napisać w C (nie chciałem komplikować poprzez używanie pól bitowych, więc rozmiary zmiennych 8 i 16 bitów): [syntax=verilog]module s1b; reg [7:0] r1 = 3; reg [7:0] r2 = -2; reg [15:0] rd = 95; initial begin repeat (32) begin $display("r1=%02x r2=%02x (r1-r2)=%02x (r1-r2)<rd=%1d rd=%02x",...
no wiec czas poznac nowa umiejetnosc (nowy skill [; ) - rzutowanie zmiennych - type casting - pisalem o tym ostatnio - http://www.elektroda.pl/rtvforum/viewtop... 4\/3!!
Prawdopodobnie problemem są typy zmiennych. Funkcja atan2 operuje na zmiennych typu double - Ty podajesz zmienne typu int. Czasem trzeba w takich sytuacjach zrobić jawne rzutowanie każdej zmiennej na typ float - sprawdź czy to pomoże.
Hmmm, rzutujesz na unsigned long i zmienna czas_podawania_sredni jest tego typu, natomiast rzutowanie nie zmienia typu zmiennej czas_podawania_odliczony, pozostanie ona typu unsigned int.
Tak. Rzutowanie typów jest zasadniczo dla programisty, bo o ile w przypadku bezpośrednich zmiennych mają one różne typy i w związku z tym rozmiary, to kompilator i tak wie jak konkretna zmienna została zadeklarowana. Ale użycie zmiennej typu X w miejscu gdzie ma być typ Y oznacza prawdopodobną pomyłkę programisty i rzutowanie mówi kompilatorowi, że...
No chyba że tak, myślałem że jawne rzutowanie ma miejsce wtedy gdy wszystkim zmiennym przyporządkowujemy taki typ, żeby w danym wyrażeniu występowały tylko zmienne danego typu.
Czyli dla pewności zawsze trzeba dodawać? Nie, nie trzeba tego na pewno "zawsze" dodawać i zwykle takie "profilaktyczne" rzutowanie tylko zaciemnia obraz, podobnie jak profilaktyczne nawiasy wszędzie gdzie się da. Trzeba do sprawy podchodzić rozsądnie i po prostu za każdym razem przemyśleć co jest potrzebne - uniwersalna zasada którą mógłbyś stosować...
Zapis przez rzutowanie jest "długaśny" szczególnie jak chcę zamieniać z ramki na int32 Zawsze możesz zamiast nazw zmiennych używać pojedynczych liter, przedefiniować nazwy typów na max 3 znakowe i usunąć wszystkie białe znaki. Tym sposobem Twój program będzie maksymalnie kompaktowy i nikt nie będzie w stanie go zrozumieć - włącznie z Tobą za 2 tygodnie.
Pomiar zaczyna pulsować . Troszkę za dużo wrzuciłem programu . Wystarczyło przerwanie od licznika PWM . Jeżeli chodzi o długość przerwania to może błędnie myślałem , że lepiej jedno dłuższe niż kilka krótszych . Spróbuje zastosować przerwanie od przetwornika ac .Ile pomiarów najlepiej zrobić i jak rozwiązać rzutowanie zmiennych int na char ? Na początku...
Stworzenie wskaźnika jako volatile nic nie zmienia z pewnością, choć słyszałem pogłoski że zmienia, ale jednak kompilator daje komunikat o tym: Moja sekwencja myślenia jak kompilator daje warningi sugerujące rzutowanie, analiza "top down" (oczywiście słowo użyłem nieco umownie), często prowadzi do tego, że już pierwsze użycie ma nieprawidłowe modyfikatory....
Czyli ciągnąc ten temat, powinna zostać utworzona pośrednia zmienna 16 bit? Nie ma to żadnego znaczenia, ponieważ wartość którą możesz otrzymać w wyniku - np. 135 - _NIE_ mieści się w typie finalnym. Jeśli po drodze przepuścisz ją przez 10 zmiennych w których się mieści, to nagle nie zacznie się mieścić w int8_t. Obliczenia "wewnątrz" tego wyrażenia...
oj oj ;) W Bascomie zmienna to Double 8 Bytes 5.0 x 10^–324 to 1.7 x 10^308 Doubles are stored as signed 64 bit binary numbers, jest inaczej traktowana, zobacz na jej zakres!!! Nie operuj na tej zmiennej, skoro chcesz numer seryjny pilota to wystarczy zmienna 32 bity skoro jest on 28 bitowy. Dodatkowo Keeloq ma podzieloną transmisje na dwa bloki...
Jeśli zmienne w cudowny sposób przyjmują kosmiczne wartości, to zwykle problemem jest zbyt mały stos. Np stos przerwań nadpisuje Ci zmienne głównego wątku (lub odwrotnie) albo stos wchodzi na obszar zmiennych globalnych.. Jeśli używasz funkcji variadic (ze zmienną ilością argumentów, np. printf() ) to konieczne jest wyrównanie stosu do ośmiu - przy...
Dzięki za pomoc. Skorzystałem z funkcji w core_cm3 [syntax=c]uint32_t __REV16(uint16_t value) { uint32_t result=0; __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); return(result); }[/syntax] i wszystko działa już poprawnie. Z tym 8051 i AVR rzeczywiście nie korzystam ze zmiennych 16bit (sięgam do pojedynczych bajtów) wiec zapewne też...
Niestety w C nie ma lekko - jest kilka wyjść. Najprościej wymusić aby jeden z operandów był typu float. Można tego dokonać stosując rzutownaie, albo przypiusując jedną ze zmiennych temp1, temp2 do zmiennej tymczasowej o typie float i potem ją wykorzystać do obliczeń. Takie rzutowanie jak w poście gaskoin nie zadziała, bo znaczy ono tylko, że wynik ((temp1...
Kolega ma problemy z podstawami C. Z jakich elementów składa się string ? Nie odróżniasz zmiennych od wskaźników i tego co chcesz uzyskać, rzutowanie w ogóle bezsensu. Jak odpowiesz na pierwsze pytanie może przejdziemy dalej. Dlaczego nie chcesz użyć itoa jeśli w ogóle posiadasz tą funkcję w stdlib ? Musisz przygotować string z wynikiem temperatury,...
Chyba jakieś rozkazy tam zaszywa, ale to trochę dziwny sposób... Nie znam kompletnie USBASP od strony programowej, ale myślę, że stosowanie zmiennych 32-bitowych wiąże się z protokołem USB (który przecież działa na 32-bitowym PC). Być może to implementacja pewnych funkcji pochodzących z PC, których autorowi nie chciało się konwertować na 16-bitowe...
Program napisany jest pod bitmapę 24 bitową czyli brak w pliku palety kolorów przed pikselami. struktura RGB (3 bajty): [syntax=cpp] typedef struct RGBTriplet { BYTE blue; BYTE green; BYTE red; } RGB; [/syntax] zmienna tmp to wskaźnik void. Wskazuje ona na miejsce pamięci gdzie znajduje się width, po to by po jego zmianie był punkt odniesienia. int32_t...
Witam jestem studentem informatyki i mam problem ze zrozumieniem jak działa rzutowanie PTR w TASM. Używam Visual Studio 2010 do debugowania. Mam prosty program do analizy (tak mi się wydałało :D ) który realizuje deklaracje zmiennych różnej długości. [syntax=asm].686 extern _ExitProcess(at)4: near public _main _DATA SEGMENTdword public 'DATA' use32...
1. Zrób jawne rzutowanie typów 2. Sprawdź, czy przypadkiem nie przeładowujesz gdzieś stosu - nie wiem jak to wygląda w MSP430 i ile toto ma ramu i ile jeszcze używasz na inne zmienne, ale w AVR stos jest budowany od dołu ramu, a zmienne od góry. I czasem albo w przypadku za dużej liczby zmiennych globalnych, albo gdy stos się rozrośnie (dużo zagnieżdżonych...
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)....
A co dokładnie oznacza ten niewyrównany dostęp? W wielu architekturach założone jest (na poziomie sprzętowym!), że zmienne o rozmiarze 2, 4 i 8 bajtów znajdują się na adresach podzielnych przez (odpowiednio) 2, 4 i 8. Tzn. że gdybyś układał zmienne w pamięci, to np. zestaw czeterobajtowych wylądowałby pod adresami 0, 4, 8, 12, ..., a zestaw dwubajtowych...
Co do dzielenia, it's not a bug, it's a feature! :) Po naszemu, to nie ograniczenie, tylko odgórne założenie, dzięki temu w C nie ma dwóch operatorów dzielenia (całkowite i zmiennoprzecinkowe), jak w niektórych innych językach, ale trzeba uważać na typy zmiennych, coś za coś. Według tego, co wyczytałem z dokumentacji avr-libc int zajmuje 2 bajty, a...
Przeważnie jest tak, że wskaźnik jest tego samego typu co zmienna, na którą wskazuje (przynajmniej tak gdzieś wyczytałem). Jednak co w przypadku gdy wskaźnik wskazuje na element struktury? Wówczas powinien on być typu struktury czy elementu? Oto przykład, jest taka oto struktura: typedef struct { unsigned char hundsecs: 8; unsigned char seconds:...
Troszkę więc nieuprawnione chyba jest stwierdzenie, że korzystanie z funkcji dostępnych w kompilatorze jest pójściem na łatwiznę - nieprawdaż ? Chłopcze, czepiasz się słówek. A ciebie co sieknęło nagle ? Piszę dyskutuję, nie czepiam się ciebie - myślałem że kulturalnie dyskutujemy. Zobacz w jakiej formie to napisałem - użyłem słowa "chyba" .... bo...
Witam. Zająłem się dzisiaj tablicami (to w ramach prób odczytu numeru seryjnego z urządzenia Dallasa). Aby sobie ułatwić i sprawdzić jedną z funkcji zdefiniowałem tablicę 16-elementową z wartościami liczbowymi, a następnie chciałbym wyświetlić osiem pierwszych liczb na LCD, w postaci numerycznej, czyli na LCD chcę w tym przypadku uzyskać 12345678 (a...
No mi nie raz rzutowanie coś tam ułatwiło. Też jestem zdania że nie ma co przesadzać. Są rzeczy nad którymi trzeba pomyśleć i zbadać o nie samemu. No trudno że program będzie działał tylko przy określonej konfiguracji zmiennych a przy innej nie a kompilator nawet nie zwróci błędu. Myśleć trzeba zawsze, jakich zaawansowanych opcji w języku by się nie...
Projekcik fajny, gratuluję ambicji :) Kliknąłem "Fajne" mimo kodu PHP! Nie chcę tutaj opisywać Twoich błędów, więc zerknij na to co dla Ciebie przygotowałem: [syntax=php]<?php /* Pobieranie parametru z $_GET['d'] Dodatkowo wykonujemy rzutowanie na typ liczbowy całkowity (int) */ $d = (int) $_GET['d']; /* Sprawdzanie czy podany parametr jest w poprawnym...
Jak użyć stałych zapisanych w pamięci programu przez const unsigned char TEXT[] = "jakiś tekst"; W funkcjach typu strcpy(), strcmp() itp? Te funkcje nie przyjmują wskaźnika do const więc nie można zrobić tego w ten sposób: strcmp(bufer, TEXT); co gorsza nie da się w ten sposób: strcmp(bufer, "jakiś tekst");...
Ja mam troche inne zdanie. We wszelkich operacjach arytmetycznych powinno sie uzywac konwersji typow nawet jezeli sa nadmiarowe. Dzieki temu mozemy czasami uniknac pomylek. Odsylam do C Codic Standard. 8-O Gdzie tak uczą? Po pierwsze, nie ma czegoś takiego, jak uniwersalny "C Coding Standard" - niestety :-(. Więc nie wiem, co konkretnie masz na myśli....
Dobra. Kod prezentuje się następująco: to jest program w którym wszystko działa jak potrzeba: [syntax=cpp]//Data utworzenie: 20-09-2014 #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <avr/pgmspace.h> #include "MYUART/myuart.h" #include "MK_TERMINAL/mk_term.h" #define REF_256 (1<<REFS1)|(1<<REFS0)...
Nie sprawdzałem ale mam wątpliwości czy to zadziała. W nowym oknie musisz wywołać metodę GetParent() która zwróci uchwyt do okna z którego nowe zostało wywołane. Pewnie trzeba będzie wykonać rzutowanie. Do zmiennych dostaniesz się przez pParent. [syntax=cpp] stareOkno* pParent = (stareOkno*)GetParent(); pParent->zmienna [/syntax]
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...
Najlepiej zadeklaruj int A; a do wszystkich obliczeń stosuj A/10.0 (najprostszy i najwygodniejszy sposób) Można też zaokrąglić stosując funkcje RoundTo(A,-1) lub ((int)(A*10))/10.0 (poprostu najpierw mnożymy razy 10 później rzutujemy na inta a póżniej dzielimy przez 10 i rzutujemy na float)
Jeśli chcesz, żeby zaokrąglał zamiast obcinać to do zmiennej float dodawaj 0,5 i następnie rzutuj.
Masz błąd w tej linii: [syntax=c] odczytane = (odczytane1<<8) | odczytane2; [/syntax] Dodaj rzutowanie. [syntax=c] odczytane = ((uint32_t)odczytane1<<8) | odczytane2; [/syntax]
Dzięki 2P. Działa. Podejrzewałem, że chodzi o rzutowanie zmiennych, ale próbowałem sposobem kolegi BlueDraco i niestety.
Może spróbuj zmienić typ zmiennej *odebrano* z uint8_t na char bo może to jest problem z rzutowanej zmiennej unsigned na signed.
Przecież uint8_t to jest unsigned char, więc co tu chcesz przerabiać? Jak masz warninga to po prostu rzutuj zmienną na char i już. 4\/3!!
Tworzysz problem na siłę. Skoro zmienna 16-bitowa nie starcza, to należy użyć 32-bitowej. Nie ma magicznego sposobu, żeby to liczyć na 8-bitach i trwało to 3 cykle... ul oznacza Unsigned Long, czyli dla AVRa pewnie to samo co uint32_t. (typ_zmiennej)jakas_zmienna to rzutowanie - sugerujesz kompilatorowi, że zmienna nie ma wcale typu A, tylko typ B....
Nie zawsze można ręcznie dodawać ".0", jeśli chciałbyś dzielić zmienne typu int trzeba rzutować i w sumie wystarczy tylko jeden czynnik typu float drugi domyślnie się zrzutuje [syntax=cpp] int a=2518; int b=12512; //w stylu c float test = float(a)/b; //poprawnie ;) float test2=static_cast<float>(a)/b; [/syntax]
Witam. Poniżej przedstawiam prosty program, który rzutuje zmienną typu "char" na "int": [syntax=c]#include<string> #include<iostream> using namespace std; int main() { char a = 'ż'; cout << static_cast<int>(a) << endl; return 0; }[/syntax] Moje pytanie do Szanownych Pań i Panów brzmi - dlaczego "cout" zwraca -65, skoro...
Pierwszy zapis o który pytasz, to tablica wskaźników na funkcję, która to funkcja nie zwraca wartości i nie przyjmuje wartości. Zapis const oznacza, że tablicy nie będziemy modyfikować. Zapis, moim zdaniem bardziej czytelny, który sam stosuję w takim przypadku (z głowy): typedef void (*pVector_t)(void); __attribute__ ((used,...
hotdog: miałem na myśli ogólny przypadek użycia const. W tym przypadku rzutowanie nic nie daje i co więcej jest niepotrzebne. Zmienną na typ const kompilator rzutuje automatycznie i nie powinno to generować ostrzeżeń. Co innego w drugą stronę - rzutowanie zmiennej const na zwykłą - tu pojawić się powinien błąd. Dr. Kuj - sądząc z innych twoich postów...
Jeśli y będzie typem unsigned int, to jawne rzutowanie nie jest potrzebne - kompilator niejawnie zrzutuje wynik operacji na typ zmiennej y
Rzeczywiście kompilator zwraca przy f_write warning. Jak to powinno się poprawnie zapisać? Należy użyć dokładnie takiego typu jakiego oczekuje funkcja, czyli UINT, a nie uint8_t. I bynajmniej nie chodzi o rzutowanie - należy zmienić typ zmiennej której adres jest przekazywany do funkcji. Zwrotne informacje z tych funkcji odbieram, ale nie chciałem...
Witam! Aby pozbyć się warningu, musisz rzutować zmienną. Zmień linijkę: if (strncmp (bufor, "RING", 4) == 0) na if (strncmp ((const char*)bufor, "RING", 4) == 0) I będzie OK. Pozdrawiam Wojt
mój błąd - musisz zostawić W jako Word, a potem dodawać wartości do zmiennej typu Long poprzez tzw. niejawne rzutowanie typów. czyli Dim W as word, L as long '... W=getadc(0) L=L+W '... L=L/10 W=L '... i dalsze obliczenia
Rzutowanie? Wszystkie te zmienne są typu string.
Jeśli chcesz wyświetlić bez miejsc po przecinku to rzutuj zmienną cisn na jakąś zmienna typu Integer lub Word. Zdefiniuj ją na przykład Dim cisn_int as integer i nastepnie napisz cisn_int= cisn I wyświetl bez fusing. Bascom to nie jest prymitywny język. Jest bardzo dobrym narzędziem do pisania nawet skomplikowanych programów.
Nie działa mi to mnożenie tam u góry bo zapis zrobiłem w ten sposób że rzutuje zmienną na czar potem przesuwam o 8 bitów i znów rzutuje przesuwam znów rzutuje. I tak to zapisuje i przy zapisie wyskakują dziwne licznik. A tak w ogóle dzięki za tutorial ale ja używam zewnętrzny eeprom bo wewnętrzny atmegi jest zarezerwowany na co innego. Post raportowany,...
Witajcie, Mam STM32 i kodek o rozdzielczości 24 bity. Próbki mam w zmiennej 32-bitowej. Chcę jakoś "zredukować" tą próbkę do 16 bitów. W jaki sposób mogę to zrobić? Tzn, wiem, że mogę po prostu zrobić rzutowanie (int16_t) na zmienną 16-bitową, ale da się to zrobić w jakiś bardziej optymalny sposób? I jak potem to zrobić w drugą stronę?
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...
Witam! krzychoocpp napisał: Nie jestem pewny czy obydwa rzutowania są potrzebne, chyba wystarcza tylko jedno. Masz rację wystarczy jedno rzutowanie: float f = (float)a / liczby; albo float f = a / (float)liczby; daje ten sam wynik; Pozdrawiam
Cześć! Przy pisaniu programów starałem się unikać liczb ujemnych. Tak, wiec w jednym z programów stosowałem dane typu uint, jednak w wyniku pewnego błędu okazało się, że na wyświetlaczu pojawiła się wartość ujemna jako wynik obliczenia. Tak więc prośba o wytłumaczenie dlaczego stosując dane typu uint otrzymuję prawidłowe wyniki? Na przykład w wyniku...
Ja w ogóle nie kumam gdzie tu jest problem, skoro flash w tym (jak i w każdym innym w zasadzie) mikrokontrolerze można odczytywać w bajtach, półsłowach i słowach? Po co rzutujesz na zmienną 16-bitową skoro chcesz odczytać 8-bitów? 4\/3!!
(A0 + A1 )*(A2 + A3) /4096 Lepiej użyć: ((A0 + A1 )*(A2 + A3)) >> 12, będzie szybciej. Zmienne Ax powinny być typu unsigned long (albo uint32_t - w Uno to ekwiwalent) analogRead() zwraca wartość int, więc trzeba je rzutować do uint32_t przed dodawaniem.
Zrobiłem porównanie dla int w postaci /// temp_ds[0] -> temperatura z czujnika // n0_eeprom_1_dol -> temperatura z eeproma if((int16_t) temp_ds[0] <= (int16_t) n0_eeprom_1_dol) { } Niestety musiałem tak rzutować zmienne inaczej nie chciało działać chociaż obydwie zmienne są odczytane i zapisane...
Cześć, mam problem z obliczeniami w języku C. Ustawiam zmienną float i podstawiam proste obliczenia tj. float t; t=(20/100)*45; Chcę uzyskać wartość całkowitą z tej liczby więc rzutuję na nową zmienną unsigned int i; i=(unsigned) t; Nie uzyskuje tej liczby. Dlaczego?
Masz dużo racji. Prawdopodobnie to co napisałeś zadziała. Następnym krokiem ( pomnożyłeś przesuwając w lewo 4 razy przez 16) będzie podzielenie przez 16 i rzutowanie na zmienną single. Otrzymasz temperaturę dodatnią lub ujemną z dokładnością bodajże 4 miejsc po przecinku.
W powyższym przykładzie dla avr wychodzi (0x93E0) dlatego, że zmienna x jest traktowana jako "signed" (i dla x=60 000 jest już liczbą ujemną). Trzeba zadeklarować: uint16_t x; i można na wszelki wypadek rzutować obie zmienne na typ long.
Cześć Jak wpisać do bufora 32 bitowego takie zmienne address,command,negated_command address-16 bitowy command-8 bitowy negated_command-8 bitowy buffer-bufor 32 bitowy W podanej kolejności zmienne mają być włożone od LSB do MSB. buffer=address; buffer=command<<16;Czy takie polecenie odrazu rzutuje prawą stronę do zmiennej typu uin32_t czy na początku...
Możesz też zrobić to rzutując sobie zmienną (unia jest jednak bardziej czytelna). [syntax=c] t_dt czas; ((uint8_t*)&czas)[6] = 2;[/syntax] Kompiluje się to za pewnie (nie sprawdzałem) do tego samego. Nie trzeba deklarować typu itd.
Problem wynika z reguł promocji typów występujących w języku C. W AVRGCC typ int jest 16 bitowy i do takiej wartości następuje promocja typu przy przesunięciu bitów w lewo. Powinno pomóc rzutowanie: [syntax=c]uint32_t mask = (uint32_t)((uint32_t)1<<(uint32_t)... Pozdrawiam Wojtek
Dzięki. A mógłbyś powiedzieć dlaczego tak akurat działa? Sam poradziłem sobie w inny sposób: zmienna_w = temp2; zmienna_w = zmienna_w <<16; Mam też inne pytanie. Mam oto liczbę float e FLoat zawiera liczbę z przedziału 0-1. Chciałbym zapisać jej cztery bajty w buforze. Mam coś takiego: uint8_t bufor[4] bufor[0]= ((long...
Najprościej: 1. mnożysz float *10, powstaje np zmienna "liczba"; 2. następnie "liczba" dzielisz przez 10 - masz zmienną "całe"; 3. na "liczba" wykonujesz dzielenie modulo 10 i masz ulamek. W przypadku całkowitych można też od razu rzutować na int, tak jak pisał kolega wyżej. Poskładać to do kupy z kropka pomiędzy za pomocą itoa() i już.
Nie chcę Cię martwić (bo jeżeli Twój kod działa jak powinien to OK), ale to co robisz w pierwszym poście 1 i 3 nie jest sobie tożsame. Kod w #1 jest jak najbardziej prawidłowy. Typ char to dla platformy .NET tak naprawdę 16-to bitowa liczba z zakresu 0...65535 Więc taki kod: znak o kodzie ASCII = 4 . Do tego w zasadzie typ char został stworzony. Jeżeli...
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....
Juz gotowe :) mogłem najpierw poczytać, zanim napisałem te pytanie. Temat zamkniety rzutowanie pomogło.
Dzięki o coś takiego dokładnie mi chodziło:).W poprzedniej Twojej wypowiedzi myślałem że poprzez wirtualną kartkę rozumiesz to abym rzutował poszczególne zmienne stringowe do zmiennej plikowej która potem będzie zapisywana jako zbiór informacji zebranych z pól textbox.Stąd zrobiło się małe zamieszanie bo nie wiedziałem wtedy jak dokonać przejścia do...
Trochę na ślepo walczysz - jak usuniesz rzutowanie na zmienną 8-bitową, a pD jest czymś większym, to wtedy ta operacja zadziała zupełnie inaczej niż było w planach... A zamiast rejestru IPR jest chyba IP, może jakiś inny nagłówek ktoś wykorzystywał. Do nazwy przerwania wystarczy dodać ...CAN1... 4\/3!!
Pokombinowałem, spróbowałem każdą zmienną rzutować osobno w następujący sposób: [syntax=c] Ton = (uint32_t) ICR1 * (uint32_t) DutyCycle /100; [/syntax] i zadziałało. Teraz przy każdej częstotliwości mam zmianę wypełnienia zgodnie z założeniami ;) Dziękuję bardzo za pomoc.
Freddie Chopin : Masz drobny błąd w kodzie - na wskaźnik rzutujesz nie adres zmiennej "data", tylko jej wartość. Ogólnie warto jest posiadać funkcję do wysyłania bloku danych - wystarczy podać wskaźnik oraz długość danych.
O ile sprzęty AGD ą wykorzystywane cyklicznie i regularnie (pranie, prasowanie, odkurzanie itp.), trzeba pod uwagę uwzględnić zmienną taką jak zmiana czasu na zimowy - wówczas wcześniej włączamy oświetlenie, co rzutuje na dodatkowy pobór.
Nie ma znaczenia jakiego typu jest tmp, w C tego typu operacje są domyślnie rzutowane na int, wynika to po prostu ze standardu języka. Zauważ, że konwersję do typu takiego jaki ma tmp wymusza dopiero operator przypisania (=), więc wszelkie operacje po prawej stronie nie są zależne od typu zmiennej po lewej stronie.
... daj może przykład jak byś to widział ? Rzutuj do takiego typu , do jakiego chcesz przypisać wynik całego działania. test =(unsigned long)liczba * 1638 / 1638 + 2036; // test = 3663 Piotrek
W swoich programach często mam linijkę: [syntax=vbnet] Dim Help_b As Byte, Help_i As Integer, Help_w As Word ' itp[/syntax] Nie muszę się potem zastanawiać i takie podręczne, znane na pamieć, powodują że nie musisz powoływać nowych. Następną rzeczą jest to że w Bascom nie musisz rzutować zmiennych na typ string jeśli chcesz je wyświetlić na LCD. Robi...
OK tylko jak przypisać odpowiednią zmienną umieszczoną pod danym indexem listy do zmiennej którą mogę przetworzyć w progrmie: Podam kod prymitywnie ale tak bym przekazał i docelowo zrozumiał ide przypisania w drugą stronę Dane.Nazwa:=CheckListBox1.Objects ... Dane.Adres.Ulica:=CheckListBox1.Obje...
Więc to potwierdza że afx współpracuje tylko z MFC. Więc albo zrobisz aplikacje MFC albo będziesz musiał sam napisać wstawianie grafiki do RichEdita albo tak jak wcześniej wspomniałem przerobisz wszystkie afx. Aby działało należy przebudować cały projekt przy takich zmianach a nie naciskać tylko F5 jako start debuging. Polecam Rebuild Solution (Ctr+Alt+F7)...
Tak, kompilator obetnie typ int do 8-bitów. Jeśli chcesz zapisać całość to chyba najprościej jest zmienć typ tablicy na int, a potem ew. rzutować ją na byte (jak się domyślam int8_t). Ew. ręcznie zapisać a >> 8, a % 8. Tylko, że taki zapis wrażliwy jest na endianess.
Usunięcie tablicy nie przyniosło oszołamiających efektów, choć poprawiło sytuację. Dane są wysyłane poprawnie do mniej więcej 32 czy 64-tej próbki, a ja chciałbym wysłać ich 255. Kolejne próbki po bodajże 64-tej znów są przekłamane. Nie wiem w czym piszesz, ale dziwnie działasz na wskaźnikach/adresach. Poza tym rzutując na unsigned char ograniczyłeś...
To ja wytłumaczę prościej: 2+3 == 5 a nie 23 :) . Prawidłowy kod to coś w stylu: pomiar= gora<<8 + dol; zmienne są automatycznie rzutowane na int.
Zwiększyło niewiele bo już wcześniej używałeś floatów. Swoją drogą twój problem wynika z niezrozumienia podstaw C, typecast następuje w chwili przypisania wartości zmiennej, chyba, że jawnie to zmienisz stosując rzutowanie. Kup sobie K&R i miłej lektury :)
Zamieść fragmenty Twojego kodu. Może podczas zapisu rzutujesz int na unsigned char.
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...
Coś w ten deseń chociaż żeby to przetłumaczyć toczka w toczkę to najlepiej by było użyć Config Base = 0. Wtedy tablice mogą się zaczynać od indeksu zero czyli można by wpisywać do Delays(0) - Delays(Steps-1) a tak tego nie masz. Tutaj może nawet nie jest potrzebny warunek If I > 1 bo to chyba w Arduino jest po to by nie było mnożenia I * 4 + 1 bo...
Rzutowanie float na float chyba nie ma sensu ... result powinien byc typu float przy deklaracji... Ja to rozumiem tak, że nie rzutuję float na float tylko zmienną result na float po to, aby wynik dzielenia był liczbą rzeczywistą, ale być może się mylę.
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);...
program W czym problem? Przepisujesz znak po znaku(albo linijka po linijce) plik źródłowy dotąd aż nie napotkasz w nim znacznika końca pliku EOF. ch = getc(input); while(ch != EOF) { ch = getc(input); putc(ch, output); } Gdybyś chciał tak zrobić z plikiem binarnym to mogło by ci się to nie udać. Wtedy powinieneś...
delphi rzutowanie rzutowanie wskaźnik rzutowanie tablicy
gięcie drutu zmiana czasu letni zimowy cewka stycznika siemens
router bezprzewodowy router bezprzewodowy
Jak wgrać Windows CE na Modecom MX4 - instrukcja Alarmy i sygnalizacja w systemach UPS: szczegółowy opis