Skocz do zawartości

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


SOYER

Pomocna odpowiedź

4 minuty temu, SOYER napisał:

 Co do bitów, przesuwania itp. darujcie mi proszę na razie.

Dlatego pokazałem pola bitowe - prosto, skutecznie, bez żadnego przesuwania (to ostatnie to zadanie dla kompilatora a nie człowieka, niech on się też trochę pomęczy).

10 minut temu, SOYER napisał:

pod postacią zmiennych zaciągniętych z 5szt esp8266.

Można teoretycznie zaciągać bezpośrednio do saveTemp2 😉

9 minut temu, farmaceuta napisał:

dla ulatwienia poslugiwania sie tymi strukturami to dorzucil bym ten enum zamiast indeksu

Gdzie, w pętli? Bo poza pętlą przecież jest enum, a dla ułatwienia to zaproponowałem jeszcze #define (niewykorzystane hgw why).

Link do komentarza
Share on other sites

3 minuty temu, ethanak napisał:

Gdzie, w pętli? Bo poza pętlą przecież jest enum, a dla ułatwienia to zaproponowałem jeszcze #define (niewykorzystane hgw why).

No nie w petli...enum poza petlami i funkcja, tylko do poslugiwania sie w kodzie "gdzies tam" zeby nie pisac stru[7].temp tylko stru[KUCHNIA].temp...wtedy latwo (to jest to o czym mowiles wlasnie) a w petli i funkcji tylko indeks zeby mozna w for sobie sprawdzac..

Link do komentarza
Share on other sites

1 minutę temu, farmaceuta napisał:

do poslugiwania sie w kodzie "gdzies tam" zeby nie pisac stru[7].temp tylko stru[KUCHNIA].temp

Przecież tak jest w kodzie... przynajmniej kol. @SOYER tak zrobił, bo ja zaproponowałem coś w stylu kuchnia.temp 🙂

 

Link do komentarza
Share on other sites

15 minut temu, SOYER napisał:

 Co do bitów, przesuwania itp. darujcie mi proszę na razie.

Na spokojnie sie zainteresuj bo w jednym bajcie mozesz miec 8 wartosci true/false np...lub podczas przesylania mozna duzo zmiennych "skompresowac"

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

8 minut temu, ethanak napisał:

Przecież tak jest w kodzie... przynajmniej kol. @SOYER tak zrobił, bo ja zaproponowałem coś w stylu kuchnia.temp 🙂

 

Nie no tak tak...potwierdzam😉 tak tylko mowie jako przypomnienie...chociaz dalej nie rozumiem ulatwienia w uzyciu tablic dwu wymiarowych...i w powyzszych kodach chyba jest blad bo przekazujac do funkcji tablice musze okreslic oba wymiary a nie tylko pierwszy...a teraz jest "stru[0]" i stru[1] a ten "wymiar" okresla powiedzmy tem min...

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

O to mi chodzi, ale juz chyba odwoluje bo znow kod sie zmienil...😜

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

5 minut temu, farmaceuta napisał:

przekazujac do funkcji tablice musze okreslic oba wymiary a nie tylko pierwszy

A kto Ci takich bzdur naopowiadał???

Pamiętaj że tablice n-wymiarowe dla n>1 w C/C++ są traktowane jako "tablice tablic", i w takim przypadku przekazujesz do funkcji dalej tablicę, tylko mniejszą i o ilości wymiarów o jeden mniejszej.

Nie chce mi się pisać przykładu, w ramach pracy domowej napisz sam 🙂

 

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

1 minutę temu, ethanak napisał:

A kto Ci takich bzdur naopowiadał???

Nie nie...zle sie zrozumielismy...chodzilo mi o to ze do funkcji podaje adres konkretnej struktury, bo w funkcji juz nie sprawdzam nic tylko zapisuje wartosci do tej struktury...powyzej dalem wycinek kodu

Link do komentarza
Share on other sites

18 minut temu, farmaceuta napisał:

chodzilo mi o to ze do funkcji podaje adres konkretnej struktury

Tyle że tam jest tablica struktur, czyli:

struct cośtam tablica[ileśtam][2];

Więc jeśli przekazujemy do funkcji np. tablica[7], to dostaje ona wskaźnik na konkretny element tablicy - który w naszym przypadku sam jest tablicą, a ściślej tablicą zawierającą dwie konkretne struktury.

 

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

23 minuty temu, ethanak napisał:

 




struct cośtam tablica[ileśtam][2];

 który w naszym przypadku sam jest tablicą, a ściślej tablicą zawierającą dwie konkretne struktury.

 

No wlasnie dwie...a w funkcji wykonawczej mam wskaznik na strukture, wiec jesli nie podalem drugiego wymiaru w argumencie podczas pobrania adresu to wskaznik bedzie zawsze wskazywal na na jakis element tablicy (pierwszy wymiar) i zawsze na element "0" drugiej wymiaru...no ja tak to rozumiem..🤔

Ok..juz nie smiece😉 choc nie rozumiem pewnej rzeczy...troszke pozniej wkleje calosc zeby bylo widac o co mi chodzi

Edytowano przez farmaceuta
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, *odczytTemp){
  
  wsk->temp = odczytTemp;
  wsk->dzien = now.day();
  wsk->miesiac = now.month();
  wsk->rok = now.year();
}


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

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

chodzi mi o to powyzsze w ostatnich dwoch if'ach nie powinno byc? (czyli oba indeksy?)


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

 

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

@farmaceuta - po prostu kolega @SOYER zrobił coś dziwnego - chciał przerobić funkcję przeznaczoną do zapisu pojedynczego pomiaru w funkcję zapisującą całą tablicę. A takie przerabianie - jak widać na załączonym obrazku - nie zawsze wychodzi na zdrowie.

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

Dobra, dzień z racji krótkiego urlopu upłynął na robocie w ogródku, śledzeniu sytuacji na Ukrainie i obserwacji operacji lotniczych NATO w Polsce na flightradar.

Teraz wracam do kodu, dajcie mi chwilę.

Link do komentarza
Share on other sites

Poprawiłem ewidentny błąd(z którego zdaję sobie sprawę, o innych pogadamy) o którym wspomniał @farmaceutaw ostatnich postach, oto mój aktualny kod:

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

int odczyty[8];// tablica ze zmiennymi zawierającymi aktualne odczyty z czujników

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

struct sensors czujniki[LICZBA_CZUJNIKÓW][2];  // drugi wymiar tablicy to min i max

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


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

    if (temp[i] < czujniki[i][0].temp) saveTemp(&czujniki[i][0], &odczyty[i]); //np. jeśli odczyty[1] < czujniki[1][min] to wtedy to tablicy czujniki[1][0] zapisz wartość z tablicy odczyty[1]
    if (temp[i] > czujniki[i][1].temp) saveTemp(&czujniki[i][0], &odczyty[i]);
}}

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

Teraz zostawmy na chwilę optymalizację kodu, jego poprawianie ze względu na wydajność itp. Chciałbym żebyście mi wytknęli ewidentne błędy merytoryczne w tym kodzie, bo dla mnie jest tu dużo nowych rzeczy i nie chcę się jeszcze bardziej pogubić.

Właśnie nad głową przeleciał nam c-130 hercules usarmy, na wysokości 4000stóp, wow

Link do komentarza
Share on other sites

@SOYER

void saveTemp(struct sensors *wsk, *odczytTemp)

Po jakiemu to? Bo rozumiem że chodzi o int *odczytTemp?

Jeśli tak, to po kiego grzyba to wskaźnik? Szczególnie, że za chwilę masz

  wsk->temp = odczytTemp;

gdzie odczytTemp to najwyraźniej int a nie wskaźnik?

Dalej:

Zdecyduj się, jak przekazujesz odczyty do funkcji saveTemp2. Przede wszystkim znowu język Zulu Gula:

void saveTemp2 (struct czujniki *czujnik, *temp) 

Jakiego typu jest tu temp?

A w ciele funkcji posługujesz się raz temp, innym razem odczyty, przy czym odczyty to tablica globalna a temp to ta sama tablica przekazana jako parametr. Widzisz w tym jakiś głębszy sens?

Ja rozumiem, wskaźniuki to taka nowość, fajne są, ale posługiwanie się wskaźnikami nie oznacza, że od dzisiaj wszystko będzie na wskaźnikach. Czasami potrzebny jest zwykły int...

 

 

Edytowano przez ethanak
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.