Skocz do zawartości

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


SOYER

Pomocna odpowiedź

saveTemp2(czujniki, odczyty);

odczyty sa globalne wiec wogole nie musisz robic argumentu...generalnie jak juz @ethanak wsponial to robienie bez konca wskaznikow (powielanie tablicy struktur) to tylko strata pamieci (i czasu)...tu wogole wskaznik nie potrzebny jest..😉 bo ta tablica jest globalna...no ja Ci wiele nie doradze bo zbyt [kwadratowo] sie zrobilo😜 (bede utrzymywal, ze nie potrzebnie)

Link do komentarza
Share on other sites

2 minuty temu, farmaceuta napisał:

bede utrzymywal, ze nie potrzebnie

A ja będę utrzymywał, że zabieranie głosu na temat "potrzebne/niepotrzebne" w takim kontekście bez znajomości całego kodu jest bez sensu i świadczy jedynie o tym, że albo się nie zna powodów zastosowania takiej czy innej konstrukcji i plecie się co ślina na język przyniesie, albo się jej po prostu nie rozumie i na wszelki wypadek (żeby nikt nie zapytał i się nie wydało) twierdzi się, że bez tego jest lepiej.

Którą wersję wybierasz?

Link do komentarza
Share on other sites

 

 

 

 
2 godziny temu, ethanak napisał:

A ja będę utrzymywał, że zabieranie głosu na temat "potrzebne/niepotrzebne" w takim kontekście bez znajomości całego kodu jest bez sensu i świadczy jedynie o tym, że albo się nie zna powodów zastosowania takiej czy innej konstrukcji i plecie się co ślina na język przyniesie, albo się jej po prostu nie rozumie i na wszelki wypadek (żeby nikt nie zapytał i się nie wydało) twierdzi się, że bez tego jest lepiej.

Zgodze sie ale nie akurat w kontekscie tego co wczesniej napisalem...co do znajomosci kodu to interesuje mnie tylko to ze do struktur zapisuje min i max temperature jesli trzeba...to wszystko😉 (o tym mowil @SOYER )

2 godziny temu, ethanak napisał:

Którą wersję wybierasz?

A taka...

define LICZBA_CZUJNIKÓW 15

struct sensors{
  czujnik_temp
  tempmin, 
  tempmax,
  dzienmin, 
  dzienmax,
  miesiacmin,
  miesiacmax
  rokmin,
  rokmax,
  godzmin,
  godzmax,
  minutamin,
  minutamax;
};
struct sensors czujniki[LICZBA_CZUJNIKÓW];

void saveTemp(){
  for (i = 0; i < LICZBA_CZUJNIKÓW; i++) {
  if(czujniki[i].czujnik_temp < czujniki[i].tempmin){
 czujniki[i].tempmin = czujniki[i].czujnik_temp;
 czujniki[i].dzienmin = now.day();
 czujniki[i].miesiacmin = now.month();
 czujniki[i].rokmin = now.year();
  //  etc
  }
    if(czujniki[i].czujnik_temp > czujniki[i].tempmax){
 czujniki[i].tempmax = czujniki[i].czujnik_temp;
 czujniki[i].dzienmax = now.day();
 czujniki[i].miesiacmax = now.month();
 czujniki[i].rokmax = now.year();
  //  etc
  }
  
}

(Sory za dziwna skladnie...mam popi.......................telefon😡) juz nie wytrzymam z tym trupem...

Co do kodu (jest niekompletny) to wybral bym go nie dlatego ze ja go napisalem, tylko dlatego ze jest bardziej czytelny..(dla mnie!😜) dodatkowo temperatura konkretnego czujnika odrazu w konkretnej strukturze

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

(edytowany)

 

enum{grzejniki, cwu, piec, slonce, grunt, zew, wilg, cisnienie, LICZBA_CZUJNIKOW=8};

int odczyty[8];

struct sensors{
  int temp, dzien, miesiac, rok;
};

struct sensors czujniki[LICZBA_CZUJNIKÓW][2];
void saveTemp(struct sensors *wsk,  int *odczyt){
  
  wsk->temp = odczyt;
  wsk->dzien = now.day();
  wsk->miesiac = now.month();
  wsk->rok = now.year();
}


void saveTemp2 (struct czujniki *czujnik, int *wskaznikNaOdczyty)
{
  for(i=0; i<LICZBA_CZUJNIKÓW; i++{

    if (wskaznikNaOdczyty[i] < czujnik[i][0].temp) saveTemp(&czujnik[i][0], odczyty[i]);
    if (wskaznikNaOdczyty[i] > czujnik[i][1].temp) saveTemp(&czujnik[i][0], odczyty[i]);
}}

//wywołanie:
saveTemp2(czujniki, odczyty);

Słusznie prawicie, co teraz?

Co do funkcji saveTemp2, ja to rozumiem tak wywołuję funkcję saveTemp2 z argumentami czujniki i odczyty.

w ciele funkcji sprawdzam czy (po kolei) 1,2,3... pozycja w tablicy odczyty jest mniejsza niż zawartość 1,2,3.. komórki pierwszego wymiaru tablicy czujniki, drugi wymiar tablicy to [0] bo sprawdzam minimum, jeśli tak to odpalam funkcję saveTemp i przekazuję jej że ma zapisać w tablicy czujniki[1,2,3...][0...min] to co zawarte w tablicy odczyty[1,2,3...].

Dobrze myślę? Gdzie i czemu źle wpisuję &, *, [] ?

Edytowano przez SOYER
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

50 minut temu, SOYER napisał:

w moim mniemaniu to wskaźnik na tablicę odczyty[], jak to poprawnie zapisać?

    saveTemp(&czujnik[i][0], odczyty[i]);
    saveTemp(&czujnik[i][0], odczyty[i]);

nazwa tablicy jest wskaznikiem (stalym) na pierwszy jej element...z naciskiem na pierwszy😉 uzywajac nawiasow kwadratowych otrzymujesz juz wartosc sod danego adresu a nie sam adres...czyli tak (chyba😉)

    saveTemp(&czujnik[i][0], &odczyty[i]);
    saveTemp(&czujnik[i][0], &odczyty[i]);

 

Link do komentarza
Share on other sites

@ethanakczyli 

void saveTemp(struct sensors *wsk,  int

void saveTemp(struct sensors *wsk,  int odczyt){

i tu bez zmian:

if (wskaznikNaOdczyty[i] < czujnik[i][0].temp) saveTemp(&czujnik[i][0], odczyty[i]);

?

Link do komentarza
Share on other sites

enum{grzejniki, cwu, piec, slonce, grunt, zew, wilg, cisnienie, LICZBA_CZUJNIKOW=8};

int odczyty[8];

struct sensors{
  int temp, dzien, miesiac, rok;
};

struct sensors czujniki[LICZBA_CZUJNIKÓW][2];

void saveTemp(struct sensors *wsk,  int *odczyt){
  
  wsk->temp = odczyt;
  wsk->dzien = now.day();
  wsk->miesiac = now.month();
  wsk->rok = now.year();
}


void saveTemp2(){

  for(i=0; i<LICZBA_CZUJNIKÓW; i++{

    if (odczyty[i] < czujniki[i][0].temp) saveTemp(&czujnik[i][0], &odczyty[i]);
    if (odczyty[i] > czujniki[i][1].temp) saveTemp(&czujnik[i][0], &odczyty[i]);
}}

//wywołanie:
saveTemp2();

Cześć, po tygodniu wracam, przeczytałem jeszcze raz kilka ostatnich stron tego wątku. Powyżej wklejam kolejną wersję kodu. Rozumiem, że jeśli i struktura

struct sensors czujniki[LICZBA_CZUJNIKÓW][2];

jak i tablica z odczytami z czujników

int odczyty[8];

są globalne to mogę się do nich odwoływać bezpośrednio, tak też zrobiłem w funkcji saveTemp2()

Nie wiem czy prawidłowo przekazuję argumenty do funkcji saveTemp()?

Link do komentarza
Share on other sites

@SOYER, nie gniewaj się, ale używanie tablic 2-wymiarowych to bardzo kiepski pomysł. Jeśli nie wierzysz, to popatrz poniżej i poszukaj błędu:

    if (odczyty[i] < czujniki[i][0].temp) saveTemp(&czujnik[i][0], &odczyty[i]);
    if (odczyty[i] > czujniki[i][1].temp) saveTemp(&czujnik[i][0], &odczyty[i]);

Jako podpowiedź, pomyśl czy za miesiąc, dwa, albo za pół roku będziesz pamiętał co oznacza "czujnik[ i][0]", a co "czujniki[ i][1]".

Edytowano przez Elvis
  • Lubię! 1
Link do komentarza
Share on other sites

Ja pewnie będę pamiętał, bo tych szkiców malutko piszę, w tym przypadku tablica też nieduża, ale rozumiem, że pomysł jest nietęgi dla ew. przypadku rozwinięcia tego do większych rozmiarów.

Co proponujesz? Zakładamy dwie(?) funkcje, jedna od razu, przy uruchomieniu programu, zapisuje wszystkie odczyty z czujników jako max i min wraz z datą, druga co jakiś czas, po kolejnym odczycie, sprawdza wartości i ew. zapisuje nowe max lub min wraz z datą.

 

Link do komentarza
Share on other sites

 

if (odczyty[i] < czujniki[i][0].temp) saveTemp(&czujnik[i][0], &odczyty[i]); if (odczyty[i] > czujniki[i][1].temp) saveTemp(&czujnik[i][1], &odczyty[i]);

Poprawiłem ewidentny błąd, ale nie wiem czy tylko o to chodziło.

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.