Strona 1 z 1

[c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 07:51
autor: foreste
Mam problem z rozgryzieniem odczytu kilku jednocześnie komórek tablicy mając

Kod: Zaznacz cały

DigitalOut   led[8] {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};

z niej wybrać
3 obiekty PC-2 ,PF-0 i PC-13
zapisując
jako led[moje komórki] = 0;
da rade napisać , czy trza użyć wektorów tablicowych i wrzucać tam moje komórki ?.
czy wyłuskiwać komórki i za pomocą for pętli i if ?.

Re: [c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 09:16
autor: SuperGość
Jak to jest problem dotyczący ogólnych rozważań języka C++ to należy pisać w odpowiednim miejscu i tam też przenoszę ;)

Re: [c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 16:17
autor: Antystatyczny
Zapewne i tym razem chodzi o MBED, więc trochę trzeba będzie zgadywać, bo nie używam tego tworu.

Tutaj masz tablicę ośmiu obiektów klasy DigitalOut:

Kod: Zaznacz cały

DigitalOut   led[8] {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};


Nie widziałem prototypu tej klasy, ale przypuszczam, że do tablicy zostaną wstawione obiekty odpowiadające pinom określonym w liście inicjalizacyjnej, a zatem:

led[0] - PC3,
led[1] - PC2,
led[2] - PF1,
led[3] - PF0,
led[4] - PC15,
led[5] - PC14,
led[6] - PC13,
led[7] - PB7

Zasadniczo można wyzerować piny używając takiego zapisu:

Kod: Zaznacz cały

led[1] = led[3] = led[6] = 0;


Można stosować pętlę for oraz wewnątrz warunek if, który sprawdzi kolejne bity zmiennej i odpowiednio ustawi poszczególne obiekty led. Oto przykład:

Kod: Zaznacz cały

DigitalOut led[8]  {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};   /* tablica obiektow typu DigitalOut */
   uint8_t x = 0xAA;   /* jakas przypadkowa wartosc */
   
   for (uint8_t i = 0; i < 8; ++i)
   {
      if( x & (1 << i) != 0 )/* test poszczegolnych bitow w zmiennej x */
      {
         led[i] = 1;
      }
      else
      {
         led[i] = 0;
      }
   }

Re: [c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 16:38
autor: foreste
Antystatyczny pisze:Zapewne i tym razem chodzi o MBED, więc trochę trzeba będzie zgadywać, bo nie używam tego tworu.

Tutaj masz tablicę ośmiu obiektów klasy DigitalOut:

Kod: Zaznacz cały

DigitalOut   led[8] {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};


Nie widziałem prototypu tej klasy, ale przypuszczam, że do tablicy zostaną wstawione obiekty odpowiadające pinom określonym w liście inicjalizacyjnej, a zatem:

led[0] - PC3,
led[1] - PC2,
led[2] - PF1,
led[3] - PF0,
led[4] - PC15,
led[5] - PC14,
led[6] - PC13,
led[7] - PB7

Zasadniczo można wyzerować piny używając takiego zapisu:

Kod: Zaznacz cały

led[1] = led[3] = led[6] = 0;


Można stosować pętlę for oraz wewnątrz warunek if, który sprawdzi kolejne bity zmiennej i odpowiednio ustawi poszczególne obiekty led. Oto przykład:

Kod: Zaznacz cały

DigitalOut led[8]  {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};   /* tablica obiektow typu DigitalOut */
   uint8_t x = 0xAA;   /* jakas przypadkowa wartosc */
   
   for (uint8_t i = 0; i < 8; ++i)
   {
      if( x & (1 << i) != 0 )/* test poszczegolnych bitow w zmiennej x */
      {
         led[i] = 1;
      }
      else
      {
         led[i] = 0;
      }
   }

Mam pytanie dotuczającej mojej tablicy , jaki typ danych tablicy pasuje do danych w mojej tablicy
uint8_t x = 0xAA; /* jakas przypadkowa wartosc */

Wyjaśnij m i tą liczbę 0xAA czym ona jest tym kodzie? , czy tylko to losowa liczba ?.

Re: [c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 16:45
autor: Antystatyczny
foreste pisze:Mam pytanie dotuczającej mojej tablicy , jaki typ danych tablicy pasuje do danych w mojej tablicy


Żeby odpowiedzieć na to pytanie, musiałbyś tu wkleić prototyp klasy DigitalOut, bo kompletnie nie znam MBED.

foreste pisze:Wyjaśnij m i tą liczbę 0xAA czym ona jest tym kodzie? , czy tylko to losowa liczba ?.


Masz napisane w komentarzu, że jest to jakaś przypadkowa wartość wpisana do zmiennej x. Ot, taką miałem fantazję, nic poza tym. Równie dobrze mogłem wpisać zero lub jakąkolwiek inną wartość.

Re: [c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 16:50
autor: foreste

Re: [c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 16:52
autor: Antystatyczny
Zgodnie z tym, co jest napisane w dokumentacji, operator = przyjmuje typ int.

Re: [c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 19:29
autor: foreste
Po zdefiniowaniu typu tablicy led typerm int pojawił błąd kompilacji aplikacji
kod

Kod: Zaznacz cały

#include "mbed.h"
 
DigitalIn mybutton(USER_BUTTON);
DigitalOut int led[8] {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};
 
int main() {
   
    for(int x=0; x<8; x++) {
        led[x] = 1 ;
    }
  while(1) {
          led[1] = led[5] = led[7] = 0;
      wait(1);
      led[1] = led[5] = led[7] = 1;
      wait(1);
  }
}


log kompilacji
*** Using Compiler 'V5.06 update 3 (build 300)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Nucleo_read_button2'
compiling main.cpp...
main.cpp(4): error: #84: invalid combination of type specifiers
DigitalOut int led[8] {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};
main.cpp(4): warning: #3337-D: list initialization syntax is a C++11 feature
DigitalOut int led[8] {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};
main.cpp(17): warning: #1-D: last line of file ends without a newline
}
main.cpp: 2 warnings, 1 error
".\build\uvision5\Nucleo_read_button2.axf" - 1 Error(s), 2 Warning(s).
Target not created.
Build Time Elapsed: 00:00:04

Re: [c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 19:33
autor: Antystatyczny

Kod: Zaznacz cały

DigitalOut int led[8] {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};


zamień na:

Kod: Zaznacz cały

DigitalOut  led[8] {PC_3, PC_2, PF_1, PF_0, PC_15, PC_14, PC_13, PB_7};


ponieważ DigitalOut to typ, więc nie możesz tam dodać typu int.

Dodatkowo, w związku z: "main.cpp(4): warning: #3337-D: list initialization syntax is a C++11 feature", musisz w ustawieniach kompilatora ustawić dialekt języka C++11, by móc korzystać z listy inicjalizacyjnej.

Re: [c++]tablice odczyt kilku komórek tablicy

: sobota 24 wrz 2016, 21:04
autor: j23
foreste pisze:Mam pytanie dotuczającej mojej tablicy , jaki typ danych tablicy pasuje do danych w mojej tablicy

Nie wiem czy dobrze zrozumiałem co zamierzasz zrobić Kolego, ale jeżeli chcesz tylko wybadać ZAKRES typu zmiennej (który z tego co pisze Kolega Antystatyczny jest typem już gdzieś zdefiniowanym), to możesz użyć operatora "sizeof", np.

Kod: Zaznacz cały

#include <iostream>
#include "twoj_plik_gdzie_jest_zdefiniowany_typ_danych_DigitalOut.h"
int main()
{
    std::cout << "Rozmiar DigitalOut to: "<< sizeof(DigitalOut[8])<< '\n'
              << "No pain no gain";
}


Wówczas nie bawisz się w dociekanie czy jest to int, short int, czy cokolwiek innego (bo możesz nie wiedzieć co to za typ danych DigitalOut, a interesuje Cię tylko tak naprawdę rozmiar), więc na podstawie tego co wyrzuci ci sizeof masz informacje jaki jest maksymalny rozmiar tych danych.

Więcej informacji w linkach poniżej:
http://en.cppreference.com/w/cpp/language/sizeof
http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Pojecie-zmiennej-i-podstawowe-typy-danych/11

Pozdrawiam! j23