Skocz do zawartości

Określenie rozmiaru tablic globalnych w trakcie kompilacji


Pomocna odpowiedź

Napisano

Witam wszystkich...jak w najprostszy sposób ustalić rozmiar tablic w trakcie kompilacji? Da się to jakoś zrobić bez alokacji? Mam sobie z 10 tablic które są używane przez piny, nie chciał bym tworzyć na sztywno tych tablic bo każda musiała by mieć z kilkadziesiąt elementów a to by było ze 400 bajtów...(chodzi o prościutką bibliotekę do obsługi pinów) metody będą wspólne dla wszystkich pinów, więc będzie stworzony tylko jeden obiekt (stąd te tablice)...

@farmaceuta możesz to przetłumaczyć na jakiś powszechnie rozumiany język (np. polski)?

Jakoś nie bardzo rozumiem pojęcie globalnych tablic które nie są ani statyczne ani dynamiczne...

Aha, rozumiem że słowo "singleton" jest Ci znane i nie o to tu chodzi...

  • Lubię! 1

😅...Mam 10 tablic których używam do obsługi pinu...teraz chce używać jednego pinu więc tablice muszą być jedno-elementowe...a innym razem będę używał 5 pinów więc tablice muszą być 5-elementowe..to będzie zawarte w libsie

Ale potrafisz określić ilu pinów będziesz używać? Bo jeśli tak, to wystarczy jedna alokacja (nie wiem czemu się jej boisz, w końcu utworzenie obiektu to też alokacja) albo wręcz wkompilowanie rozmiaru dla n pinów (jeśli wiesz to już w czasie kompilacji).

Poza tym co trzymasz w tych tablicach? Każdy bit wykorzystany? Bo tu też można znaleźć oszczędności.

 

  • Lubię! 1
11 minut temu, ethanak napisał:

Ale potrafisz określić ilu pinów będziesz używać? Bo jeśli tak, to wystarczy jedna alokacja (nie wiem czemu się jej boisz, w końcu utworzenie obiektu to też alokacja) 

 

Tak tak... ilość pinów znana z góry..no nie boje się alokacji tylko się rozleniwilłem sakramencko i ciężko zmusić mózg do działania 😁 

13 minut temu, ethanak napisał:

Poza tym co trzymasz w tych tablicach? Każdy bit wykorzystany? Bo tu też można znaleźć oszczędności.

 

A no można zaoszczędzić... trochę bool,int'ow,long dla millis()...

(edytowany)

Bool to może byc jeden bit na przykład, int też nie musi mieć 16 czy 32 bitów.

Piszesz to ogólnie dla wszystkich proców czy dla konkretnego?

A w ogóle to pokaż tę tablicę.

Edytowano przez ethanak
8 minut temu, ethanak napisał:

Piszesz to ogólnie dla wszystkich proców czy dla konkretnego?

Tzn. myślałem o esp32 i Ardu ewentualnie...tylko muszę sobie przypomnieć kompilację warunkową bo ESP posiada np. INPUT_PULLDOWN...no i w sumie zastanawiam się czy kompilacją warunkową by nie załatwił tych tablic? 

#define UP 2
#define DOWN 3

long last[10];
bool pin_stan[10];
byte pin[10];
bool pin_LH[10];
byte stan[10];
byte ilosc_pin = 0;
long interval[10];
long last_raz[10];
byte stan2[10];
long last_dwa[10];
long last2[10];







void setup() {
  pin_setup(UP, INPUT_PULLUP, LOW, 30);
  pin_setup(DOWN, INPUT_PULLUP, LOW, 30);

  Serial.begin(9600);
}

void loop() {
  updat();
  
  if (time_pin(UP, 1000, 1100)) {
      Serial.println("10");
    
  }
 
  if (pres(UP)) {
    Serial.println("1");
 }
  if (pres(DOWN)) {
    Serial.println("0");
  }
}


void updat() {

  for (int i = 0; i < ilosc_pin; i++) {

    if (digitalRead(pin[i]) == pin_LH[i]) {
      if (stan[i] == 0) {
        last[i] = millis();
        stan[i] = 1;
      }
      if (millis() - last[i] > interval[i] && stan[i] == 1) {
        pin_stan[i] = 1;
        stan[i] = 2;

      } else {
        pin_stan[i] = 0;
      }
    } else {
      stan[i] = 0;
      pin_stan[i] = 0;
   
    }

  }
}


void pin_setup(byte pinn, int stan, byte LH, int tim) {

  static int i = 0;

  if (stan == INPUT_PULLUP) {
    pinMode(pinn, INPUT_PULLUP);
  }
  if (stan == INPUT) {
    pinMode(pinn, INPUT);
   }
  pin[i] = pinn;
  interval[i] = tim;
  pin_LH[i] = LH;
  ilosc_pin++;
  i++;
}


bool pres(byte pinn) {
  for (int i = 0; i < ilosc_pin; i++) {
    if (pinn == pin[i]) {
      return pin_stan[i];
    }

  }
}


bool time_pin (int pinn, int time_raz, int time_dwa) {
  
 for (int i = 0; i < ilosc_pin; i++) {
  if (pinn == pin[i]) {
    if (digitalRead(pin[i]) == pin_LH[i]) {
      if (stan2[i] == 0) {
         stan2[i] = 1;
         last2[i] = millis();
      } 
      if (millis() - last2[i] > 30 && stan2[i] == 1) {
       last_raz[i] = millis();
       stan2[i] = 2;
       return true;
    }
      
    if (millis() - last_raz[i] > time_raz && stan2[i] == 2) {
      stan2[i] = 3;
      last_dwa[i] = millis();
      return true;
    } 
    if (millis() - last_dwa[i] > time_dwa && stan2[i] == 3) {
      last_dwa[i] = millis();
      return true;
    } 
  } else {
      last_raz[i] = millis();
      stan2[i] = 0;
     
  }
   return false;
 }
}
}

Tylko prosze..nie krzycz na mnie za nazewnictwo, i ogolnie za skladnie logiki😅

#define N 10

#define UP 2
#define DOWN 3

long last[N];
bool pin_stan[N];
byte pin[N];
bool pin_LH[N];
byte stan[N];
byte ilosc_pin = N;
long interval[N];
long last_raz[N];
byte stan2[N];
long last_dwa[N];
long last2[N];

? xD

  • Lubię! 1
void init(int n)
{
	last = (long*) calloc (n, sizeof(long)); 
	// ...
  
}

Jakoś tak też się dało, ale nie pamiętam dokładnie jak. Tylko może się nagle okazać, że pamięć jest zbyt poszatkowana, by zmieścić więcej danych.

  • Lubię! 1
(edytowany)

No to inaczej (jak to ma działać na małym Ardu):

struct PharmaPin {
    uint32_t last;
    uint32_t last_raz;
    uint32_t last_dwa;
    uint32_t last2;
    uint16_t interval;
    unsigned int pin:5;
    unsigned int stan2:2;
    unsigned int pin_stan:1;
    unsigned int stan:2;
    unsigned int pin_LH:1;
} *PharmaPin;
uint8_t ilosc_pin;

Masz 20 bajtów.

W sumie 16 bitów na interval to i tak za dużo, dla 8-bitowców można np. trzymać tylko najstarsze 5 bitów z 9-bitowej liczby, masz wtedy 18 bajtów.

No i później:

PharmaPin = calloc(ilosc_pin = n, sizeof(*PharmaPin));

i wszystko masz w jednym kompaktowym kawałku

Edytowano przez ethanak
  • Lubię! 1
4 minuty temu, farmaceuta napisał:

lub coś w konstruktorze? (rozmiar)

Ale to zakłada właśnie alokację dynamiczną której się tak panicznie boisz że jeden calloc Ci rozwali program 😉

  • Lubię! 2

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...