Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Projekt

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Projekt

Postautor: wojteq07 » 5 lis 2010, o 21:54

Witam,
Jako projekt na uczelnię muszę zrobić zegar z synchronizacją przez serwer NTP.

Mam ten program napisany w języku C, który zajmuje ponad 900 linijek i się kompiluje bez problemów. Podobno działa, ale nie dostałem jeszcze z uczelni tego urządzenia (bo z innych wydziałów ktoś też robi ten projekt) by to sprawdzić.
Mam też schematy i opisy po angielsku mikrokontrolera ATmega32.

Problem polega na tym, że ten kod to dla mnie czarna magia... Nie mam pojęcie co to przerwania, nie rozumiem tych instrukcji, które ustawiają jakieś bity bez końca i to niby powoduje pobranie z serwera sekundy, minuty i godziny i pokazanie go na wyświetlaczu w formie trzech dwucyfrowych liczb...

Potrzebuje pomoc od kogoś kto się na tym zna i mi pomoże. Wystarczy tylko przerobić jedną funkcję, która de facto działa, ale jest nie do końca dobrze napisana i to ją mamy poprawić. Czy ktoś byłby mi w stanie popatrzeć w kod?

Oto i ona:

Kod: Zaznacz cały

void liczas(int *temp, int *wynik) { int j; while(!((temp[0]==tab[0])&&(temp[1]==tab[1])&&(temp[2]==tab[2])&&(temp[3]==tab[3]))) { w[5]++; if (w[5]==60) { w[5]=0; w[4]++; //minuta if (w[4]==60) { w[4]=0; w[3]++; //godzina if (w[3]==24) { w[3]=0; w[2]++; //dzien if (((w[2]>31)&&(w[1]==1)) || ((w[2]>31)&&(w[1]==3)) || ((w[2])>31&&(w[1]==5)) || ((w[2]>31)&&(w[1]==7)) || ((w[2]>31)&&(w[1]==8)) || ((w[2]>30)&&(w[1]==11)) || ((w[2]>31)&&(w[1]==12)) || ((w[2]>30)&&(w[1]==4)) || ((w[2]>30)&&(w[1]==6)) || ((w[2]>30)&&(w[1]==9)) || ((w[2]>31)&&(w[1]==10)) || ((w[2]>28)&&(w[1]==2)&&((w[0]%4))) || ((w[2]>29)&&(w[1]==2)&&((w[0]%4)==0))) { w[2]=1; w[1]++; //miesiac if (w[1]==13) { w[1]=1; w[0]++; //rok } } } } } //przechodzenie przez koelejne pozycje licznika hex. tab[3]++; if (tab[3]==256) { tab[3]=0; tab[2]++; if (tab[2]==256) { tab[2]=0; tab[1]++; if (tab[1]==256) { tab[1]=0; tab[0]++; } } } } for(j=0; j<6; j++) wynik[j]=w[j]; }
Nie mam pojęcia co jeszcze przydatnego powinienem wkleić. Pomóżcie proszę mnie jakoś oświecić, naprowadzić, wytłumaczyć co to ustrojstwo robi...

Jeśli ktoś mi się tym zajmie od początku do końca to wysyłam mu flaszkę!

Awatar użytkownika
r-mik
-
-
Posty: 351
Rejestracja: 14 cze 2005, o 19:18
Lokalizacja: Wawa
Kontaktowanie:

Re: Projekt

Postautor: r-mik » 6 lis 2010, o 09:07

Witam,
Jako projekt na uczelnię muszę zrobić zegar z synchronizacją przez serwer NTP.
(...)
Problem polega na tym, że ten kod to dla mnie czarna magia... Nie mam pojęcie co to przerwania, nie rozumiem tych instrukcji, które ustawiają jakieś bity bez końca i to niby powoduje pobranie z serwera sekundy, minuty i godziny i pokazanie go na wyświetlaczu w formie trzech dwucyfrowych liczb...
(...)
Nie mam pojęcia co jeszcze przydatnego powinienem wkleić. Pomóżcie proszę mnie jakoś oświecić, naprowadzić, wytłumaczyć co to ustrojstwo robi...
Proponuję zmienić szkołę.
Jeśli ktoś mi się tym zajmie od początku do końca to wysyłam mu flaszkę!
Flaszkę?
Mam nadzieję, że to żart.

Skoro urządzenie jest gotowe to myślę, że 3000...5000zł by wystarczyło (czyli 120...200 flaszek).

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 6 lis 2010, o 11:30

Studiuje informatykę, ale ktoś kto układał program studiów uznał, że muszę też umieć programować mikrokontrolery AVR by być informatykiem. Mam już wyspecjalizowane plany odnośnie przyszłości i ona na pewno nie będzie się wiązała z mikrokontrolerami...

5000zł za naniesienie poprawki do jednej funkcji?
Chyba ty żartujesz...
Prawdopodobnie to kwestia godziny roboty, dla kogoś kto się na tym zna... Bo funkcja działa, ale nie do końca poprawnie = gdzieś jest błąd, który trzeba odnaleźć i poprawić. Funkcja ma ile... 40 linijek?
W ogóle to pierwsze słyszę by zegarek z mechanizmem za 135zł kosztował po zaprogramowaniu kilka tysięcy...
On tylko wyświetla trzy dwucyfrowe liczby!

W takim razie chciałbym u Ciebie pracować jako programista C++, bardzo chętnie będę Ci przerabiał funkcje za 5tyś zł. To było by jakieś 150razy więcej niż to co dostaje teraz... 5tyś zł za 1-2 czy 3h to wymarzona płaca...

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 6 lis 2010, o 13:51

Studiuje informatykę
I ani me ani be w C/C++ ? Wstyd, masz przecież "Symfonię C++" Grębosza - godzinka nauki i masz wszystko jak na tacy. A o Atmedze masz kupę książek (np. z wydawnictwa BTC), wystarczy odwiedzić uczelnianą bibliotekę.
ale ktoś kto układał program studiów uznał, że muszę też umieć programować mikrokontrolery AVR by być informatykiem.
Na informatyce masz programowanie. Nikt nie powiedział, że będziesz pisał tylko w PHP.
Potrzebne są różne poziomy abstrakcji - od programowania w asemblerze mikrokontrolerów poprzez C/C++ aż do języków webowych i o wyższym poziomie abstrakcji aby mieć rozeznanie w programowaniu i informatyce.
5000zł za naniesienie poprawki do jednej funkcji?
Ta funkcja ma kilka linijek a cały program jak piszesz 900, myślisz, że to proste zadanie? Czasem w programie który ma 100 linijek szuka się błędu kilka dni. Przerabiałem to, zresztą na tym forum znajdziesz kilka moich programów - nie mają zwykle więcej jak 300 linijek a zobacz sobie ile w nich zależności i rzeczy które mogą nie współgrać z innymi - jaki stopień złożoności. Zobacz sobie: viewforum.php?f=47
Prawdopodobnie to kwestia godziny roboty, dla kogoś kto się na tym zna... Bo funkcja działa, ale nie do końca poprawnie = gdzieś jest błąd, który trzeba odnaleźć i poprawić. Funkcja ma ile... 40 linijek?
No właśnie, ale funkcja to nie odrębny program tylko część całości programu i musi z nim współgrać. Widać nawet tego nie wiesz.
W takim razie chciałbym u Ciebie pracować jako programista C++, bardzo chętnie będę Ci przerabiał funkcje za 5tyś zł. To było by jakieś 150razy więcej niż to co dostaje teraz... 5tyś zł za 1-2 czy 3h to wymarzona płaca...
Najpierw naucz się co to jest pętla czy if :D

A tak w ogóle to gratuluję wyboru kierunku - z twoich postów wynika, że nie masz zapału do programowania a poszedłeś na informatykę. :D

Poza tym dając funkcję na forum i gdy każesz ją poprawić a nie mamy dostępu do źródła całego programu i jego założeń - to nawet za milion złotych nikt Ci tego nie zrobi. Nie da się po prostu. :619:
Ostatnio zmieniony 6 lis 2010, o 14:03 przez Darlington, łącznie zmieniany 1 raz.

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 6 lis 2010, o 14:02

Mam już wyspecjalizowane plany odnośnie przyszłości i ona na pewno nie będzie się wiązała z mikrokontrolerami...
A jakie to plany?

//kurde, dajcie możliwość usunięcia własnego postu albo chociaż zróbcie sklejanie postów automatyczne.

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 6 lis 2010, o 14:43

Ja bym bardzo prosił nie wchodzić w moje kompetencję, bo jestem programistą C/C++. Wiem doskonale co to pętla czy instrukcja sterująca IF...
Robieniem stron też się nie zajmuje, choć znam PHP...

Programując w C++ robię programy użytkowe. Programuje komputery, a nie elektronikę. Wiem, że komputer to też elektronika, ale nie muszę się przejmować takimi rzeczami jak ustawianie poszczególnych bitów w rejestrach, czy obsługiwać przerwania. Jako informatyk mogę sobie wyspecjalizować ścieżkę rozwoju i w tym kierunku się uczę.
Tudzież proszę najpierw pomyśleć logicznie, a potem wypisywać bzdury i pouczać mnie bym poczytał o C, bądź wyspecjalizował się w programowaniu stołka. Określenie "czarna magia" odnosiło się do tego, że nie wiem co znaczy ustawianie tych wszystkich bitów z poszczególnych rejestrów... Nie chodziło mi o nieznajomość instrukcji z języka C. Tu jest ta pogrzebana ta wasza logika...

Specjalizuje się w programowaniu w C++ z interfejsami graficznymi: biblioteką Allegro, OpenGL, WXwidget... (tak a propos, C++ na początku uczyłem się właśnie z Symfonii pana Jurka Grębosza... Potem połknąłem Pasję...)
Racja, że wypada jako informatykowi wiedzieć o programowaniu elektroniki, ale zostałem "rzucony na głęboką wodę"... Nie mają pojęcia o tym, dostaję miesiąc na udoskonalenie programu który ma 900linijek...

Dlatego, że nie mam pojęcia o programowaniu mikrokontrolerów muszę przeanalizować każdą linijkę i szukać w manualach co to znaczy w praktyce. Muszę się też zaznajomić z pojęciami związanymi z mikorkontrolerami...
Dla kogoś kto się zna, wystarczy mu przejrzeć projekt i doskonale wie "co w trawie piszczy". Dlatego fachowiec będzie mógł tylko na podstawie całego projektu poprawić jedną funkcję. Mi zrozumienie wszystkich instrukcji zajmie masę czasu... Stąd wołam o pomoc... Bo bez rozumienia działania tego programu na niewiele się zdam poprawiając funkcję...


Potrzebuje wskazówek w postaci informacji "ustawienie CZEGO, daje taką czy inną funkcjonalność" by nagle program nie był dla mnie "czarną magią".

Co do samego programu. Wkleiłem tylko fragment by nakreślić komuś z czym będzie miał do czynienia. Jeśli ktoś wyrazi chęć pomocy to dostanie cały kod. Zdaję sobie sprawę, że urywek programu nic mu nie powie...
Nie jestem idiotą. Ale po co mam wklejać publicznie program na 900linijek, skoro jak widać, wielu nie rozumie sensu tematu.
Jest taka zasada: jeśli nie chcesz pomóc, to chociaż nie przeszkadzaj...

Program dostałem od prowadzącego zajęcia. On doskonale wie co jest "nie tak" i powiedział, że nasze zadanie to poprawić tą funkcję. De facto robi on tak, że celowo psuje funkcję, by przekonać się, że studenci rozumieją temat...
Nie wydaje mi się, żeby prowadzący był aż tak złośliwy, by wyszukiwanie błędu trwało kilka dni... Sądzę, że błąd jest oczywisty jeśli ktoś się zna na rzeczy. Bo to nie ma u nas sprawdzić poziomu inteligencji w wyszukiwaniu skomplikowanych błędów, a sprawdzić znajomość programowania mikrokontrolerów...
Ostatnio zmieniony 6 lis 2010, o 15:16 przez wojteq07, łącznie zmieniany 2 razy.

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 6 lis 2010, o 14:47

Pracuje jako programista C++...
Choć coraz częściej myślę o podjęciu pracy w centrali bankowej... To są moje plany

Rozumiem, że słowa "czarna magia" zrozumiałeś jako bym nie rozumiał instrukcji programu. To już wyjaśniłem w poprzednim poście...

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 6 lis 2010, o 15:44

Gdybyś to wszystko napisał od razu, to byłaby inna rozmowa.
Skoroś taki biegły w C/C++ to złap podstawy AtMegi32 (pewnie na studiach już miałeś jakiś mikrokontroler, pewnie 8051 a może AtMegę wiec pójdzie z górki).
Jak widzisz w tej funkcji nie ma nic skomplikowanego - kilka pętli i warunków więc w czym problem? Przecież C/C++ masz opanowanego jak piszesz, a AtMegi możesz się podstaw nauczyć.

Mówisz, że to projekt na uczelnię. A więc studia. A studia nie polegają na tym, że czegoś nie wiesz i rozkładasz ręce, tylko szukasz w różnych źródłach (literatura, internet, prasa branżowa) aż znajdziesz to czego potrzebujesz i sobie sam przyswoisz. Więc nie licz na to, że ktoś Ci to zrobi za 'dobre słowo'. Pisałem programy na zlecenie w C++ i za naprawdę banalne programiki po kilkanaście(dziesiąt) linii kodu brałem po 100zł - takie stawki są i ludzie płacili, więc 5000zł jak proponuje r-mik za to to może jest za duża kwota, ale nie oczekuj, że znajdziesz jelenia który Ci to zrobi za 50zł. :D

A i pomyśl logicznie - czy babrałbyś się w cudzym kodzie złożonym z 1000 linijek za darmo? A jeżeli nie to ile byś wziął. Bo ja minimum 500zł.

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 6 lis 2010, o 16:18

Nie ma nic skomplikowanego, bo C jest językiem (jak to mawia Jurek Grębosz) zorientowanym na funkcję...

A co mi ktoś poleci do nauki ATmegi32??

Ja nie wymagam by ktoś mi to za 50zł napisał to od podstaw. Sam pracuje jako programista i za program na 900linijek to bym z 4cyfr na rachunku nie zszedł...
Oczekuje, że ktoś przejrzy kod, wskaże tą "niedobrą kłodę" podstawioną pod nogi przez prowadzącego i ją delikatnie przerobi, bądź pouczy jak to zrobić... Takiej pomocy udziela się nawet za darmo w przeróżnych forach, w których nikt nic w zamian nie oferuje. Po prostu wkleja w ramki CODE fragmenty programu i liczy na łaskę innych...

Myślałem to zrobić tak:
Opiszę problem, ktoś się zgłosi, że pomoże i poda adres mailowy. Wysyłam mu całość i on się tym zajmuje. Po skończonej pracy dostaję program na maila, a ten kto to robi może nawet otworzyć firmę i takie zegarki wedle tego projektu sprzedawać choćby po milion złotych. Dostanie ktoś schemat urządzenia i prawie gotowy kod projektu wartego kupę kasy... Czy to charytatywność?
Co ktoś z tym zrobi to już jego problem... Jeśli na tym zbiję interes to tylko jego szczęście. Ja potrzebuje zaliczyć przedmiot, którego zastosowania w pracy nie widzę...

Jest tam pewien fragment który wykonuje inicjalizację, której sens wydaje się być totalnie głupi... Instrukcja eeprom_read_byte() - jak sama nazwa wskazuje - powinien pobierać coś z pamięci eeprom. Jak to możliwe, że pobiera on konfigurację połączenia z serwerem? To bzdura...
for(i=0;i<4;i++)
localip=eeprom_read_byte(i);

Zmiennej localip przypisuje się to co zwróci funkcja, której nazwa znaczy "czytaj bity z eeprom"...

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 6 lis 2010, o 16:28

Takiej pomocy udziela się nawet za darmo w przeróżnych forach, w których nikt nic w zamian nie oferuje. Po prostu wkleja w ramki CODE fragmenty programu i liczy na łaskę innych...
Takie tematy roszczeniowe typu "zróbcie to za mnie a ja poleżę" są tępione na forach.
Wykaż trochę inicjatywy.

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 6 lis 2010, o 16:29

Jest tam pewien fragment który wykonuje inicjalizację, której sens wydaje się być totalnie głupi... Instrukcja eeprom_read_byte() - jak sama nazwa wskazuje - powinien pobierać coś z pamięci eeprom. Jak to możliwe, że pobiera on konfigurację połączenia z serwerem? To bzdura...
Może konfiguracja połączenia z serwerem jest zapisana w EEPROM'ie.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Re: Projekt

Postautor: Tomasz Gumny » 6 lis 2010, o 16:49

Kod: Zaznacz cały

void liczas(int *temp, int *wynik) { int j; while(!((temp[0]==tab[0])&&(temp[1]==tab[1])&&(temp[2]==tab[2])&&(temp[3]==tab[3])))
// powtarzaj dopóki pierwsze 3 elementy tablicy tab[] są równe temp[] // w[] to licznik czasu

// w[5] jest inkrementowana przy każdym wywołaniu funkcji liczas, czyli zapewne co sekundę.

Kod: Zaznacz cały

w[5]++; if (w[5]==60) {
//Gdy w[5] osiągnie 60 jest zerowana a zwiększana jest w[4] - zapewne licznik minut.

Kod: Zaznacz cały

w[5]=0; w[4]++; //minuta if (w[4]==60) {
//Gdy w[4] osiągnie 60 jest zerowana a zwiększana jest w[3] - zapewne licznik godzin.

Kod: Zaznacz cały

w[4]=0; w[3]++; //godzina if (w[3]==24) {
//Gdy w[3] osiągnie 24 jest zerowana a zwiększana jest w[2] - zapewne licznik dni. Tu następuje dodatkowo sprawdzenie liczby dni w miesiącu w[1]. Jest nawet uwzględniony rok przestępny w[0]%4.

Kod: Zaznacz cały

w[3]=0; w[2]++; //dzien if (((w[2]>31)&&(w[1]==1)) || ((w[2]>31)&&(w[1]==3)) || ((w[2])>31&&(w[1]==5)) || ((w[2]>31)&&(w[1]==7)) || ((w[2]>31)&&(w[1]==8)) || ((w[2]>30)&&(w[1]==11)) || ((w[2]>31)&&(w[1]==12)) || ((w[2]>30)&&(w[1]==4)) || ((w[2]>30)&&(w[1]==6)) || ((w[2]>30)&&(w[1]==9)) || ((w[2]>31)&&(w[1]==10)) || ((w[2]>28)&&(w[1]==2)&&((w[0]%4))) || ((w[2]>29)&&(w[1]==2)&&((w[0]%4)==0))) {
//Gdy w[2] osiągnie 28, 29, 30 lub 31 (zależnie od długości bieżącego miesiąca, zwiększany jest w[1] - licznik miesięcy. W przypadku "zinkrementowanego" grudnia (w[1] == 13) jest ustawiany na styczeń: (w[2] = 1) i zwiększany licznik lat.

Kod: Zaznacz cały

w[2]=1; w[1]++; //miesiac if (w[1]==13) { w[1]=1; w[0]++; //rok } } } } } //przechodzenie przez koelejne pozycje licznika hex. tab[3]++; if (tab[3]==256) { tab[3]=0; tab[2]++; if (tab[2]==256) { tab[2]=0; tab[1]++; if (tab[1]==256) { tab[1]=0; tab[0]++; } } } }
//Ten fragment po prostu inkrementuje tab[0..3], czyli dodaje 1 do tab[3], jeśli nastąpiło przepełnienie, to tab[3] jest zerowane a inkrementowane jest tab[2], które jeśli nastąpiło przepełnienie... itd. Nie wiem po co i trochę to dziwnie zrobione, ale można i tak.

Kod: Zaznacz cały

for(j=0; j<6; j++) wynik[j]=w[j];
Tu następuje przepisanie "kalendarza" w[] do wynik[].

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 6 lis 2010, o 16:56

Jest tam pewien fragment który wykonuje inicjalizację, której sens wydaje się być totalnie głupi... Instrukcja eeprom_read_byte() - jak sama nazwa wskazuje - powinien pobierać coś z pamięci eeprom. Jak to możliwe, że pobiera on konfigurację połączenia z serwerem? To bzdura...
for(i=0;i<4;i++)
localip=eeprom_read_byte(i);

Zmiennej localip przypisuje się to co zwróci funkcja, której nazwa znaczy "czytaj bity z eeprom"...
Co w tym dziwnego? EEPROM może być zapisywany przez procesor, ale też przez programator (w przypadku AVR przez ISP). Dzięki temu można zmieniać konfigurację bez przeprogramowywania pamięci programu (FLASH). Czasem trzeba zabezpieczyć FLASH przed użytkownikiem, ale zezwolić mu na programowanie EEPROM.

Dodane: W tym wypadku pobierane są bajty spod adresów 0..3 a w "atmelach" lepiej nie korzystać z komórki EEPROM o adresie 0, bo czasem pojawiają się tam śmieci.

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 6 lis 2010, o 17:14

Dziękuje bardzo:)

Czyli to przepełnienie trzeba poprawić??

Z tego co piszesz to ta tablica w jest tablicą "kanałową". Już mi się widma kobaltowe z Grębosza przypominają...

A jakieś wskazówki Tomasz? Jak zrealizować takie przepełnienie??

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 6 lis 2010, o 17:25

Czyli to przepełnienie trzeba poprawić??
Na razie nie podałeś co nie działa i jakie są objawy niedziałania. Fragment, który pokazałeś, to prosty programowy "kalendarz" - ma szanse działać, ale nie chce mi się sprawdzać tych wszystkich warunków.
Jak zrealizować takie przepełnienie??
Najprościej - zadeklarować unię 4-bajtowej tablicy i zmiennej typu unsigned longint i tą zmienną inkrementować. Faktem jest jednak, że nie wszystkie kompilatory C to umożliwiają.

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 6 lis 2010, o 17:35

Dopiero we wtorek na zajęciach będę miał szansę to zobaczyć w praktyce. Bo z racji tego, że taka płytka na uczelni jest jedna - nie mogę jej zabrać do domu.

Tomaszu, czy podejmiesz się ewentualnie pomocy przy tym projekcie? Mogę dostać twój mail i w razie potrzeby zadawać pytania odnośnie kodu, którego nie zrozumiem?

Kolega mi wszedł na ambicję by to robić samemu i siedzę nad tym. Spróbuje to zrobić sam, lecz trudno jako pierwszy projekt od razu zajmować się taką "kobyłą"...
Tudzież potrzebuje jakiegoś patronatu kogoś kto się na tym zna...

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 6 lis 2010, o 17:45

Tomaszu, czy podejmiesz się ewentualnie pomocy przy tym projekcie?
Na forum - jak najbardziej.
Mogę dostać twój mail i w razie potrzeby zadawać pytania odnośnie kodu, którego nie zrozumiem?
Mam jeszcze redakcyjne konto. Pokazuj tutaj krótkie fragmenty, z opisem co powinny robić a na pewno ktoś pomoże. Jeśli wrzucisz kilkaset linii, ze szczątkowymi komentarzami i wołaniem o pomoc - czarno to widzę.

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 6 lis 2010, o 17:59

W ogóle to zacząłem poprawiać tą logikę w obliczaniu dni miesiąca. Aż w oczy kole takie podejście:

Kod: Zaznacz cały

if(((w[2]>31)&&(w[1]==1)) || ((w[2]>31)&&(w[1]==3)) || ((w[2]>31)&&(w[1]==5)) || ((w[2]>31)&&(w[1]==7)) || ((w[2]>31)&&(w[1]==8)) || ((w[2]>31)&&(w[1]==10)) || ((w[2]>31)&&(w[1]==12)) || ((w[2]>30)&&(w[1]==11)) || ((w[2]>30)&&(w[1]==4)) || ((w[2]>30)&&(w[1]==6)) || ((w[2]>30)&&(w[1]==9)) || ((w[2]>28)&&(w[1]==2)&&((w[0]%4))) || ((w[2]>29)&&(w[1]==2)&&((w[0]%4)==0)))
Prościej zrobić było:
if((w[2]>31 && (w[1]==1||w[1]==5 ....) || (w[2]>30) && (w[1]==4||....)

Poza tym zrobię inne obliczanie roku przestępnego bo powyższy algorytm jego sprawdzania jest niepoprawny.
Myślę, że nie o to chodziło prowadzącemu, ale jak już coś robić to porządnie.

Jakbym miał jakieś problemy w następnych dniach to bardzo proszę o pomoc.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 6 lis 2010, o 18:12

[...]Aż w oczy kole takie podejście:

Kod: Zaznacz cały

if(((w[2]>31)&&(w[1]==1)) || ((w[2]>31)&&(w[1]==3))
Z punktu widzenia zwięzłości kodu masz rację, ale dla późniejszej analizy czasem warto zostawić kilka warunków razem:

Kod: Zaznacz cały

if(((w[2]>31)&&(w[1]==1)) // styczeń || [...] // luty w roku zwykłym || [...] // luty w roku przestępnym || ((w[2]>31)&&(w[1]==3)) // marzec

wojteq07
-
-
Posty: 20
Rejestracja: 5 lis 2010, o 21:42
Lokalizacja: Kraków

Postautor: wojteq07 » 6 lis 2010, o 19:26

Każdy programista ma swój styl. Ja osobiście uważam, że mój styl jest łatwiejszy do analizy:)

A czy mógłbyś mi Tomaszu rozwinąć swoją propozycję do przepełnień?
Bo ona się w pętli łączy ze sprawdzaniem warunku "różności" z trzema wartościami temp. Objaśniając mi kod zapomniałeś o wykrzykniku, co zmienia znaczenie. Jeśli stoi ona przed nawiasem, to z logiki wynika, że jeśli tylko jakiekolwiek porównanie nie jest prawdziwe to pętla wykona kolejny cykl (spójnik &&). Nie bardzo widzę związek z całością, ale pewnie byłby Ci potrzebny cały kod by mi to objaśnić...

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 87 gości