Skocz do zawartości

Prośba o pomoc przy przeróbce kodu na taki z wykorzystaniem wskaźników


SOYER

Pomocna odpowiedź

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

10 godzin temu, ethanak napisał:

Co pchasz do tej tablicy? Pokaż kod

Wieczorem usiądę. Do tablicy odczyty[] chciałem zapisać odczyty z czujników, w tej samej kolejności w jakiej mam tablicę czujniki[]. Następnie porównać zawartość obu.

10 godzin temu, ethanak napisał:

Inna sprawa, że gdybyś zachował moją wersję saveTemp2 tablica "odczyty" byłaby w ogóle niepotrzebna...

no tak, ale zamiast tego miałbym 8 różnych zmiennych z odczytami z czujników, tak właśnie mam teraz, chciałem uprościć, zapisać w tablicy i porównywać tablice. 

Zły kierunek, czy wykonanie, czy to i to?

Link do komentarza
Share on other sites

1 godzinę temu, SOYER napisał:

zamiast tego miałbym 8 różnych zmiennych z odczytami z czujników

A po co te zmienne?

Załóżmy, że istnieje funkcja odczytująca temperaturę z czujnika numer n, coś w stylu:

int readTemp(int n);

Załóżmy, że korzystamy z zaproponowanej uprzednio funkcji:

void saveTemp2 (struct czujnik *czujnik, int temp)
{
    if (temp < czujnik[0].temp) saveTemp(&czujnik[0], temp);
    if (temp > czujnik[1].temp) saveTemp(&czujnik[1], temp);
}

                               

Wtedy wystarczy prosta pętla:

for (int i = 0; i < LICZBA_CZUJNIKOW; i++) {
  saveTemp2(&czujniki[i], readTemp(i));
}

Nie ma żadnej drugiej tablicy, żadnej dodatkowej zmiennej.

Dodatkowo dla tych, co maja problem ze zrozumieniem tablic dwuwymiarowych możemy nieco zmienić strukturę sensors:

struct wskazanie {
  int temp;
  int dzien;
  int miesiac;
  int rok;
};

struct sensors {
  struct wskazanie tempMin, tempMax, tempLast;
};

Tym razem wszystko jest już jasno określone... łącznie z bieżącą temperaturą i czasem, kiedy została odczytana. Trzeba tylko nieco zmienić saveTemp2:

void saveTemp2 (struct czujnik *czujnik, int temp)
{
  saveTemp(&czujnik->tempLast);  
  if (temp < czujnik->tempMin.temp) saveTemp(&czujnik->tempMin, temp);
  if (temp > czujnik->tempMax.temp) saveTemp(&czujnik->tempMax, temp);
}

                               

Wszystko wygląda na razie ładnie, ale jest problem: dla 30 czujników tablica zajmie 2 * 4 * 3 * 30 = 720 bajtów - strasznie dużo! A przecież powinniśmy jeszcze zapisywać dokładny czas pomiaru, a nie tylko dzień, czyli dwa dodatkowe inty... Da się to jakoś zmniejszyć?

Teoretycznie można wywalić pole tempLast i zastąpić je zwykłym intem radośnie zakładając, że czas dokonania pomiaru jest ten sam dla każdego czujnika (co nie zawsze musi by prawdą). Spróbujmy więc trochę zaoszczędzić:
 

struct wskazanie {
	int8_t temp; // od -128 do 127 stopni, powinno wystarczyć jeśli nie jest to huta
	uint8_t minuta;
  	uint8_t godzina;
  	uint8_t dzien;
  	uint8_t miesiac;
  	int8_t rok;
};

Jak można policzyć, oszczędzamy trzy bajty na każdym czujniku mimo dodania dodatkowych pól. Ale mimo wszystko tablica zajmie 630 bajtów... dalej strasznie dużo! Da się jakoś lepiej?

Oczywiście! Możemy zapisywać czas jako Unix Time, czyli 32-bitową liczbę oznaczającą ilość sekund od 1 stycznia 1970. Wtedy mamy:
 

struct wskazanie {
  int8_t temp;
  time_t czas;
};

Jakoś nam się struktura uprościła, a i tablicę się odchudziło do 450 bajtów! Ale to wciąż trochę za dużo... spróbujmy dojść do minimum!

Zastosujmy więc coś, co może nam jeszcze bardziej ograniczyć rozmiar tablicy, czyli pola bitowe.

Przede wszystkim: temperatura od -128 do 127 to chyba nieco za dużo, wystarczy od -64 do 64 (ew. z jakimś przesunięciem). Czyli nie 8 a 7 bitów. Również nie są nam potrzebne nadmiarowe bity w pozostałych polach, a rok możemy liczyć przyjmując jako 0 odniesienia choćby rok 2022.

Tak więc:

struct wskazanie {
  signed int temp:            7; // od -64 do 63
  unsigned int minute: 6; // zakres 0..63 wystarczy do 60 minut
  unsigned int hour:   5; // zakres 0..31 wystarczy do 24 godzin
  unsigned int day:    5; // zakres 0..31 wystarczy do 31 dni
  unsigned int month:  4; // zakres 0..15 wystarczy do 12 miesięcy
  unsigned int year:   5; // zakres 0..31 rzutujemy na lata 2022..2051
};

W sumie wychodzi nam 32 bity (cztery bajty), czyli wielkość tablicy wyniesie teraz 4 * 3 * 30 = 360 bajtów, a więc połowę tego co w pierwszej wersji mimo wprowadzenia dodatkowych dwóch pól!

 

Link do komentarza
Share on other sites

Nie rozumiem juz nic z tego co tu sie dzieje😁 tmin,tmax,min,sek,godz,rok,mie,dzien....

Osiem bajtow w strukturze razy 15 czujnikow = 120 bajtow...

Tfu tfu...jeszcze trzeba dni minuty dla drugiej temp dodac...czyli 6*15 = 90 czyli 210 bajtow dla 15 czujnikow

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

2 minuty temu, ethanak napisał:

Rozumiem, że tmin i tmax wystąpią jednocześnie o tej samej porze?

Z tego co ja zrozumialem to mamy zapisac minimalna temperature i maksymalna jesli takie wystapia i zapisac kiedy...nic pozatym..wiec nie rozumiem powyzszego?🤔 Do funkcji dwa warunki ktore sprawdzaja min i max wzgledem temp i tyle...

Link do komentarza
Share on other sites

2 minuty temu, farmaceuta napisał:

mamy zapisac minimalna temperature i maksymalna jesli takie wystapia i zapisac kiedy

To jak chcesz zapisać dwa oddzielne wydarzenia (wystąpienie temperatury maksymalnej i minimalnej) w jednym zestawie zmiennych określających czas? Pomyśl:

  • wystąpiła temperatura minimalna, zapisujesz czas
  • za godzinę wystąpiła temperatura maksymalna, zapisujesz czas
  • a potem się zastanawiasz, o której to wystąpiła ta minimalna, bo jakaś menda to nadpisała 😉
  • Lubię! 1
Link do komentarza
Share on other sites

1 minutę temu, ethanak napisał:

To jak chcesz zapisać dwa oddzielne wydarzenia (wystąpienie temperatury maksymalnej i minimalnej) w jednym zestawie zmiennych określających czas? Pomyśl:

  • wystąpiła temperatura minimalna, zapisujesz czas
  • za godzinę wystąpiła temperatura maksymalna, zapisujesz czas
  • a potem się zastanawiasz, o której to wystąpiła ta minimalna, bo jakaś menda to nadpisała 😉

Aaaa o to Ci chodzi😜 juz do edytowalem bo zapomnialem dopisac blizniacze zmienne dla tempmax...czyli jedna struktura ma 14 bajtow i w niej jest wszystko dla min i max temp...czyli te 210 bajtow dla 15 czujnikow..

Link do komentarza
Share on other sites

No to porównaj - moja struktura zawierająca takie same dane miałaby 8 bajtów, przy czym identycznie odwołujesz się do obu pomiarów.

Pamiętaj, że program nie tylko zapisuje dane do tych tablic, ale w jakimś celu to robi i pewnie z nich korzysta...

 

Link do komentarza
Share on other sites

(edytowany)

Słusznie prawicie, poczytam później na spokojnie, ale sposób @ethanakwydaje się, jak zwykle, do bólu prosty i skuteczny.

Dodam jeszcze jedną rzecz komplikującą, program działa na arduino mega, ten z kolei jest połączony bezpośrednio tylko z jednym czujnikiem(którego odzcytów akurat nie zapisuję). Cała reszta bieżących odczytów siedzi w mega, pod postacią zmiennych zaciągniętych z 5szt esp8266.

Edytowano przez SOYER
Link do komentarza
Share on other sites

2 minuty temu, ethanak napisał:

No to porównaj - moja struktura zawierająca takie same dane miałaby 8 bajtów

Nie no jasne ze mozna uzyc pol bitowych, tym bardziej ze odwolywac sie do nich mozna poprostu po nazwie bez kombinowania z przesuwaniem bitow etc...wiec jak najbardziej mozna wykorzystac😜

 

4 minuty temu, ethanak napisał:

Pamiętaj, że program nie tylko zapisuje dane do tych tablic, ale w jakimś celu to robi i pewnie z nich korzysta...

 

No tak, choc nie do konca rozumiem w czym mialby byc problem...ja bym zrobil tak jak podalem wczesniej przyklad...jedyne co to dla ulatwienia poslugiwania sie tymi strukturami to dorzucil bym ten enum zamiast indeksu i wtedy latwo prosto intuicyjnie...ale to tylko zdanie poczatkujacego jakim jestem😉

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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