Skocz do zawartości

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


SOYER

Pomocna odpowiedź

typedef struct {
  x;
  y;
  z;
} Dane;
Dane dane[5];

ja bym to inaczej zapisał, (poza tym że składowe struktury są pozbawione typów). 

typedef struct {
  int x;
  int y;
  int z;
} Dane_t; // TU widać że powołujesz nowy typ danych
Dane_t dane[5];

 

Link do komentarza
Share on other sites

10 minut temu, SOYER napisał:

Cześć, pytanie czy to:




void save_temp(struct zdarzenie *z, float temp) {
  z->wartosc = temp; 
  z->dzien = now.day(); 
  z->miesiac = now.month(); 
  z->rok = now.year(); 
}

to to samo co:




void save_temp(struct zdarzenie *z, float temp) {
  z.wartosc = temp; 
  z.dzien = now.day(); 
  z.miesiac = now.month(); 
  z.rok = now.year(); 
}

Nie.

z->wartosc można zapisać jako (*z).wartosc 😉 

Niektóre kompilatory same sobie poprawiają ten błąd. Ogólnie strzałkę stosuje się jak obiektem źródłowym (z) jest wskaźnik a kropkę jeżeli jest to sam obiekt (np. struktura).

#define DATA_SIZE 5

typedef struct {
  int x, y, z;
} Dane_t; // TU widać że powołujesz nowy typ danych

Dane_t dane[DATA_SIZE];

Imo osobiście wolę taki zapis, ale nie każdy kompilator to ogarnia.

Edytowano przez H1M4W4R1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Kolejne pytanie czy to :

void save_temp(struct zdarzenie *z, float temp) {

 z->wartosc = temp;

 z->dzien = now.day();

 z->miesiac = now.month();

 z->rok = now.year();

}

mogło by wyglądać tak:

void save_temp(struct zdarzenie &z, float temp) {

 z.wartosc = temp;

 z.dzien = now.day();

 z.miesiac = now.month();

 z.rok = now.year();

}

i wtedy to :

save_temp(&czujnik1_max, 1);

zamieniamy na to:

save_temp(czujnik1_max, 1);

si? or no?

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

@SOYER Ale chciałeś wskaźniki czy referencje? Bo co prawda kompilator wewnętrznie generuje taki sam (albo bardzo podobny) kod, ale sposób użycia jest inny. Radzę zacząć od wskaźników.

Link do komentarza
Share on other sites

Wybaczcie chłopaki, ale usiadłem do tego mojego kodu i czarna dupa. Dlatego próbuję się połapać co i jak. Zostanę oczywiście(?) przy wskaźnikach w takim razie.

Już wiem jak to napisać, chyba. Dajcie mi jeszcze 10min.

Link do komentarza
Share on other sites

(edytowany)
struct sensors{
  int temp, dzien, miesiac, rok;
};
sensors grzejniki, cwu;

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

//gdzieś w kodzie
saveTemp(&grzejniki, temp_grzejniki);
saveTemp(&cwu, temp_cwu);

//jeśli chcę terazpobrać jakąś wartość z tej struktury to piszę tak?:

jakasZmienna = sensors.grzejniki.temp; //?tak?

Najpierw napiszcie czy to poprawne, potem będę ew. pytał dalej...

Edytowano przez SOYER
Link do komentarza
Share on other sites

@SOYER

Albo

struct sensors grzejniki, cwu;

albo:

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

sensors grzejniki, cwu;

Ale typedefy na razie sobie daruj, wszystko w swoim czasie (wiem że @farmaceuta i @_LM_ będą chcieli od razu, ale niech weźmą na wstrzymanie).

Poza tym:

jakasZmienna = grzejniki.temp;

Kompilator wie doskonale że grzejniki to sensors i nie trzeba mu tego przypominać - podobnie jak nie piszesz:

a = int 5;

 

Link do komentarza
Share on other sites

14 minut temu, SOYER napisał:



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

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

//gdzieś w kodzie
saveTemp(&grzejniki, temp_grzejniki);
saveTemp(&cwu, temp_cwu);

//jeśli chcę terazpobrać jakąś wartość z tej struktury to piszę tak?:

jakasZmienna = sensors.grzejniki.temp; //?tak?

Najpierw napiszcie czy to poprawne, potem będę ew. pytał dalej...

Wszystko dobrze ztym ze..

jakasZmienna = grzejniki.temp;
jakasZmienna = cwu.temp;

Sensor jest nazwa typu jak int etc...(jesli jest typedef, ktorego braku nie zauwazylem😜)

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

(edytowany)

Dobra, to wygląda, że coś załapałem, teraz ten sam kod tylko z MIN i MAX:

struct sensors{
  int tempMin, dzienMin, miesiacMin, rokMin, tempMax, dzienMiax, miesiacMax, rokMax;
};
struct sensors grzejniki, cwu;

void saveTemp(struct sensors *wsk, int odczytTemp){
  wsk->tempMin = odczytTemp;
  wsk->dzienMin = now.day();
  wsk->miesiacMin = now.month();
  wsk->rokMin = now.year();
  wsk->tempMax = odczytTemp;
  wsk->dzienMax = now.day();
  wsk->miesiacMax = now.month();
  wsk->rokMin = now.year();
  wsk->rokMax = now.year();
}

//gdzieś w kodzie
saveTemp(&grzejniki, temp_grzejniki);
saveTemp(&cwu, temp_cwu);

//wywołanie

jakasZmienna = grzejniki.tempMin; 

Pytanie, czy to musi tak wyglądać czy da się prościej? Na razie zakładamy, że powyższy kod wykonuje się na początku, po odpaleniu programu, zapisuje odczyty z czujników jako minimalne i maksymalne jednocześnie, wraz z datą. 

Potem(a może już powinienem nad tym myśleć?) będę się zastanawiał jak to zrobić by po następnym odczycie z czujników, kiedy temperatura np. wzrośnie, zapisać tylko nową tempMax wraz z datą.
 

Edytowano przez SOYER
Link do komentarza
Share on other sites

Jest dobrze...a co do kolejnych zapisow poszczegolnych zmiennych no to juz trzeba chyba na warunkach kombinowac...mozna zrobic dwie tablice ( po jednej dla struktury) o ilosci zmiennych w strukturze i dla kazdej zmiennej if z flaga czy zapisac nowa wartosc czy nie...i tymi flagami operowac w kodzie...np 

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

12 minut temu, ethanak napisał:

możesz to skrócić - pamiętaj, że operator podstawienua zwraca wynik.

Czyli 


x=y=z;

 

Nie czaje... choć szukałem podpowiedzi, to nie wim o co chodzi

Link do komentarza
Share on other sites

(edytowany)

aaa, nie wiedziałem, że tak można...

ja to skróciłem tak:

struct sensors{
  int temp, dzien, miesiac, rok;
};
struct sensors grzejnikiMin, grzejnikiMax, cwuMin, cwuMax;

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

//gdzieś w kodzie
if(temp_grzejniki<grzejnikiMin.temp){
 saveTemp(&grzejnikiMin, temp_grzejniki);
}
if(temp_grzejniki>grzejnikiMax.temp){
 saveTemp(&grzejnikiMax, temp_grzejniki);
}
//itd.

Przy okazji zniknął problem oddzielnego ładowania danych min i max.

Teraz pytanie, mam takich czujników około 15, dla każdego min i max co daje nam 30, sporo pisania, a może nie?

Tablice struktur, struktury tablic, jeśli tak to jak to ugryźć, a może jeszcze inaczej podejść do tego?

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