Arduino Polska Forum

Pełna wersja: TABLICA float =>int
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3 4
Jak w temacie jest jakaś elegancka metoda z tablicy Float zrobić int..

Mam w programie liczby float do wykresu, aby mieć "stabilna podstawę"
robie tak   

// -- definicje  tablic  na zmienne 24 szt

int       Blue_probki1[24] ={};                    
float    Blue_probki2 [24] ={};                  

//---wycinek kodu  -float-->int      
Blue_probki1[i]Blue_probki2[i];

wszystko działa ale nie podoba mi sie ze marnuje dynamic memory deklarując jeszcze jedna tablice

fajnie by było zrobić cos takiego aby sie skróciło do pełnej int  z  floatu

Blue_probki2[i ,0]Blue_probki2[i];

Jakieś porady po prostu nie wiem  
Jak flota wrzucisz do zmiennej INT to będzie INT. Albo to jest tak proste albo nie rozumiem z czym walczysz, opisz szerzej problem. Używanie flat w Arduino AVR nie jest dobrym pomysłem.
Używanie flat w Arduino AVR nie jest dobrym pomysłem.
Właśnie  właśnie ... ta operacja kładzie mi program 

Chciałem przepisać 

int Red_pomiarINT[24] ={};
float Red_pomiarFL[24] ={};

 Red_pomiarINT[j]= Red_pomiarFL[j];   

program się kompiluje wgrywa 
ale w urządzeniu się zawiesza na przepisaniu tablic można to zrobić  jakoś inaczej ...
A czemuodrazu nie odczytujesz do inita?? Program się kładzie bo jest przerwa i pewnie kropka. Byś musiał z tablicy wyciągnąć same liczby te co cię interesują.
na  pierwszym   etapie  czytam liczbę  pozyskaną  z  czujnika  float i na  ekran  dokładniejsza  2 liczby po kropce
na kolejnym obrabiam liczbę do użytku -->użytkuje dla elementów wykonawczych 
na koniec  fantazja mnie poniosła na  ekran rysuje  sobie  wykres  słupkowy ,podstawa mi skacze o piksel na  floacie bo niezaokrąglony int  załatwił by sprawę ...

int  z floata 

Jezu chryste leżało przedemną

for( int i = 0; i < probki; i++ )
         {
              Blue_pomiarINT[i]= Blue_pomiarFL[i];   
         }
Nie jest najlepszy pomysł z floatami bo generują pewne niedogodności:
- zwiększają kod wynikowy
- obliczenia są wolne
- liczby niedokładne
- porównania == nie  zadziałają
- nie można użyć w niektórych przypadkach.
W Arduino są używane bardzo często i uC jakoś sobie z nimi radzi, po prostu jak jest do wyboru int i float to lepiej int.   Jak ktoś w kodzie używa delay(1000) to i float w prędkości mu nie zaszkodzi, po prostu trzeba o tym pamiętać.
No i nie jest to ZAOKRĄGLENIE float do int, tylko obcięcie.
Np. liczby 11.12,13.14,15.99 zostaną zamienione na 11, 13 i 15. Jak chcesz zaokrąglić to jest do tego specjalna funkcja w Arduino.
Nie widzę całego kodu, ale jak chcesz użyć floata jako int to wystarczy tak:
Kod:
float tab[3]={11.12,13.14,15.99};
for (int i=0;i<3;i++)
{
Serial.println((int)tab[i]);    
}



Mam nadzieję  @Jarewa0606, że nie masz na myśli kropek zapisanych w komórce pamięci zajmowanej przez float Big Grin? To tylko 32 0 i 1, tak samo jak przy int32_t czy long, tylko inaczej interpretowane.
Niestety pomimo zachwytu nie rozwiązałem problemu.

wszystkie próby "przerobienia" tablicy float do tablicy int powodują zawieszanie programu.

1) przypisanie jednej do drugiej =
2) przepisanie komórki po komórce
3) Najciekawsze
Wczytanie równoległe do tablicy INT i do tablicy Float w tej samej pętli

4) Wczytanie INT w pierwszej pętli i Wczytanie float w następnej

Magia Arduino ... jestem zawiedziony, ale się nie poddaje.

Dodatkowe zawiechy w wyrzucie na ekran .. np

to działa     Display.setCursor(12,13);Display.print("T1_OFF");Display.setCursor(62,13);Display.print(t1_OFF);
ale jak powtużę ...
Display.setCursor(12,13);Display.print("T1_OFF");Display.setCursor(62,13);Display.print(t1_OFF);
Display.setCursor(22,26);Display.print("T1_ON"); Display.setCursor(62,26);Display.print(t1_ON);

Gleba Smile
To nie dlatego, że Arduino jest magiczne czy złe, tylko dlatego że jest tak proste, że nawet nie mając pojęcia o programowaniu wybrałeś właśnie je na początek. Wrzuć cały kod, który nie działa razem z bibliotekami, może ktoś odtworzy warunki i zauważy o co chodzi.
Ile pamięci zostaje po kompilacji?
A więc na poczekaniu zmajstrowałem kod obrazujący problem sercem są cztery pętle pracujące niezależnie od siebie na "milisach " . Mozna by je porównać do blink bez delay dla dwóch ledów równolegle taka struktura czasowa, aby czytać co określony czas czujniki temperatury i zapisywać do przesuwanych tablic dla wykresów ...

Dwie tablice float dwie int po 23 próbki dla zobrazowania wszystko jest osobno bez funkcji
jeśli mam 3 tablice nic sie nie gryzie dołączenie czwartej powoduje "glebę"... wystarczy odkomentowac czwartą ...czwarta pętla "gleba będzie widoczna po zablokowaniu leda na ledPin6 ...

CODE    w 137  lini  usuncie    }    jeden  za dużo   jak powiedziałem jest  to wyolbrzymiony problem 
który testowałem  na wiele sposobów  rozwiązać  ...

Najlepiej zacząć przeglądać kod od  loop() zmienych 60% nie potrzebnych w tym przykładzie
Dla uproszczenia sprawdziłem 

for(int i = (probki-1); i > 0 ; i--)
       {
          Blue_pomiarFL[i] = Blue_pomiarFL[i-1];
          Red_pomiarFL[i] = Red_pomiarFL[i-1];
          Blue_pomiarINT[i] = Blue_pomiarINT[i-1];
          Red_pomiarINT[i] = Red_pomiarINT[i-1];
       }
          Blue_pomiarFL [0] =  temperatura1;
          Red_pomiarFL [0] =  temperatura1;
          Blue_pomiarINT [0] =  temperatura2; 
          Red_pomiarINT [0] =  temperatura2;

Po prostu nie ma takiej możliwości ... na czterech tablicach               na 3 jest
//----------------------------------------------
Działa takie cos ...

     for(int i = (probki-1); i > 0 ; i--)
       {
          Blue_pomiarFL[i] = Blue_pomiarFL[i-1];
          Red_pomiarFL[i] = Red_pomiarFL[i-1];
       
       }
          Blue_pomiarFL [0] =  temperatura1;
          Red_pomiarFL [0] =  temperatura1;
         
          
            for(int i=0;i<probki;++i)
       {
             Blue_pomiarINT[i] = Blue_pomiarFL[i];
             Red_pomiarINT[i] = Red_pomiarFL[i];
       }
Do momentu dalszej obróbki
Stron: 1 2 3 4