Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 1 gru 2024, o 12:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 10 lis 2013, o 15:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

witam czy ten sposób zapisu obliczenia daty a dokładnie maksymalnego dnia danego miesiaca w dacie jest prawidłowy ?

Jeżeli jest prawidłowy to czy można to jakoś prościej zapisać ?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W sensie to że działa to wiem i sprawdzałem ale czy taki zapis jest dopuszczalny czy można jakoś prościej ?

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 17:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

Można też tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Inna metoda to tablica max. dni i korekcja na rok przestępny.

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 17:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

yhym...

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


pisałem tutaj na forum więc nie koniecznie musi działać ale pokazuje sposób

------------------------ [ Dodano po: kilkunastu sekundach ]

Ilu programistów tyle pomysłów :)

Z if'em nawet bardziej mi się spodobało

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 17:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A co powiecie na to?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 17:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

icer_cmg napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A co powiecie na to?


Można zrobić jeszcze na kilka sposobów. Zapis jest moim zdaniem niechlujny i bym go w życiu nie użył.
Kwiatki typu: max_dzien-=1 można śmiało zapisać jako max_dzien--;

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 17:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

icer_cmg napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A co powiecie na to?

Nigdy, przenigdy nie pisz w ten sposób. To tzw. spaghetti code. Daj to teraz komuś, niech to użyje w innym projekcie to będzie godzinę rozkminiał jak to działa.
Piszemy czytelny kod, używamy funkcji, tablicujemy zbiory liczb, nie stosujemy magic intów (liczb bezpośredno w kodzie).
Nagle zachce Ci się zmienić max_dzień z 31 na 32 (bo np. wyjedziesz na Malediwy a tam mają swój kalendarz) i co? Cały kod w łeb...

------------------------ [ Dodano po: 15 minutach ]

Ja bym zrobił tak:
stablicowałbym liczbę dni w każdym miesiący w roku (tablica 12 uintów8) dla roku przestępnego i nieprzestępnego - dwie tablice po 12 uintów8
Potem funkcja uint8_t liczba_dni(miesiac m, rok r) czy jak kto woli z angielska uint8_t days_nr(month m, year y)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


rok i miesiac to enumy.
Proste? Czytelne? Widać, o co kaman?


Funkcja rok_przestepny() banalna, chyba kazdy napisze sam.
Za wiki:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 21:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

Ledes wybacz ale zupełnie nieoptymalne jest robienie tego w tablicach, zużywasz zbyt dużo pamięci, zupełnie niepotrzebnie...

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 21:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Zużywasz zaledwie 24 bajty, które możesz umieścić nawet we Flashu przy pomocy instrukcji PROGMEM.
A myślisz, że Wasze kody bez tablic kompilator skompiluje optymalnie? Gdzieś i tak musi te liczby przechowywać.
A namnożenie ifów czy sum logicznych też nie jest optymalnym rozwiązaniem. ;)

------------------------ [ Dodano po: 3 minutach ]

Mało tego, masz tylko 4 możliwości: 28, 29,30, 31 dni w miesiącu. Co daje zaledwie 2 bity na miesiąc, żeby je zakodować - 0,1,2,3 czyli 00, 01, 10, 11. Używając pól bitowych w jednym bajcie zmieścisz 4 miesiące. Przy odkodowywaniu stosujesz maskowanie na 2 bity i dodajesz stały offsett + 28. Rok to 3 bajty, dwie tablice - 6 bajtów, które na dodatek możesz ulokować we Flashu. Nadal twierdzisz, że to pamięciożerne rozwiązanie?

Nie podchodźcie do sprawy "na hama", szukajcie optymalnych rozwiązań i miłych dla oka, czytelnych i o dużym reusabilty (ktoś inny bierze funkcję z Waszego kodu i ją używa w swoim programie). Piszcie tak, aby jak nastąpi zmiana założeń, to nie zmieniać tego w stu miejscach, a w jednym, np. w tablicy.

A co, jeśli następnym razem nie będą to miesiące, a długość dnia w roku w każdym dniu? Będziecie sprawdzać 365 warunków? Przecież to bez sensu.

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Ostatnio edytowano 10 lis 2013, o 21:33 przez Ledes, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 21:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

Ledes w Twoim przykładzie nic nie było o flash ;) dlatego się doczepiłem, sam wiem że można tak zrobić.

Jestem ciekawy co byłoby szybsze, przeszukanie if'a czy pętla po tablicy. Jest ktoś kto ma czas sprawdzić?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 21:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

dambo napisał(a):
a czy czasem np pcf8583 nie ma zapisanego w sobie dnia tygodnia ? wtedy wystarczy odczyt odpowiedniego bitu

Chodzi o maksymalny dzień danego miesiąca, a nie o bieżący dzień tygodnia.

arturf209 napisał(a):
Jestem ciekawy co byłoby szybsze, przeszukanie if'a czy pętla po tablicy. Jest ktoś kto ma czas sprawdzić?

Zróbcie crashtesty, jednak nawet jak tablica jest wolniejsza i zajmuje może 2 bajty więcej, to jest zdecydowanie bardziej czytelnym rozwiązaniem i bardziej eleganckim.

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 22:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

Codzilo mi o sam zapis nie o crahe ... no i nie uzywam pcf dzieki za idpowiedzi zostane przy ifach

Wysłane z telefonu

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2013, o 22:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Ehhhhh... i wszystko na nic...

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2013, o 10:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

Dlaczego na nic? Na tablicach jest ok ale to jeszcze nie dla mnie :) juz powoli koncze swoj 1 projekt niedlugo sie pochwale i pewnie dostane bure ;) ale to moj 1 gruby kod bedzie. Nastepne bede pisal optymalniej.

Wysłane z telefonu

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO