Skocz do zawartości

Określenie rozmiaru tablic globalnych w trakcie kompilacji


farmaceuta

Pomocna odpowiedź

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)...

Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

😅...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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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()...

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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? 

Link do komentarza
Share on other sites

#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😅

Link do komentarza
Share on other sites

#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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.