[c++]Ocena programu generującego kody kreskowe

0

Witam!
Dzisiaj stworzyłem program, który z podanego wcześniej kodu EAN-13 tworzy kod kreskowy.LINK:
http://www.sendspace.pl/file/dc964c8f6e745d5f7963147
Chyba to dobrze jak na 13 letniego programistę;)

0

bardzo dobrze, Jasiu
a teraz idź do piaskownicy się pobawić bo słońce ładnie świeci

0

Show me the code, to się zobaczy, czy to dobrze.

0

Już niedobrze:
[1] można podać inną długość kodu niż 13 cyfr
[2] czytnik.exe zawsze się wysypuje
[3] do czego wykorzystujesz Allegro?
[4] po co wywoływać jeden program w drugim? lepiej zrobić to w jednej aplikacji albo zrobić dwie osobne, niezależne od siebie

0

rincewind
AD1 Wiedziałeś, że kod EAN-13 składa się z 13 znaków?
AD2 U mnie i u innych program czytnik.exe się nie sypie.
AD3 Allegro wykorzystuje aby wyświetlić kod kreskowy
A oto link do nowej wersji:
http://www.speedyshare.com/files/23273199/czytnik.zip

0

@mati1223:

  1. Moze nie wiedzial - zaskarzysz uzytkownika?
  2. SOA#1 - nieakceptowalne :P
0

U mnie sie oba sypia, a czytnik tak jak juz wczesniej bylo napisane zawsze po wlaczeniu, wiec nie mam za bardzo jak nawet tego przetestowac. Odpada na starcie. Zastanawiam sie takze do czego Ci ta biblioteka allegro jest potrzebna ? Uruchamialem na XP bez zadnych SP i innych.

0

Z tego co zauważyłem w pliku źródłowym, Allegro ma wyświetlać BMP z wygenerowanym kodem kreskowym. Niestety, nie zawsze działa.

Po spojrzeniu w kod jeszcze kilka uwag:
[1] nazwy plików są hardcoded w programie, nie pozwalają na żadną dowolność
[2] brak jakiejkolwiek kontroli błędów (nie tylko wspomniane przeze mnie sprawdzanie danych od usera, ale również błędy związanie z IO, np. brak pliku)
[3] na koniec ciekawy kwiatek -- koniecznie chciałeś program "obiektowy"? ;)

class kodowanie
{
public:
    kodowanie()
    {

        int lewonieparzyscie[10][7]=
        {
            {0,0,0,1,1,0,1},
            {0,0,1,1,0,0,1},
            {0,0,1,0,0,1,1},
            {0,1,1,1,1,0,1},
            {0,1,0,0,0,1,1},
            {0,1,1,0,0,0,1},
            {0,1,0,1,1,1,1},
            {0,1,1,1,0,1,1},
            {0,1,1,0,1,1,1},
            {0,0,0,1,0,1,1}

        };
        int lewoparzyscie[10][7]=
        {
            {0,1,0,0,1,1,1},
            {0,1,1,0,0,1,1},
            {0,0,1,1,0,1,1},
            {0,1,0,0,0,0,1},
            {0,0,1,1,1,0,1},
            {0,1,1,1,0,0,1},
            {0,0,0,0,1,0,1},
            {0,0,1,0,0,0,1},
            {0,0,0,1,0,0,1},
            {0,0,1,0,1,1,1}
        };
        int prawo[10][7]=
        {
            {1,1,1,0,0,1,0},
            {1,1,0,0,1,1,0},
            {1,1,0,1,1,0,0},
            {1,0,0,0,0,1,0},
            {1,0,1,1,1,0,0},
            {1,0,0,1,1,1,0},
            {1,0,1,0,0,0,0},
            {1,0,0,0,1,0,0},
            {1,0,0,1,0,0,0},
            {1,1,1,0,1,0,0}
        };
        char liczby[10] {'0','1','2','3','4','5','6','7','8','9'};
        string liczba;


        cout<<"Wpisz kod EAN-13:";
        cin>>liczba;
        fstream plik2("plik2.txt",ios::out);
        plik2<<liczba;
        plik2.close();

        fstream plik("plik.txt",ios::out);

        plik<<"202";
        cout<<"202";
        for(int i=1; i<14; i++)
        {
            cout<<""<<endl;
            for(int j=0; j<10; j++)
            {
                if(liczba[i]==liczby[j]&&i<7&&j%2==0)
                {
                    for(int k=0; k<7; k++)
                    {
                        plik<<lewoparzyscie[j][k];
                        cout<<lewoparzyscie[j][k];
                    }
                }
                if(liczba[i]==liczby[j]&&i<7&&j%2!=0)
                {
                    for(int k=0; k<7; k++)
                    {
                        plik<<lewonieparzyscie[j][k];
                        cout<<lewonieparzyscie[j][k];
                    }
                }
                if(liczba[i]==liczby[j]&&i>7)
                {
                    for(int k=0; k<7; k++)
                    {
                        plik<<prawo[j][k];
                        cout<<prawo[j][k];
                    }
                }
                if(liczba[i]==liczby[j]&&i==7)
                {
                    plik<<"02020";
                    cout<<"02020";
                    cout<<endl;
                    for(int k=0; k<7; k++)
                    {
                        plik<<prawo[3][k];
                        cout<<prawo[3][k];
                    }
                }
            }
        }
        plik<<"202";
        cout<<"202";
        plik.close();
        cout<<endl<<"Kodowanie zakonczone powodzeniem!"<<endl;
    }
};

Klasa z samym tylko konstruktorem, który robi lwią większość programu. Zamiast tego lepiej można byłoby stworzyć funkcję.

0

@t0m_k-tmp Próbowałeś skompilować ten program na swoim komputerze(jest kod źródłowy)?
Sorry, że nie dodałem obsługi błędów.Dodam ją jutro;)

0

u mnie się wywala na końcu(?) programu czytnik.exe, tzn pojawia sie okno konsoli, jakieś wyniki i program sie wywala, żadna grafika sie nie odpala.

0
mati1223 napisał(a)

Sorry, że nie dodałem obsługi błędów.Dodam ją jutro;)

Muszę to kiedyś powiedzieć kierownikowi projektu. [rotfl]

0

Efekt działania programu bez względu na to czy wpiszę poprawny kod czy nie, jest zawsze taki sam...
http://i48.tinypic.com/nouk52.jpg

0
AdamPL napisał(a)

Efekt działania programu bez względu na to czy wpiszę poprawny kod czy nie, jest zawsze taki sam...
http://i48.tinypic.com/nouk52.jpg

[rotfl]

mati1223 napisał(a)

...

Kurde, gdzieś zgubiłem ten temat, a jak go szukałem intuicyjnie trafiłem do Największe programistyczne WTF jakie was spotkało... Grafikę widziałem raz i tylko przez chwilę jak ruszyłem oknem, tak więc najpierw naucz się pisać programy które działają, a potem zachwalaj się jaki to nie jesteś fajny. Tutaj wiek nie ma znaczenia, no trochę ma... Większość ludzi w twoim wieku pisze "świetne" programy które wykrzaczają się jak ten i mają duże poczucie własnej wartości ;]

0

IMHO niezła próba. Popraw, żeby działało, potem zrób recaftoring kodu.

0

Nie wiem..Może nie uruchamia się bo spakowałem bibliotekę i exe w UPXe?
Jeśli wam się nie uruchomi to spróbujcie uruchomić to//www.kurstp.za.pl/KLOCKI.zip

0

Przecież execi nie są spakowane, to po pierwsze. Po drugie oba skompilowane jako debug, ale to generalnie problemu tutaj nie robi. Konkretnie to Allegro się sypie, starczy w logi zajrzeć:

allegro na XP SP2 napisał(a)

al-main INFO: Allegro initialised (instance 1)
al-gfx INFO: Called set_gfx_mode(2, 206, 120, 0, 0).
al-gfx INFO: First call, remembering console state.
al-gfx INFO: Autodetecting graphic driver.
al-gfx ERROR: Failed setting graphic driver 0.

allegro na Server 2003 SP2 napisał(a)

al-main INFO: Allegro initialised (instance 1)
al-gfx INFO: Called set_gfx_mode(2, 206, 120, 0, 0).
al-gfx INFO: First call, remembering console state.
al-gfx INFO: Autodetecting graphic driver.
al-gfx INFO: The driver will wait for vsync.
al-gfx INFO: set_gfx_card success for 206x120x32.
al-gfx INFO: Called set_gfx_mode(-1, 0, 0, 0, 0).
al-gfx INFO: Closing graphics driver (6569FBB0) DirectDraw overlay.
al-gfx INFO: Closing, restoring original console state.
al-gfx INFO: Graphic mode closed.

Wysypuje się 'w' linii:

clear_to_color(screen,makecol(198,226,255));

W clear_to_color masz piękne null pointer dereference bo screen (zmienna importowana z modułu Allegro) ma wartość 0.

0

Dodam link do inaczej spakowanej bibliotece allegro//www.speedyshare.com/files/23282654/alld42.dll
OK!Daje ort! spokój z tym projektem.

0
mati1223 napisał(a)

Dodam link do inaczej spakowanej bibliotece allegro//www.speedyshare.com/files/23282654/alld42.dll
OK!Daje ort! spokój z tym projektem.

Świetne podejście [rotfl]
Tak to ja bym nic nie zrobił jakbym na każdym parse errorze/warningu dawał spokój...

0

@mati1223:
Nie poddawaj się tak łatwo!

Koledzy z forum trochę za bardzo robią sobie z Ciebie jaja ;). Nie znam Ciebie i Twoich wcześniejszych postów. Może w każdym topicu czujesz się zbyt pewny siebie i jesteś zbyt... arogancki, jeśli pozwolisz że użyję tego słowa.

Tymczasem jesteś jeszcze (stosunkowo) początkującym programistą o "ograniczonych umiejętnościach", a gadasz tu z kolesiami, którzy od X lat kodują zawodowo. Sam może nie kodujesz pierwszy dzień, tydzień, czy miesiąc -- bez przesady -- ale też nie babrałeś się w kodzie przez ostatnie kilkanaście lat, prawda? A nawet wtedy byłbyś tylko "programistycznym nastolatkiem"!

Staż sam w sobie nie ma znaczenia, ale pomyśl na chłopski rozum o różnicy w umiejętnościach, która wynika z różnicy w doświadczeniu (Ty możesz stać się świetnym koderem, ale na to potrzeba czasu!). Miejże więc, chłopie, trochę pokory.

To z jednej strony. Ale z drugiej strony, gdy już zrozumiesz że nie jesteś jeszcze Linusem Torvaldsem i że na umiejętności przyjdzie jeszcze czas, to... nie przejmuj się jakimiś durnymi docinkami, które mogą się tu pojawić obok suchej, konstruktywnej krytyki. Durne docinki są pomocne jeśli uzmysłowią Ci, że nie jesteś jeszcze pępkiem programistycznego świata i że dojście do tego poziomu zajmie Ci jeszcze trochę lat. Potem, durne docinki są nic nie warte i trzeba je zignorować.

A czemu masz się tak łatwo nie poddawać?

Dla samego siebie. Sprawdź się już teraz, co Ci szkodzi? Wyobraź sobie, że ten program robisz dla klienta. Nie ma czegoś takiego, że się poddasz. Podpisałeś umowę, klient wpłacił zaliczkę i chętnie wpłaci resztę gdy dostanie działający program. Nie ma wymówki, nie ma nawet takiej opcji, że programista nagle powie "sorki, ale ja nie umie" jeśli już się na coś z klientem umówił.

Możesz odrzucić zbyt ambitny projekt. Ale przed rozpoczęciem tego programu myślałeś, że dasz radę go zrobić. Nie jest przecież aż tak skomplikowany i ktoś z Twoim doświadczeniem (nie jakimś bardzo wielkim, ale nie jesteś już programistycznym noworodkiem) powinien dać radę go zrobić. Więc umowę na ten program byś podpisał.

W prawdziwym świecie nie byłoby nawet tak, że musisz znaleźć błąd i dokończyć program. Byłoby tak, że miałbyś na to ograniczoną ilość czasu. Miałbyś deadline. Program miałby być zrobiony np. na pojutrze i klienta nie obchodziłoby, że masz gdzieś poważny bug i tkwisz w miejscu.

Teraz masz ten komfort, że jeśli mimo wszystko przekroczysz czas czy zwyczajnie się poddasz, to korona Ci z głowy nie spadnie. Nie będziesz musiał płacić kar umownych. Twój klient nie będzie musiał opóźnić otwarcia supermarketu, co przyniosłoby mu ogromne straty finansowe. W prawdziwym życiu natomiast komfortu nie będzie i negatywne konsekwencje Twoich braków w skillu i samozaparciu będą jak najbardziej realne i dotkliwe.

Dlatego proponuję Ci rozważyć, czy nie lepiej spróbować doprowadzić ten projekt do końca. Wykryć błąd. Może jeszcze jesteś za cienki by znajdować takie błędy -- po dwóch tygodniach pewnie powinieneś dać sobie spokój. Ale i prawdziwym programistom zdarza się czasem niestety (choć rzadko, mam nadzieję) ślęczeć nad jakimś bugiem parę dni, czy tydzień. I oni wiedzą, że muszą ten problem rozwiązać. Przekroczenie deadline'u to porażka, ale porzucenie projektu "bo jednak nie umie" to już niemal nie występująca w przyrodzie katastrofa.

Projekt robiony w celach dydaktycznych czy dla przyjemności możesz olać. Ale możesz też się w tym momencie sprawdzić: jak by to wyglądało, gdybyś MUSIAŁ rozwiązać ten problem?

0

Jestem dopiero studentem, lecz raz miałem deadline przy jednej laborce, już taki poważny, bo albo 3 albo 2 .... 2 dni szukałem błędu, znalazłem go - wydawało by się to apogeum - błąd. Odkryłem, że skopałem projekt programu i że lepiej go zrefaktoryzować, niż łatać na pająka tą poczwarę ... tego zmutowanego płoda mojego chorego umysłu ...Suma sumarum ok 70% przepisałem od nowa i już było ok, a jak się z siebie potem cieszyłem ! Oczywiscie z przepisania dobrego a nie z skopania założen. Zapamiętaj sobie - dobry projekt to jest to. Nie rób nic na dzika, na pająka, na partyzanta nie zaprzyjaźniaj jakiś funkji, nie twórz na siłe hierarhi niepotrzebnych klas bo tak wypada - to ZAWSZE wróci. Będziesz miał szczęście jak to wróci do ciebie i się zaśmieje podczas jeszcze pisania programu, wtedy możesz relatywistycznie szybko zareagować, ale gorzej jak znajdziesz to przy utrzymywaniu kodu, lub jak kiedyś będziesz chciał dodać jakiś ficzer. Wiem ze teraz do ciebie to nic nie znaczy, ale zobaczysz- nabawisz się pierwszej siwizny przez to zacczniesz na to zwracać uwagę.

0

mi zdecydowanie brakuje w tym programie funkcji liczenia pola koła
inni w twoim wieku już mieli takie rzeczy w swoich programach

0
bswierczynski napisał(a)

...

To doświadczenie jest baaaaaardzoooo specyficzne. Ja miałem taki etap, że nie byłem samokrytyczny wobec swojego kodu, pisałem coś byle działało i nazywałem to świetnym i profesjonalnym rozwiązaniem i wrzucałem na fora zachwalając swój skrypt. Właśnie wtedy dostałem nieźle w dupę od bardziej doświadczonych programistów, że w skrypcie zarządzania procesem gry przez WWW nie ma obsługi linuxa, że kod gówniany i nie podzielony sensownie na funkcje. Uważałem że gada głupoty i go ignorowałem, jednak po jakimś czasie faktycznie stwierdziłem że rozwiązanie nie jest aż tak profesjonalne jak je zachwalałem i faktycznie skrypt bez wskazanych przez innych userów featuresów nie nadaje się praktycznie do niczego. To mnie nauczyło jako tako samokrytyki i wręcz dało pozytywne efekty: bo chciałem się nauczyć napisać taki kod, żeby mnie nikt nie zjechał. To samo więc odprawiam teraz stojąc w pewnym sensie po drugiej stronie barykady, słabi odpadną, mocni będą zaparcie dążyć ku sukcesowi ;]

0

@Demonical Monk:
Ja zdaję sobie sprawę, że konstruktywne wrzuty często są dobre. Ba, nawet niezbyt konstruktywne wrzuty mogą być do pewnego momentu dobre -- żeby ktoś uświadomił sobie, że jego kod wcale taki super nie jest. Pisałem o tym przecież.

Natomiast generalnie uważam, że krytykować można mniej personalnie. Sam staram się to zrobić. Można nazwać najgorsze fragmenty kodu po imieniu, ale wyzywanie autora czy też wyśmiewanie się z niego nie jest takim dobrym pomysłem.

Nawet to może wzbudzić w kimś agresywną chęć napisania dobrego kodu i pokazania wszystkim, że się mylą. Ale gdy wchodzisz na forum i zbierasz tylko takie wrzuty, to nie zdziwię się, jak ci się wszystkiego odechce. Dlatego napisałem, czym się należy przejmować, a czym nie. I dlatego takie historyjki jak ta, którą opisałeś powyżej, są dobre. Bo autor powinien wiedzieć, że wcale nie jest najgłupszym programistą na świecie, jak by wynikało z samych bluzgów i wrzutów. Powinien wiedzieć, że każdy przez taki etap przechodził.

Ja staram się też choćby minimalnie kogoś pochwalić. Myślę, ze wystarczy nieraz napisanie "okay, nie piszesz jak ktoś kto programuje dopiero od tygodnia czy miesiąca" -- wtedy człowiek ma poczucie, że CZEGOŚ się jednak przez te 2 lata amatorskiej nauki nauczył.

Co do krytyki kodu to ja im dalej idę w las, tym więcej widzę wad w swoim własnym. Zauważam więcej problemów, więcej kompromisów. Jest sporo kodu, który napisałem ledwie rok temu, ale który uznałbym dzisiaj za zwyczajnie gówniany. Może mniej gówniany niż kod programisty, który się nie przykłada, ale i tak gówniany. Naprawdę ciężko mnie pod tym względem zadowolić; w prawie każdym większym kodzie widzę coś w ten czy inny sposób gównianego. (Określenie może niezbyt apetyczne, ale całkiem nieźle oddaje moje odczucia; poza tym dobrze pasuje do wyczuwania tzw. "brzydkich zapachów" w kodzie ;) )

PS. Jednocześnie lubię to uczucie gdy człowiek patrzy na swój stary kod i myśli "o cholera, to nawet nie jest takie złe!".

1 użytkowników online, w tym zalogowanych: 0, gości: 1