Arduino C++ suportă array-uri dinamice de obiecte (Arduino, Programare, Matrice, Vector, Orientat Pe Obiecte)

Duncan C a intrebat.

C++-ul meu este serios depășit și lucrez la un proiect care va jongla cu mai multe acțiuni temporizate în același timp, cu un sistem de meniu pentru a gestiona interfața și a controla aceste acțiuni temporizate (un controler de priză electrică cu mai multe canale.)

Pentru a face controlul am de gând să am o matrice de obiecte care să fie deservite de fiecare dată prin bucla de evenimente. În prezent, folosesc o matrice statică de obiecte în C, dar aș dori să folosesc o matrice dinamică în C++ în care să pot adăuga și elimina obiecte în funcție de necesități.

Știu că unele caracteristici ale bibliotecii standard C++ nu sunt acceptate pe Arduino. Cred că C++ numește array-urile inteligente vectori și cred că vectorii fac parte din biblioteca standard, care nu este suportată/este complet suportată pe Arduino. Există vreun fel de clasă de matrice dinamică disponibilă?

Comentarii

  • github.com/maniacbug/StandardCplusplus –  > Por jose can u c.
  • ce pentru o matrice dinamică? luați ca matrice statică maximul de care puteți/aveți nevoie. nu există niciun alt proces care ar putea folosi memoria. pe un MCU AVR simplu, fără concurență, puteți planifica exact memoria –  > Por Juraj.
1 răspunsuri
Michel Keijzers

Chiar dacă ar fi posibil să folosiți array-uri dinamice, nu v-aș recomanda, mai ales pe un Arduino Uno/Mega cu doar 2 sau 8 KB de memorie.

În schimb, creați un element de date static (de exemplu, array) care are un număr maxim (rezonabil) de elemente create. Acest lucru are, de asemenea, avantajul că constructorul nu va fi apelat după inițializare, deci fără variații în timpul de execuție (construcția obiectelor poate lua timp).

Pentru a gestiona mai multe elemente în cadrul acestui element de date, puteți:

  • Folosind un buffer în inel, aceasta este modalitatea normală de a stoca elementele pe o parte și de a le procesa din cealaltă parte (așa-numitul FIFO, first in first out).
  • Folosind o stivă (pentru LIFO, last in last out, adică ultimul intrat, ultimul ieșit).
  • Pentru array-uri, păstrați o variabilă care să rețină numărul de elemente umplute în prezent.

Comentarii

  • Codarea C de școală veche. Sigur, sunt familiarizat cu aceste tehnici. Am lucrat prea mult timp pe dispozitive cu tone de memorie și multă putere de procesare. A trecut mult timp de la zilele în care trebuia să scriu aplicații în asamblor pe 8 biți. În aceste zile am ajuns să mă bazez pe construcțiile de nivel superior integrate în limbaj/OS. Cu siguranță este o ajustare și este ciudat să ai un limbaj precum C++ pe un microcontroler. Provoacă o oarecare disonanță cognitivă. –  > Por Duncan C.
  • Ar funcționa și o simplă listă legată simplu. –  > Por Duncan C.
  • @DuncanC Am aceeași problemă … fiind inginer de software, mă gândesc în liste, matrice (dinamice), stive, cozi etc. O listă cu o singură legătură este, de asemenea, dinamică. Lucrurile se complică atunci când trebuie să introduceți elemente într-o listă existentă (și să eliminați în unele cazuri). –  > Por Michel Keijzers.
  • „Lucrurile se complică atunci când trebuie să introduceți elemente într-o listă existentă”? Cum așa? Inserarea și eliminarea elementelor pare mai ușoară cu o listă, nu mai dificilă. Mai ușor, în unele privințe, decât o matrice fixă cu stegulețe goale pentru fiecare intrare –  > Por Duncan C.
  • De fapt, de ce să vă deranjați cu o matrice booleană? Pur și simplu folosiți NULL pentru sloturile goale și verificați dacă există NULL înainte de a acționa asupra unei intrări din matrice. Apoi pot adăuga gestionarea memoriei care distruge obiectele pe măsură ce sunt eliminate. –  > Por Duncan C.