Skocz do zawartości

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


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];

 

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

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?

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

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.

(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

@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;

 

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

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

18 minut temu, SOYER napisał:

Nie czaje...

x=y=z;

to to samo co:

x=z;
y=z;

Przydaje się, szczególnie jeśli ten "z" to jakieś piętrowe wyrażenie.

(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

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