Mam dziwny problem z którym nie mogę sobie poradzić, początkowo po prostu wyświetlałem rezultat na formularzu i było ok, potem zachciało mi się go rzutować na zmienną typu byte i raz działa, raz nie... żeby działało muszę zrobić tak: byte r = byte.parse(e.result.tostring()); Poniżej prosty przykład odtwarzający warunki w programie: [syntax=csharp] public...
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...
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ć...
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...
problemem jest to iż kompilator nie wie na jakim typie zmiennej na wykonać modulo4 np.: uint8_t i=0; i = i-1; i %=4//daje 3 listing asm uint8_t i = 0; movb $0x0,-0x1(%rbp) i = (i-1); subb $0x1,-0x1(%rbp) i %= 4; andb $0x3,-0x1(%rbp) Wszystko czytelnie, tak samo jak: uint8_t i=0; i = uint8_t(i-1)%4;//daje 3 listing...
Pom się raczej nie przekręca bo 256*20 mieści się w zakresie int. A dlaczego 256, skoro odczytujesz cały ADC a nie tylko 1 bajt pomiaru? Słusznie, mój błąd. To jest 1024*20, ale to nadal się mieści w int. Problem rozwiązany. Bład polegał na tym, że zmienna pom nie była inicjalizowana z wartością. Teraz jak inicjalizuję ją z wartością 0 wszystko śmiga...
Poczytaj o czymś takim jak rzutowanie. W twoim przykładzie obliczenia są wykonywane (z tego co wiem o C) na zmiennej 16-sto bitowej i dopiero potem kopiowane do 32-bitowej - stąd odcinanie danych. Powinieneś napisać to tak: wynik=(uint32_t)a*(uint32_t&... Wtedy obliczenia będą prowadzone na zmiennych 32 bitowych i...
Witam Potrzebuję przesyłać strukturę z ADuC845 (Keil) do PC (C++ Builder) i odwrotnie. W obu programach struktury są identycznie zadeklarowane i zajmują 60bajtów tak żeby na PC zajmowała wielokrotność 4B. Odebranie pakietu przez RSa i rzutowanie go na strukturę nie przyniosło oczekiwanego efektu. typedef struct { char name[8]; int Eo; float...
Witam! W kodzie mam taką konstrukcję: zmienna_uint = (zmienna_uint * 10) + (uint)zmienna_float; gdzie uint oznacza zmienną typu unsigned int. Ta linia po skompilowaniu zajmuje 1800 B. Kompilator ustawiony jest na optymalizację -Os oraz mcu ma ustawiony tryb thumb. Nie ważne czy zrobię rzutowanie jawne czy niejawne, kod z tą linią zajmuje praktycznie...
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...
PTR to nie jest rzutowanie, jakie występuje w językach wysokiego poziomu, tylko traktowanie. Po prostu jest spod adresu wskazanego zmienną pobierane WORD danych. Jako, że sama zmienna jest tylko typu bajt, to w rzeczywistości zostaną pobrane wartości ze zmiennej Byte1 i Byte2 w kolejności.
Witam, u8 tab[100] u8 *ptr = tab; W zakładce Expressions możesz wpisać (u8*[100])ptr lub (u8 [100]*)ptr Jedno albo drugie zadziała... nie mam jak sprawdzić teraz które jest poprawne. EDIT: Oczywiście w Expressions możesz podglądać co chcesz. Można rzutować tablice na struktury i odwrotnie. Rzutować ręcznie wpisane adresy na tablice/struktury. Np: (radio_frame_t...
[syntax=csharp]/// <summary> /// Assign each icon from the list of icons to a random square /// </summary> private void AssignIconsToSquares() { // The TableLayoutPanel has 16 labels, // and the icon list has 16 icons, // so an icon is pulled at random from the list // and added to each label foreach (Control control in tableLayoutPanel1.Controls)...
Witam Wykonuje następujący kod php: $a=$_POST['a']; $a=(double) $a; echo $a; Jeżeli zmienna $a="12e2" to po rzutowaniu wychodzi prawidłowa liczba 1200. Nie rozumiem jednak tego jeśli $a="12d2" to też wychodzi liczba 1200. Czy to jest jakaś inna forma zapisania liczby w postaci naukowej??
Mam prosty programik który mierzy napięcie i prąd na boczniku 2R (1R+1R a pomiar jest na połowie bocznika): main.c [syntax=c]ISR(ADC_vect) { int i,u,r; float p; LCD_CLS(); i=ADC; u=i*2; LCD_INT(i); LCD_STR("mA"); LCD_POS(1,11); LCD_INT(u); LCD_STR("mV"); p=i*u; //p=p/1000; r=(int)(p); LCD_POS(2,1); LCD_INT(r); LCD_STR("mW"); LCD_POS(2,9); //LCD_INT(q);...
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...
I jeszcze jedno ten program natychmiast poprawisz używając symulatora w którym co pętlę wyświetlisz wartości wszystkich zmiennych. A jak myślisz dlaczego na początku tych kodów jest $sim ? co z tego , że później potrzebujesz zmienną Z Nie później, a w trakcje wykonywania pętli. W tej pętli ta zmienna bardzo szybko się przepełni bo jest zbyt małej pojemności...
temp2temp jest tylko do sprawdzenia, wykluczenia tego, że to zmienna decicelsius2 jest winna wykrzaczaniu temp2, co pokazało, że nie, bowiem w temp2 i w temp2temp przy wykrzaczeniu są inne wartości. Co do zmiennej licznik, to ona się ma nie zerować, ponieważ liczę średnią temperaturę przez cały czas działania urządzenia, a więc potrzebuję sumę wszystkich...
Działa elegancko. Żeby było wiarygodnie to nawet wygrzebałem Ardu Leonardo z m32u4 na pokładzie. Na jedną rzecz bym jeszcze uważał. Twój kod nie jest w żaden sposób synchronizowany. Może się kiedyś zdarzyć, że jedna z wiadomości nie dojdzie. Z nie będzie miało wartości 3 i przy nastepnej wiadomości procesor zacznie przypisywać wartości innych zmiennych...
To jest typowa metoda konwersji za pomocą rzutowania typów i nie wymaga allokacji pamięci.
napotkałem kolejny problem: int foo(char *fmt, ...) { va_list parg; char *ptr; int arg_int; char arg_char; char arg_str; va_start(parg, fmt); for ( ptr = fmt; *ptr != '\0' ;) { if (*ptr == '%') { switch(ptr[1]) { case 'd': arg_int = va_arg( parg, int ); printf("\n...
więc moje pytanie dotyczy tego np parametru o którym napisałeś -Wconversion, on u mnie się w ogóle nie pojawia w makefile a pomimo to mam warningi przy takich ustawieniach jak poniżej na obrazku: ... Prototypy Twoich funkcji to: void lcd(char *); char* itoa(int, char*, int); Jak już pisałem - char, signed char i unsigned char to są...
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...
No ale jak licznik był zrzutowany na float to po podzieleniu przez 16 chyba dalej powinien być float. I wynik chyba powinien być float. Chyba że kolejność działań. No ale nawet jak najpierw podstawienie a potem dzielenie- to też nie tak. Wydawało mi się kiedyś że rozumiem rzutowanie- ale chyba nie.
Witam, W kodzie nie używam takich funkcji. Ale to co piszesz o tym stosie jest bardzo prawdopodobne. Zastanawiam się również jak to jest ze zmiennymi double, których też używam. Czy one mają 8 bajtów. Choć taki sam kod z doublami działa mi bez problemu na AT91SAM256. Wracając do stosu to w IAR w prosty sposób zaznacza się wyrównanie stotsu do 4 lub...
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...
Tak, to ja wiem, ale nie chcę deklarować dodatkowej zmiennej bo i po co... Nie chcesz deklarować zmiennej w pamięci ale jednak chcesz przekazać jej adres do funkcji. Good Luck.
A jemu chodzi o to żeby było 0x0044 Wiem, ale odniosłem wrażenie, że markosik20 uważa iż podgląd pamięci i podgląd pamięci przez zmienną pokazują co innego, a tutaj wszystko jest OK. Jeśli zawartość jest big-endian, to żadne rzutowanie tego nie zmieni - trzeba ręcznie zamienić bajty. Przy okazji - 4\/3!!
No właśnie jeśli wyśle liczbe 1.0001 - to otrzymam na terminalu .0001. Nie wiem co jest... próbowałem bawić się naprawdę podstawą podstaw tzn. robiłem rzut z float->int - nie działa; potem mnożenie *10 i /10 (też nic) tak, aby otrzymać tą część całkowitą. Niestety... buffor tab_1 niczym się nie zapełnia, tak jakby STM nie wiedział jaki jest wynik tych...
Innymi słowy dążysz do stworzenia potworka programowego, który pod pozorem uniwersalności niepotrzebnie komplikuje Twoje oprogramowanie. 4kB program bez "nadmuchaczy kodu" typu float itp. to już mały potworek ;) Wraz z ilością kodu potworek rośnie. Śmigły rycerz czy się boi czy nie potworków,może chcieć zmierzyć się z potworkiem i śmigle lub nie, śmignąć...
OK. Załóżmy, że mówimy o MPU-6050 którego właśnie poznaje. Z niego podobnie odczytuję dane z dwóch rejestrów 8 bit i składam w int16. Odczytując informację o położeniu czujnika. Jeśli musiałbym wykonać jakieś obliczenia na tej zmiennej int16, ale do obliczeń musiałbym użyć jak powyżej, czyli ( / 320 + 33.33 ) Zakładając, że to wynik podający temperaturę...
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...
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...
znak "ż" jest wielobajtowy i w momencie inicjalizacji zostanie przypisany do zmiennej typu "char" tylko najmłodszy bajt. Potem robisz rzutowanie z char na int (static_cast) a tam nastąpi powielenie najstarszego bitu ponieważ oba typy danych są ze znakiem (signed). Bajt 0xbc to 1011_1100, najstarszy bit oznacza liczbę ujemną i przy rzutowaniu na większy...
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...
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.
Po pierwsze uprość sobie tę funkcję, założenie do niej jest takie,że zawsze będziesz przesyłał C-string (czyli zakończony zerem) void wyslij(char *data) { while( *data ) usart_transmit( *data++ ); } Skoro użyłeś przydomka volatile dla zmiennej tablicowej a w deklaracji funkcji nie jest on (ten argument opatrzony takim...
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...
Zapytam jednak co oznacza zapis: Form1 formaGlowna = this.Owner as Form1; Ponieważ z poziomu form2 chcesz modyfikować obiekty znajdujące się na form1, to form2 musi mieć jakiś dostęp do form1. W tym celu do form2 musisz przekazać istniejącą instancję form1: można to zrobić na kilka sposobów, np. stworzyć konstruktor form2 z parametrem, który wywołasz...
Przecież napisałem że nie każde. Myśle że potrafisz czytać ze zrozumieniem. Podany przez ciebie kod też nie w każdym standardzie się skompiluje (dla standardu sprzed ANSI - niepoprawna deklaracja funkcji), ale nie bierzmy pod uwagę rzeczy wymarłych. Zawsze możesz się podzielić spostrzeżeniami na temat kodu. Od tego jest forum. Moim zdaniem strasznie...
Masz błąd w tej linii: [syntax=c] odczytane = (odczytane1<<8) | odczytane2; [/syntax] Dodaj rzutowanie. [syntax=c] odczytane = ((uint32_t)odczytane1<<8) | odczytane2; [/syntax]
Początek wygląda poprawnie. Pokaż resztę kodu, a przede wszystkim informację z bufora diagnostycznego o tym co spowodowało przejście w stop. Zamiast adresowania możesz spróbować bezpośredniego dostępu do obszaru Temp poprzez L (jeśli zmienna Czas w zakresie Temp ma adres początkowy 0, to LB0 będzie pierwszym bajtem) lub w SCL'u poprzez rzutowanie AT...
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....
typ pointer to jest w Pascalu odpowiedni w C to będzie void * , jest to najbardziej ogólny typ wskaźnika który można potem rzutować na dowolny typ struktury.
To problem kompilatora ale z mniejszej zmiennej zawsze sie dalo zrobic wieksza (w bajtach) w druga strone tez sie da ale trzeba cos odrzucic i to najlepiej swiadomie bo sie nabawimy dziwnych problemow :). To sie nazywalo rzutowanie i robi sie to automatycznie przy przypisaniu. Natomiast problem z bitami moze nastapic np gdy zrobisz sobie tablice z elementami...
Źle mnie rozumiesz... jeśli podasz 0 to X będzie miało wartość równą kodowi ASCII *znaku* 0 rzutowaną na int (bo char to byte a nie int). scanf() jest poleceniem języka ANSI-C choć po przemyśleniu - zachowa się tak samo jak cin... Jeśli chodzi o to zapętlanie się to jest chyba jakiś feler w Dev-Cpp, nie powinno się tak robić. P.S. Nie obraź się ale...
Spróbuj najpierw rzutować jeden z argumentów na Double. Dzielenie, które wykonujesz daje wynik typu takiego jaki jest najszerszy typ danych wejściowych czyli w tym wypadku liczba stałoprzecinkowa. Jeśli to c to spróbuj np. Ab=(Double)5/6. Wydaje mi się, że może o to chodzić. Z pewnością w javie i chyba c++ występuje takie zjawisko.
Nawiasy w programie mam dobrze tutaj je źle wpisałem. W zasadzie problem się rozwiązał gdy wszystkie zmienne zastosowałem long, tylko że "liczba" jest brana z tablicy i gdy jest long zajmuje dużo miejsca i nie wiem czy nie spowalnia mi programu, a potrzebuje aby wykonywał się maksymalnie szybko, wydaje mi się że próbowałem rzutowania, ale nie wiem czy...
Witam Można przecierz zastosować rzutowanie. float a; a=22.6879; int c; c=(int) a; double b; b=(double) c;
Spróbuj zrobić rzutowanie (tak się robi w delphi): var ZmiennaA : Integer; ZmiennaB : Real; begin ZmiennaA := Integer(ZmiennaB); end; Gdzie ZmiennaA to miejsce, gdzie trafi przekonwertowana na inny typ ZmiennaB Wiecej na ten temat znajdziesz tutaj: [url=]Link
Akurat postinkrementacja ma wyższy priorytet niż rzutowanie, więc Twój kod wykonuje arytmetykę na wskaźniku typu void*. Nie jest to prawdą. Operatory mają ten sam priorytet. I ten kod będzie działał. Bzdura - nie wiesz to nie pisz... Operator rzutowania ma niższy priorytet niż postinkrementacja, albo postdekrementacja. Ciekawostka jest jednak taka,...
Przy mnożeniu floatów przez stałe często widzi się "na siłę" robione ułamki, np. zamiast a*100 -- a*100.0, zaś przy przypisaniu tego do inta można jeszcze to rzutować... Może takie niepozorne zabiegi pomogą
scanf("%d",&a); scanf("%d",&b); %d do całkowiktych, %f do zmiennoprzecinkowych. Dalej już musisz dodać ten drugi kod który próbowałeś wcześniej czyli z rzutowaniem na typ float. Jeżeli chcesz tylko 2 miejsca po przecinku to zmień formatowanie na %.2f
Niejawne rzutowanie ma przy operatorze przypisania (=). Jeśli wartość ulong przypisujesz miennej o typie uint to następuje niejawne rzutowanie z ulong na uint. W pewnych sytuacjach kompilator może wygenerować warninga, że takie przypisanie prowadzi do zgubienia części wyniku.
Proszę :) Tak dla czystej funkcjonalności - nie lepiej Ci zmienić styl ComboBox'ów na DropDownStyle = DropDownList? Z tymi wartościami będzie nieco więcej roboty, bo są to typy wyliczeniowe. Możesz spróbować rzutować pozycję indeksu na odpowiedni typ wyliczeniowy, ale wtedy musisz tak wypisać kolejność na liście, żeby odpowiadała kolejności w typie,...
Dzięki mirek36, teraz działa. A z czego wynika ten warning? Przecież uint32_t jest 32 bitowa więc nie powinno być problemów z przesunięciem bitu na 18miejsce.. Dlaczego trzeba wykonywać te operacje rzutowania?
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.
A że tak zapytam - po co Ci coś takiego jest potrzebne? Przypuszczam że chcesz identyfikować klientów po nazwie? W takim wypadku wystarczy stworzyć klasę, np. taką: [syntax=csharp]public class NamedTCPClient { public TcpClient TcpClient { get; set; } public string Name { get; set; } }[/syntax] ewentualnie ułatwić sobie życie konstruktorem z parametrami...
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
Nie do końca rozumiem co chcesz osiągnąć, bo strasznie niejasno opisałeś problem. Jeśli chcesz "na chwilę" zmienić jakis obszar pamięci na volatile lub odwrotnie to możesz to zrobić poprzez wskaźniki i odpowiednie rzutowania wycinające lub dodające kwalifikator volatile
Nic nie robisz z wczytanym obrazem, po drugie zależy czy używasz Unicode (L przed stringiem), po trzecie nie piszesz jaki błąd... więc za wiele nie wywróżę. [syntax=cpp]pictureBox1->Image = Image::FromFile(L"c:/WINDOWS/kawa.bmp");... Lub kilku obrazkom przypisujesz jedno zdarzenie i rzutujesz sender na PictureBox: [syntax=cpp]dynamic_cast<PictureBox.....
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...
itoa -> integer to ascii string -> funkcja zmieniająca liczbę całkowitą na stringa. Nie floaty. Ale można ją próbować wykorzystać z rzutowaniem floata na inty, np.: [syntax=c] float liczba1; // (...) // liczba1 = coś; itoa( (int)liczba1, text, 3 ); // uzyskamy część całkowitą text[3] = ','; // wstawiamy przecinek - znak dziesiętny itoa( (int)(10*liczba1)%10,...
U rzutowaniu już słyszałeś? 4\/3!!
Z tym rzutowaniem nie masz racji. On nie rzutuje wartości tablicy na unsigned char, tylko stosuje wskaźnik na typ unsigned char Oczywiście masz racje - umknęła mi gwiazdka. Wywal to goto bo wygląda to co najmniej dziwnie. W ogóle zapomnij, że instrukcja goto istnieje. Z tym się niezupełnie zgodzę. Warto pamiętać, że istnieje, ale nie stosować. Pierwszy...
11.0592 to nie jest liczba całkowita :) int w czasie obliczeń jest zaokrąglany do liczb całkowitych i tu masz odpowiedź :) float Słowa kluczowego oznacza typu prostego, który przechowuje wartości zmiennoprzecinkowych 32-bitowych. int Słowa kluczowego oznacza typem całkowitym [url=]np w C# Na przykład następująca instrukcja generuje błąd kompilatora,...
Mogę zrobić jak piszesz, jak będę wiedział jak to zrobić. Napisz może dlaczego tak się dzieje i jak to zrobić:) Rzutowanie co jest mniej eleganckie od utworzenia nowej sekcji. Zobacz jak zdefiniowane jest np TIM1. Kompilator nie pluł eis o taki kod?
Bo nie robisz rzutowania z int do float.
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
(at)Sztuka_To_Tajfun Metoda print może pobierać również wartości typu int. Jak chcesz się tylko pozbyć części ułamkowej to po prostu dokonaj rzutowania float na int. Ewentualnie można jeszcze wynik zaokrąglić. Coś w stylu: [syntax=c] lcd.print((int)round(numer)); [/syntax]
IMHO to byłoby bez sensu (chociaż najwyrażniej twórcy gcc ten wariant zastosowali) Zaczyna to wyglądać na najeżdżanie na GCC (; Znajdź może choć JEDEN kompilator, który tego tak nie robi, bo coś mi się wydaje, że raczej to nie "twórcy GCC poszli na łatwiznę", tylko po prostu wszyscy tak robią. Zapewne tak robią, bo "tak ma być". Dodano po 1 o.. Freddie...
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...
Dokładnie tak jak piszesz, malloc to rezerwacja pamięci (memory allocation). Nawias to rzutowanie - informujesz kompilator, że świadomie chcesz przypisać wynik działania funkcji malloc (która zwraca wskaźnik na void - ) do wskaźnika na int.
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.
Pokaż jak wygląda całe przeliczenie, może da się jeszcze coś wymyślić. Teraz wygląda tak (wersja robocza): Trzeba tak dobierać mnożniki żeby dzielniki były potęgą dwójki. Czyli w tym przypadku zwiększyć dzielnik ze 100 na 128, i tle samo razy zwiększyć mnożnik, czyli ze 127 na 163: uint32_t newsample = (volume_coefficient *newbuffer Tutaj chyba nie...
moje oprogramowanie chociaż pewnie nie napisane najpiękniej, to jednak od ponad 2 lata działa bezbłędnie na setkach sztuk. Dopóki nie zmienisz czegoś w psychologii, będziesz sobie udowadniał bezbłędność, to ciągle poziom początkującego. Titanica też budowali optymiści, ja w inżynierii wolę pesymistów. Niech optymiści idą do marketingu. A samo zdanie...
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...
A ja dzisiaj tez mialem podobny problem. Zadeklarowalem sobie dwie zmienne: unsigned int i = 10; unsigned char ca[10]; i teraz zrobilem sobie nastepujace rzutowanie: *((unsigned int*)&ca[0]) = i; no i nie dziala... na avr'kach dziala, a na armie nie chce - abort mi sie wlacza (crossworks) i sobie loop'uje w obsludze aborta. Probowalem uzyc reinterpret_cast<>()...
Witam a może tak: [syntax=cpp] uint16_t liczba; uint8_t calkowita, ulamkowa; liczba = 1234; calkowita=liczba/100; ulamkowa=liczba%100; [/syntax] wtedy w oddzielnych zmiennych mamy cześć całkowita i cześć ułamkową. a obcinamy ostatnią liczbę instrukcją [syntax=cpp]ulamkowa=ulamkowa/10;[/synta...
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...
Program działa, chociaż wydaje mi się, że temperatura jest ciut zawyżona, no ale może i faktycznie taka jest. Mam jeszcze inny problem, a właściwie póki co za małą wiedze w temacie, żeby wiedzieć jak ten temat ugryź, a mianowicie: Mam tak zdefiniowane zmienne: ( or ) missing [IF(CHR(S2(1)) = 4 THEN] Assigment error...
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.
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,...
to jak masz tak, to zaywaz, ze te mozesz te warunki co bierzesz do if zapisac w jakis zmiennych, a pozniej wykorzystac raz drugi w rysowaniu... a nie obliczac to samo dwa razy... poczytaj o rzutowaniu/konwersji zmiennych/typow :)... przeciez nie rysujesz bezposrednio wartosci sin/cos, ale i tak musisz to przeskalowac na na piksele :)... wiec i tak bedziesz...
Operacje arytmetyczne na "stałych" które w kodzie zostały wpisane w postaci liczb (nie zmiennych) są wykonywane przez preprocesor, więc to on jest odpowiedzialny za błąd. Sprawdziłem poniższy kod i wartości są identyczne dla danej linii. W tym kodzie również chyba ten preprocesor bierze udział wciskając od razu wartość którą policzył. A skoro na konsoli...
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.
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!!
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.
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.
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);...
mam prośbę o wskazanie błędu który on zawiera. Błedem jest kolejne nadpisywanie dwóch różnych zmiennych do tej samej zmiennej ‘onTime’, oraz stosujesz błędny algorytm. Najpierw musisz zrozumiec koncept pomiaru czasu stosując w arduino metodę z ‘millis()’. Przydatne będzie przeanalizowanie przykładu dołączonego do Arduino IDE:...
Nawias mi się tylko na elektrodzie wstawił. W programie go nie mam :D To na razie program testowy którym ustawiam położenie napisów na LCD. Oczywiście docelowo będzie to konwertowało zmienne typu integer a nawet float. Swoją drogą, sprintf int16_t też nie łyka. Chce koniecznie integera. Też muszę rzutować? Tutaj mogę zrozumieć. Ale przypadku z volatile...
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]
Oczywiście bez const też nie działa ;) problem w tym że mam tablicę BYTE i muszę ją wysłać przez USB, czyli muszę ładować dane do 32-bitowego rejestru. I robię to przez rzutowanie. Tylko że to ARM 32-bitowy i żeby odczytać 4bajty na raz to adres tej zmiennej musi być wielokrotnością czwórki (taką ma budowę wew.). I tu mam problem bo gcc nie wstawia...
// 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:...
Wystarczy mieć zmienną zadeklarowaną jako Byte i zrobić rzutowanie. Przykłąd: Dim w as byte Dim f as single f=73.2 w=f print w ' uzyskasz 73
No trochę przesadziłeś z obliczeniami :) to jest niestety cały czas 8-bitowiec. Spróbuj rozpisać te działania matematyczne, bo prawdopodobnie nie jawne rzutowanie w którymś miejscu przekracza zakres zmiennej. EDIT: I pamiętaj że double i float dla kompilatora CX51 to są zawsze tylko 4bajty...więc żadnej różnicy nie ma.
Przerwania raczej się nie nakładają. Zrobiłem wersje z jednym przerwaniem używając 16 bitowego timera, przerywając jego wykonywania w przerwaniu zewnętrznym, oraz wersje bez przerwań (pętla while i _delay_us(1) ) i dalej to samo. Co to tego żę różne zmienne to się nie mogę zgodzić ponieważ: uint8_t to unisgned int uint16_t to unsigned long int Poza...
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 :)
Czy dla eeprom_read_byte powinno być ((uint8_t*)x), czy też uint16_t ? Oczywiście, że typ wskaźnika powinien odpowiadać typowi odczytywanej zmiennej. Ale ja tylko podałem rozwiązanie, co zrobić, żeby kompilator nie zgłaszał warninga. Przeczytaj jednak dokładnie to, co napisał kolega mirekk36 , bo takie ręczne przypisywanie adresów, w których zapisujesz...