Skocz do zawartości

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


SOYER

Pomocna odpowiedź

Cześć, nawiązując do wątku poruszonego w komentarzach tego artykułu, proszę o pomoc w przeróbce kawałka kodu, na "prostszy" z wykorzystaniem wskaźników. Będzie to moje pierwsze podejście praktyczne do wskaźników więc proszę o wyrozumiałość i cierpliwość:).

Kod, a raczej jego fragment:

temp_grzejniki_max = temp_grzejniki;
    dzien_temp_grzejniki_max = now.day();
    miesiac_temp_grzejniki_max = now.month();
    rok_temp_grzejniki_max = now.year();
  temp_grzejniki_min = temp_grzejniki;
    dzien_temp_grzejniki_min = now.day();
    miesiac_temp_grzejniki_min = now.month();
    rok_temp_grzejniki_min = now.year();
  temp_cwu_max = temp_cwu;
    dzien_temp_cwu_max = now.day();
    miesiac_temp_cwu_max = now.month();
    rok_temp_cwu_max = now.year();
  temp_cwu_min = temp_cwu;
    dzien_temp_cwu_min = now.day();
    miesiac_temp_cwu_min = now.month();
    rok_temp_cwu_min = now.year();

Widzimy tu zapisywanie maksymalnej i minimalnej temperatury z dwóch czujników, wraz z datą tego zdarzenia.

Teraz wklejam kod kolegi @ethanak z wymienionego wcześniej linku, który tam służył jako przykład, a tutaj(moim zdaniem) nadawał by się do obróbki ww. linijek mojego kodu.

int divide(int a, int b, int *remainder) { 
  if (remainder) *remainder = a % b; return a/b; 
}

// i gdzieś w kodzie 
int wynik1, wynik2, reszta1, reszta2; 
wynik1=divide(dzielna1, dzielnik1, &reszta1); 
wynik2=divide(dzielna2, dzielnik2, &reszta2);

Jednak pomny doświadczeń, zanim zacznę się produkować i wchodzić na tą górkę poproszę starszych w wierze kolegów o naprowadzenie, czy te linijki to na pewno najlepszy sposób na rozwiązanie akurat tego problemu, czy może jednak zacząć inaczej.

P.S. patrz drugie zdanie z tego posta:)).

Link do komentarza
Share on other sites

   fun(&dzien_temp_grzejniki_max, &miesiac_temp_grzejniki_max, &rok_temp_grzejniki_max);

void fun(int*a,int*b,int*c) {
  *a = now.day;
  *b = now.month;
  *c = now.year;
  }

Mi takie cos przychodzi do glowy...ale moze ktos cos krotszego podpowie😉 (akurat tutaj za wiele sie nie zmienia, tyle ze wywolanie funkcji w jednej linijce...ale krocej nie jest😉)

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Ja skrobie szkic, a jeszcze bardziej się po glowie...

saveMinMax(int *minimum, int *day, int *month, int *year, int temp) { // 
  if(minimum) *minimum = temp; 
  if(day) *day = day();
  if(month) *month = month();
  if(year) *year = year();
}

// i gdzieś w kodzie 
int temp_grzejniki_min, dzien_temp_grzejniki_min, miesiac_temp_grzejniki_min, rok_temp_grzejniki_min, temp_grzejniki; // i cała reszta zmiennych

  saveMinMax(&temp_grzejniki_min, &dzien_temp_grzejniki_min, &miesiac_temp_grzejniki_min, &rok_temp_grzejniki_min);

 

Link do komentarza
Share on other sites

@SOYER Może zacznij od poczytania o strukturach. Wskaźniki też się przydadzą, ale o ile ładniej wyglądałoby coś w rodzaju:

temp_grzejniki.wartosc = temp;
temp_grzejniki.dzien = now.day();
temp_grzejniki.miesiac = now.month();
temp_grzejniki.rok = now.year();

 

Edytowano przez Elvis
  • Lubię! 1
  • Pomogłeś! 1
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

2 minuty temu, Elvis napisał:

@SOYER Może zacznij od poczytania o strukturach. Wskaźniki też się przydadzą, ale o ile ładniej wyglądałoby coś w rodzaju:


temp_grzejniki.wartosc = temp;
temp_grzejniki.dzien = now.day();
temp_grzejniki.miesiac = now.month();
temp_grzejniki.rok = now.year();

 

Nie bardzo rozumiem, przecież tak wygląda mój pierwszy kod. Czy też ta kropka ma znaczenie?

Link do komentarza
Share on other sites

1 minutę temu, Elvis napisał:

Oczywiście że ma.

Zawsze miło Cię widzieć w moim wątku, dzięki, poczytam w takim razie o strukturach. To pewnie szeroki temat.

Link do komentarza
Share on other sites

Najpierw definiujesz sobie strukturę, np.:

struct zdarzenie {
	float wartosc;
    int dzien;
    int miesiac;
    int rok;
};

Poźniej, jak będziesz jej używał, to nie musisz przekazywać wszystkich wartości oddzielnie, przykładowo:

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

I taka funkcja wystarczy do zapisywania wszystkich zdarzeń, np.

save_temp(&czujnik1_max, 1);
save_temp(&czujnik1_min, 2);
save_temp(&czujnik2_max, 3);
save_temp(&czujnik2_min, 4);

 

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

1 minutę temu, SOYER napisał:

Zawsze miło Cię widzieć w moim wątku, dzięki, poczytam w takim razie o strukturach. To pewnie szeroki temat.

To nie uzywasz jeszcze struktur? E to poczytaj, bo to tez strasznie przydatne...masz np. 5 czujnikow i 5 zmiennych dla kazdego, upychasz to w tablice struktur i za pomaca indeksow i for robisz z tym co chcesz...ladnie, prosto to wyglada...bez powielania tego samego kodu dla obslugi tych zmiennych..

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

8 minut temu, farmaceuta napisał:

nie uzywasz jeszcze struktur?

Ja lamer samouk jestem:) Pracowity, uparty, pyskaty, ale lamer:). Poczytam o tych strukturach.

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

(edytowany)
22 godziny temu, Elvis napisał:

Najpierw definiujesz sobie strukturę, np.:




struct zdarzenie {
	float wartosc;
    int dzien;
    int miesiac;
    int rok;
};

Poźniej, jak będziesz jej używał, to nie musisz przekazywać wszystkich wartości oddzielnie, przykładowo:




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

I taka funkcja wystarczy do zapisywania wszystkich zdarzeń, np.




save_temp(&czujnik1_max, 1);
save_temp(&czujnik1_min, 2);
save_temp(&czujnik2_max, 3);
save_temp(&czujnik2_min, 4);

 

Ok @Elvisjuż wiem co napisałeś😀.

Najpierw tworzymy strukturę z czterema zmiennymi które nam są potrzebne do każdego z czujników.

Następnie tworzymy funkcję która odwołuje się do naszej struktury, a poprzez wskaźnik w argumencie, po wywołaniu będzie zapisywać dane do konkretnych zmiennych(bez tworzenia ich kopii) gdzie chcemy mieć to zapisane.

Wreszcie w prosty sposób wywołujemy naszą funkcję dla każdego z czujników, przekazując tej funkcji adres zmiennej gdzie ma zapisać dane, oraz odczytaną teperaturę.

Dobrze?

Fajne te struktury, wskaźniki też.

🍻🍻🍻

Dzisiaj już nie dam rady, jutro wkleję kod, to będziemy poprawiać.

 

Edytowano przez SOYER
Link do komentarza
Share on other sites

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

void (Dane * stru) {
  for(int i= 0; i<5; i++) {
  stru[i].x = costam;
  stru[i].y = costam;
  stru[i].z = costam;
    }
}

Mozna tez robic te tablice struktur jak powyzej...za jednym zamachem wypelniasz wszystkie zmienne..(ale to tylko taki przyklad niekoniecznie Cie interesujacy😉), wszystko zalezy od potrzeb..

Link do komentarza
Share on other sites

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(); 
}

 

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.