LLpedia - Low Level Programming Encyclopedia

0

LLpedia - Low Level Programming Encyclopedia

Nowa polska wolna encyklopedia o programowaniu niskopoziomowym i nie tylko.

http://wiki.haker.com.pl/

Zapraszam, mile widziane komentarze, sugestie i uwagi.

0

Algorytm k-średnich to low-level? http://wiki.haker.com.pl/index.php?title=Jak_zaimplementowa%C4%87_algorytm_k-means_w_j%C4%99zyku_C%3F_(gotowiec)

Zamiast robić kolejny worek na algorytmy możesz je wrzucić na Rosetta Code, tylko akurat tak się składa, że tam już K-Means są zaimplementowane w języku C: http://rosettacode.org/wiki/K-means%2B%2B_clustering

0

Najnowsze artykuły:
23/07/2012 Jak zapisać wartość pod dane miejsce w pamięci? (TASM) - Dawid Farbaniec

TASM? Przestałem czytać...

1

/* Deklaracje zmiennych */
Na ch.. komu takie komentarze?

5

Jak pisałem na forum uw, mam spore obawy co do tworzonej przez Ciebie wiki - w artach które są tam w tym momencie jest masa błędów merytorycznych, niedoprecyzowań, rozminięć się z tematem, etc. Podobnie jak w przypadku książki, uważam, że jest za wcześnie abyś pisał na tego typu tematy.

Kilka przykładowych uwag o które prosiłeś:
http://www.uw-team.org/forum/viewtopic.php?p=79516#p79516

0

Algorytmy w ASM / low level sobie bym darował. C# chyba też.
Zostań przy ASM / C plus te wszystkie modele pamięci i sprzęt.
Albo zmień formułę projektu, bo nie jest to low level.

Z tego co napisał @Gynvael Coldwind:

  • powinieneś opisać format COM (bardzo przydatne wg mnie), w tym jak przechowywać w nim dane
  • definitywnie podać jak wypisywać teksty jeśli już wspominasz o napisach w BIOS
  • jeśli chcesz zrobić coś efekciarskiego żeby przyciągnąć to opisz jakiś projekt graficzny od A do Z - np. Mandelbrota przez framebuffer w ASM

Poza tym jest to Wiki - z reguły takie strony może każdy poprawiać, więc jeśli koledzy widzą taką masę niedociągnięć to nie rozumiem czemu się nie rzucają do zmian tylko krytykują. Ja gdybym miał czas i wiedzę pewnie bym coś dodał od siebie.

2

OK, jeszcze jeden post, bardziej konstruktywny tym razem.

@D.F.
Jak widziałeś moje uwagi sprowadzają się do dwóch głównych rzeczy:

  1. Braku szczegółów (które w low-level są bardzo istotne). Na przykład:
  • braku wpływu operacji różnych na flagi
  • brak wyjaśnienia co dane makra robią "pod maską"
  • brak konkretnych informacji o kontekście w którym programy pracuję (assembly jest niejako językiem "wysoko-kontekstowym")
  • etc
  1. Uproszczeń (w encyklopedii można spokojnie dużo więcej szczegółów podawać niż w tutorialach)

W obu przypadkach sporo pomoże jeśli opisując daną rzecz będziesz starał się [więcej?] "konsultować" z materiałami źródłowymi różnego rodzaju (mam na myśli głównie manuale intela i AMD; ostrożnie z korzystaniem z innych tutoriali/tekstów - warto zawsze sprawdzić czy to co autor napisał jest zgodne ze stanem faktycznym).
Warto też czasem rzucić okiem na co inni autorzy zwracają uwagę opisując dany temat.
Również, wraz z nabieraniem doświadczenia będą pewne rzeczy rzucać Ci się w oczy, których wcześniej byś nie napisał w danym artykule (lub będziesz się o czymś dowiadywał co warto dodać).

No i nie musisz też wszystkie pisać na nowo (syndrom "not invented here" jest bardzo czasochłonny, a dużo nowego nie wnosi) - być może warto, abyś w niektórych artykułach zebrał po prostu linki do już istniejących materiałów o dobrej jakości.
Jako przykład tutaj podam:
http://wiki.haker.com.pl/index.php?title=Lista_opkod%C3%B3w_procesora_80x86
vs link do:
"The Complete Pentium Instruction Set Table" by Sang Cho (mirror: http://gynvael.vexillium.org/dump/opcodes.txt)

1

Co do cryptera - http://wiki.haker.com.pl/index.php?title=Prosty_crypter_w_MS_Visual_CSharp_.NET

Piszesz:

Zaznaczam od razu, że program nie zaszyfruje każdego EXE - tylko aplikacje napisane w C#.NET.

Nieprawda, aplikacje napisane np. w VB.NET również ten program "zabezpieczy".

Odnośnie samej idei cryptera:
Jaki jest sens pisać coś takiego? Ten program w żaden sposób nie chroni przed dostępem do własności intelektualnej przedstawianej przez źródło jakiejś aplikacji. Napastnik zdekompiluje binarkę, przejrzy te 15 linijek na krzyż z których składa się "crypter" i odxoruje sobie to co jest w zasobach odczytując również ze źródła klucz jakim ma odszyfrowywać.

Atak na właściwy program przedłuży się mniej więcej o tyle ile trwało pisanie tego cryptera czyli jakieś 10 min. Myślę, że powinieneś zaznaczyć, że ten program kompletnie nie nadaje się do zabezpieczania kodu źródłowego programu i powstał w celach ... hmm... no sam nie wiem jakich, ale z dużą dawką optymizmu można by mu przypisać jakieś walory edukacyjne.

Chyba, że miało to służyć uczynieniu malware niewykrywalnym w scantime, ale ten sam efekt można uzyskać pisząc najprymitywniejszego bindera w C/C++...

0
Gynvael Coldwind napisał(a):
  • braku wpływu operacji różnych na flagi

http://wiki.haker.com.pl/index.php?title=Opis_rozkazów_procesorów_z_rodziny_80x86

Gynvael Coldwind napisał(a):
  • brak wyjaśnienia co dane makra robią "pod maską"

http://wiki.haker.com.pl/index.php?title=Budowa_programu_typu_DOS/COM

Te dwie rzeczy poprawiłem (tak jak umiałem).

Nasza (moja i grzonu) wiki na pewno prezentuje wyższy poziom niż artykuły na 4programmers pisane przez dzieci o Delphi.

3
0DFh napisał(a):
Gynvael Coldwind napisał(a):
  • braku wpływu operacji różnych na flagi

http://wiki.haker.com.pl/index.php?title=Opis_rozkazów_procesorów_z_rodziny_80x86

Krok w dobrą stronę.

0DFh napisał(a):
Gynvael Coldwind napisał(a):
  • brak wyjaśnienia co dane makra robią "pod maską"

http://wiki.haker.com.pl/index.php?title=Budowa_programu_typu_DOS/COM

Kilka zmian które zaproponowałbym w poprawce:

  • "Niżej mamy makro .startup, które generuje startową sekwencję programu związaną z załadowaniem właściwą wartością rejestry segmentowe."
    Sprawdziłeś, czy faktycznie tak jest? Z testu który zrobiłem na szybko wynika, że .startup w przypadku COM nie robi nic, co faktycznie nie widzi (w końcu część rejestrów segmentowych wypełnia system, a o resztę programista musi zadbać sam).
    Być może makro .startup w przypadku COM rozwijane jest różnie w zależności od tego co w programie siedzi (co również wartoby i sprawdzić, i napisać o tym).

  • "Natomiast makro .exit generuje kod kończący program i przekazujący sterowanie do systemu operacyjnego."
    Warto by dodać konkretny kod który generuje .exit w przypadku plików COM (szczególnie, że to tylko dwie instrukcje asma).

0DFh napisał(a):

Nasza (moja i grzonu) wiki na pewno prezentuje wyższy poziom niż artykuły na 4programmers pisane przez dzieci o Delphi.

Mam wrażenie, że nie chodzi tu o pissing contest między LLPE a 4p, tylko o poprawność merytoryczną w przypadku o którym rozmawiamy (a rozmawiamy o LLPE).
Poprawność artykułów o Delphi na 4p to temat na oddzielną dyskusję w innym gronie (cóż, ja o Delphi pojęcia zielonego nie mam).

5

Przepraszam, źle zacytowałem, można prosić o usunięcie poprzedniego postu?

0DFh napisał(a):

Nasza (moja i grzonu) wiki na pewno prezentuje wyższy poziom niż artykuły na 4programmers pisane przez dzieci o Delphi.

Chciałbym tylko zauważyć, że kiedy wskazuje Ci się braki merytoryczne to zaczynasz obrażać serwis, którego jesteś gościem. Przejrzyj ostatnie zmiany w tekstach, dotyczą one programowania w C# oraz ogólnie pojętego raytracingu, nie są to przypadkowe zlepki kodu pisane przez dzieci, przekonaj się o tym. Zachowujesz się jak skrzyżowanie Pawła Lepko (nnn) z Piotrem Olszewskim (ich historie w działach Perełki i Społeczność)... Spójrz na swoje posty, jakie wystawiasz sobie świadectwo, panie Farbaniec?

0DFh napisał(a)

Jak czegoś nie jestem pewien to tego nie piszę. Dlatego w LLpedia mogą być co najwyżej niedopowiedzenia (które każdy zarejestrowany może dopisać), według mnie nie ma tam błędów merytorycznych, ani nie ma tam opisanych rzeczy, które są nieprawdziwe.

O książce pisałeś to samo, potem w kilku miejscach Sieci uzyskałeś opinie ludzi znających się nieco lepiej na rzeczy. Poczekamy na dokładne recenzje?

3

Postanowiłem przejrzeć wiki przy kawie...

http://wiki.haker.com.pl/index.php?title=S%C5%82owem_wst%C4%99pu

Dlaczego namawiam do poznania Asemblera? Ponieważ programy w tym języku mają bardzo mały rozmiar i są szybsze od programów pisanych w językach wysokiego poziomu.

Nie są szybsze z definicji, mogą być, to kwestia umiejętności, nieprzeciętnych umiejętności. W dobie powszechnie dostępnego SSE2 i 3 większość "hakerów" ma niewielkie szanse z nowoczesnymi kompilatorami. Pachnie mi to "elitą" z okładki książki.

Asembler - niskopoziomowy język programowania.

asembler - program dokonujący procesu asemblacji po którym otrzymujemy plik *.obj.

Niskopoziomowym językiem programowania jest też m. in. C, cechą szczególną assemblera jest bycie mnemoniczną reprezentacją opkodów kodu maszynowego. W polskiej terminologii poprawną nazwą kompilatora assemblera jest "translator", ponieważ dokonuje on jedynie bezpośredniego przekładu (z pominięciem rozwijania makr) z mnemoników na opkody i surowe bajty danych.

Konsolidator/Linker - program, który na podstawie pliku *.obj dokonuje konsolidacji w wyniku czego otrzymujemy plik wykonywalny.

Odpluskwiasz/Debugger - program do szukania błędów w programach. Pokazuje listing programu w języku Asembler i pozwala wykonywać program krok po kroku oraz śledzić zmiany w rejestrach/pamięci.

Wspomniałem o polskiej terminologii ponieważ wciskasz ją na siłę, w rzeczywistości nikt tych pojęć nie używa, Ty też nie powinieneś. Linker robi znacznie więcej, chocią uproszczenie, że łączy obiekty kompilacji w plik wykonywalny jest dopuszczalne. Debugger, zwłaszcza pracujący na poziomie assemblera, jest przede wszystkim narzędziem do analizowania programów. Warto zaznaczyć podział na debuggery wysokopoziomowe (pracujemy głównie z oryginalnym kodem źródłowym) i niskopoziomowe, te tartegowane w pracę z tzw. deadlistingami (czyli efektami pracy disassemblera).

Opkod - to symboliczna nazwa, której odpowiada kod bajtowy. Pisząc w Asemblerze, używamy właśnie opkodów (nazywanych też czasem mnemonikami). Później opkody są tłumaczone na kod bajtowy.

Bzdura totalna i absolutna. Mnemonikiem nazywamy literowy skrót 'nazwy' instrukcji, jest on tekstową reprezentacją opkodów (czyli suchych bajtów) kodu maszynowego.

System binarny — podstawą systemu są dwie cyfry: 0 i 1. W systemie binarnym działa komputer i jest zapisywany kod programu. Przyjęło się, że liczby są zapisywane z literą b na końcu (np. 10001011b).
System heksadecymalny — podstawą są tu cyfry od 0 do 9 i litery od A do F (w sumie szesnaście znaków). Dla człowieka jest on o wiele wygodniejszy od systemu binarnego. Liczby w tym systemie przyjęło się zapisywać z literą h na końcu (np. 23E0B3h).

"podstawą systemu są .. cyfry" - Jasna cholera, "cyfry", WTF?! Podstawą systemu pozycyjnego jest pojedyncza liczba!

Jednostki informacji pamięci komputerowej
Do programowania w języku Asembler przyda się znajomość jednostek informacji pamięci komputerowej, które są związane również z rozmiarem rejestrów procesora czy zmiennych w pamięci.

Brakuje zakresów liczb ze znakiem, mieszasz typy danych z wielokrotnościami jednostek podstawowych. Nibble nie "są związane również z rozmiarem rejestrów procesora czy zmiennych w pamięci", tego pojęcia używa się w odniesieniu do bitowej reprezentacji pojedynczej CYFRY systemu szesnastkowego.

http://wiki.haker.com.pl/index.php?title=Pot%C4%99gi_liczby_dwa - dobre podsumowanie poziomu projektu. Naprawdę, na co to komu? Tabela jest bezużyteczna, nie można nawet wygodnie skopiować wartości, nie ma zapisu w różnych systemach liczbowych i wielokrotnościach. Haker nie potrzebuje takich śmiesznych tabelek, taki człowiek zapisuje np. 32 MB to 32 << 20 jako 32 shl 20 :]

Potem poczytam kolejne części tego "wstępu", ale przedtem może odświeżę sobie znajomość assemblera, deadlistingi w Visualu to trochę mało na recenzowanie publikacji o pure asm. W każdym razie kiepsko to widzę.

1

Kurs Asemblera gotowy, kurs C prawie skończony, kurs C++ w trakcie. Nowy dział: Malware o pisaniu złośliwego oprogramowania i obronie przed nim. Mamy też forum. Zapraszam chętnych do współpracy przy projekcie :)

0

@ODFh, bardzo fajnie, napisałeś więcej materiału, w którym można wytknąć błędy. To może ja zacznę:

  1. http://wiki.haker.com.pl/index.php?title=C%2B%2B/Zmienne_i_typy_danych
    Nie wiesz czym jest zmienna globalna w C++. Obie przedstawione przez ciebie zmienne są lokalne.

  2. http://wiki.haker.com.pl/index.php?title=C%2B%2B/Funkcje_-_Cegie%C5%82ki_programu
    Mieszasz standardy C++. Tutaj w funkcji main. Faktycznie można pominąć return 0, ale poprawna deklaracja main wymaga typu.

  3. http://wiki.haker.com.pl/index.php?title=C%2B%2B/Podstawowe_wy%C5%9Bwietlanie_tekstu
    Dlaczego piszesz o konieczności robienia wcięć wraz z nowym blokiem, kiedy w połowie twoich kodów wszystko jest na jednym poziomie?

0
http://wiki.haker.com.pl/index.php?title=C%2B%2B/Zmienne_i_typy_danych napisał(a)

Zmienna jest to nic innego jak pamięć, która przechowuje pewien typ danych, zależny od typu zmiennej.

Mówienie, że "zmienna to pamięć" jest jak dla mnie nie bardzo logiczne.
Pamięć to pamięć, a zmienna co najwyżej znajduje się w pamięci.

// Wypisanie tego powinno nie zadziałać, albo powinniśmy dostać error od kompilatora.

Czyli co?
Albo nie będzie działać albo nie będzie działać? :]

http://wiki.haker.com.pl/index.php?title=C%2B%2B/Funkcje_-_Cegie%C5%82ki_programu napisał(a)

Każdy program w C++ ma co najmniej jedną funkcje: main(){}.

Specjalistą nie jestem, ale main to chyba może być tylko jedne na cały program, więc nie może być "co najmniej jednej funkcji main()" tylko "dokładnie jedna".

Jako że kod wykonywany jest z góry do dołu,

To już się może czepiam, ale zdefiniuj co to jest "góra" i "dół".
Takie pojęcia nie istnieją w przypadku programów/plików.

Zwróć uwagę na to, że są one KOPIĄ tych zmiennych, a nie tymi zmiennymi, przez co w funkcji nie możemy zmienić wartości zmiennych użytych jako argumentów

A jak przekażę obiekt lub tablicę?

0

Dyrektywa "#include" to "deklaracja biblioteki" ? http://wiki.haker.com.pl/index.php?title=C/Preprocesor#.23include

2

Przecież to się nawet nie skompiluje...

#include <iostream>
 
dodaj(int, int);                                    
 
main()
{
    int a, b, c;
    std::cout << "Wprowadz pierwsza liczbe: ";
    std:cin >> a;
    std::cout << "Wprowadz druga liczbe: ";
    std::cin >> b;
    c = dodaj(a, b);                                
    std::cout << "Wynik wynosi " << c << endl;
    std::cout << "Pierwsza liczba wynosi: " << a << endl;
}
 
int dodaj(int x, int y)                             
{
    int x = x+y;
    return x;                                       
}
0

Akurat o C++ pisali inni, ja nie napisałem ani słowa. Za poprawki w dziale C++ ma się wziąć drugi admin, jak będzie miał czas :)

2

http://wiki.haker.com.pl/index.php?title=Wprowadzenie_do_C%2B%2B

C++ to najpopularniejszy język programowania do ogólnego zastosowania

Może na desktopie, ale wtedy nie jest to "ogólnego zastosowania". W ogólnym rozrachunku C++ jest mniej popularny niż C czy Java.

można w nim pisać aplikacje biurowe, systemy operacyjne, gry 2D i 3D, a nawet łączyć z innymi językami!

To samo można napisać o C, Pascalu, czy nawet Haskellu, '!' użyty bez powodu.

C++ zadziała pod każdą maszyną

Tak można napisać o C, nie o C++.

posiada wysoko wydajny plik wynikowy, czyli gotowy program jest szybki.

Albo też nie posiada pliku wynikowego wcale, kiedy jest interpretowany. O wydajności pliku wynikowego możemy mówić jedynie w kontekście konkretnych kompilatorów i zastosowanych bibliotek. C++ bywa wolniejszy od Javy m. in. ze względu na mechanikę destruktorów.

Na przykład taki Windows, został napisany w całości w C, ale ty będziesz miał C++ czyli bardziej zaawansowany język!

Jądro zostało napisane w C, część sterowników i bibliotek zawiera C++. Debugowałeś kiedyś aplikacje pod Windows mając zaciągnięte symbole dla bibliotek systemowych? Jedna z naszych aplikacji powodowała kiedyś problemy w winlogon, patrząc po symbolach to w Win7 ten jeden z podstawowych komponentów systemu jest napisany w całości w C++. Właśnie popatrzyłem w symbole dla explorer.exe z Windows XP, używa ATL i WTL, niemal wszystkie symbole leżą w klasach. W win32k.sys (część Win32 leżąca po stronie jądra systemu) widać ślady dziesiątek klas, np. BEZIER, DC, BRUSH, REGION... Wnioski na bazie tego, że udostępniane API jest kompatybilne z C? To jedyny sposób na kompatybilność z wieloma językami i kompilatorami (C++ nie ma stabilnego ABI).

Żadna konstrukcja czy inna zawiłość C++ nie była tworzona nadaremnie

export.

jeśli będziesz czytał ten kurs i pominiesz choć najmniejszy szczegół, może się okazać, że nie będziesz potrafił rozwiązać danego problemu, a jeśli już to będzie mało wydajny algorytm

Rozwiązywanie problemów jest w dużej mierze niezależne od języka, złożoność obliczeniowa to kwestia algorytmu (algorytm to abstrakcja, nie kod!) i użytych struktur danych, kursy składni C++ tego nie nauczą.

Dlaczego nie dołączycie do istniejącego projektu? Zamiast pomóc w rozwoju już istniejących źródeł wiedzy to marnujecie tylko energię, zakładasz milionowe wiki od newbie dla newbie. Spójrz na to tak: jeśli faktycznie chcesz pomóc to nie powinieneś zwiększać rozproszenia wiedzy po Sieci, im więcej tego typu projektów, tym niższy ich poziom merytoryczny. Im więcej takich wiki, tym mniejsza szansa, że znajdzie się ktoś, kto znajdzie i poprawi błędy, zwłaszcza w bardziej zaawansowanych kwestiach.

0

Witam. Uważam, że trochę przesadzacie. Encyklopedia ma zaledwie kilka dni. Ja jak na razie napisałem tylko art. o funkcjach w C++, odpowiem więc na zarzuty na jego temat.

"Mieszasz standardy C++. Tutaj w funkcji main. Faktycznie można pominąć return 0, ale poprawna deklaracja main wymaga typu."

Mój błąd. Zapomniałem przetestować kod...

Specjalistą nie jestem, ale main to chyba może być tylko jedne na cały program, więc nie może być "co najmniej jednej funkcji main()" tylko "dokładnie jedna".

Zauważ dwukropek. Napisałem, że z co najmniej jednej funkcji: main. Nie chodzi o to że może być więcej funkcji main, tylko o to że może być sam main, lub main i więcej funkcji.

To już się może czepiam, ale zdefiniuj co to jest "góra" i "dół".
Takie pojęcia nie istnieją w przypadku programów/plików.

Jak dla mnie to jest oczywiste. Góra: wyżej w pliku, dół: niżej w pliku. Oczywiście, że takie pojęcie istnieje. Kompilator tłumaczy kod od pierwszej linii do ostatniej. Oczywiście najpierw działa preprocesor. Wstawia zainkludowane pliki w odpowiednie miejsce. Jeśli jest inaczej to powiedz jak, chętnie sie dowiem.

A jak przekażę obiekt lub tablicę?

Wtedy też przekazujesz kopie, tyle że adresu. Możemy w funkcji zmienić adres obiektu? Raczej nie, więc nie możesz zmienić argumentu który jest adresem. poza tym, dalej opisałem przekazywanie przez referencje, wskaznik, i przekazywanie tablicy.

To chyba wszystko co odnosi się do mojego artykułu.

Dlaczego nie dołączycie do istniejącego projektu? Zamiast pomóc w rozwoju już istniejących źródeł wiedzy to marnujecie tylko energię, zakładasz milionowe wiki od newbie dla newbie. Spójrz na to tak: jeśli faktycznie chcesz pomóc to nie powinieneś zwiększać rozproszenia wiedzy po Sieci, im więcej tego typu projektów, tym niższy ich poziom merytoryczny. Im więcej takich wiki, tym mniejsza szansa, że znajdzie się ktoś, kto znajdzie i poprawi błędy, zwłaszcza w bardziej zaawansowanych kwestiach.

Proszę, podaj mi namiary na istniejący projekt tego typu. Jedyne co znalazłem na ten temat w polskim internecie to kanał Gynvaela na youtube, jego blog, książke o pisaniu OS na wikibooks, kilka starych kursów asma(16bit) i forum uw-team. Z tego za pomoc dobrej jakości uważam tylko kanał Gynvaela. W innych miejscach albo treści jest strasznie mało, albo jest przestarzała. Nigdzie nie znalazłem takiego projektu. To jest wiki, więc każdy może pisać. Zamiast tylko krytykować(oczywiście to też jakaś pomoc) moglibyście pomóc.

0

Po rzuceniu okiem na artykuły z działu C i C++ mój wniosek się nie zmienił: blind leading the blind. Sporo błędów, nieścisłości, złych nawyków.

Również, fascynuje mnie wasze podejście, które z mojego punktu widzenia wygląda tak: "byle by coś opublikować; nie musi być sprawdzone, nie musi być poprawne, nie musimy tego rozumieć, byle by było; poprawki się zrobi jak będzie czas/jak przyjdzie ktoś inny". Well, good job, udało wam się "coś" opublikować.

Edit:

Mój błąd. Zapomniałem przetestować kod...

Dziękuje, za potwierdzenie tego co napisałem.

0
Gynvael Coldwind napisał(a):

Po rzuceniu okiem na artykuły z działu C i C++ mój wniosek się nie zmienił: blind leading the blind. Sporo błędów, nieścisłości, złych nawyków.

Dział C prowadzę na razie tylko ja. Artykuły są sprawdzone i oparte o anglojęzyczne oficjalne źródła.

2
0DFh napisał(a):

Artykuły są sprawdzone i oparte o anglojęzyczne oficjalne źródła.
Jasne...
http://wiki.haker.com.pl/index.php?title=C/Zmienne_i_typy_danych:

$liczba //nie można użyć tego znaku w nazwie

http://gynvael.coldwind.pl/?id=318

0

Dlaczego nie ma przypisów, jeżeli się o jakieś źródła opierasz?
Jedynym źródłem przy omawianiu składni języka oraz działania kompilatora powinien być standard.

0

Rozumiem że w arcie o funkcjach C++ nie ma już żadnych błędów?

4

Po kilka przykładów "co mi nie pasuje" w działach C i C++.

C++, 1: http://wiki.haker.com.pl/index.php?title=C%2B%2B/Funkcje_-_Cegie%C5%82ki_programu#Przekazywanie_tablicy_do_funkcji
Parametr funkcji all_to_zero oraz display_table nazywa się "size", jednak do obu funkcji w ich wywołaniu w main przekazywane jest ... no właśnie, co? Indeks ostatniego elementu (nazwa zmiennej na to nie wskazuje)?
Size tablicy wynosi oczywiście 11, a nie 10. W związku z czym w rozumieniu przyjętych konwencji tworzenia tego typu funkcji, a także sugerując się nazwą parametru, w obu funkcjach jest off-by-one.
for(int i = 0; i <= size; i++)

C++, 2: http://wiki.haker.com.pl/index.php?title=C%2B%2B/Funkcje_-_Cegie%C5%82ki_programu#Modyfikatory_funkcji
inline fun();
extern fun();
Brak zwracanego typu? Jest on wymagany przez standard - N3337 7 par. 9: "Only in function declarations for constructors, destructors, and type conversions can the decl-specifier-seq be omitted" z dopiskiem "The “implicit int” rule of C is no longer supported."
Np. g++ rzuca błąd: error: ISO C++ forbids declaration of 'fun' with no type
(Co prawda niektóre kompilatory ignorują w tym miejscu standard, jak np. g++ z -fpermissive, niemniej jednak jak rozumiem to wiki o C++ a nie o "niektórych kompilatorach z niektórymi flagami kompilującymi trochę zmienione C++")

C++, 3: http://wiki.haker.com.pl/index.php?title=C%2B%2B/Zmienne_i_typy_danych

#include <iostream>
int main()
{
int wiek= 18;   
cout << "Czesc";
{   
cout << "Czesc, masz " << wiek << "lat."; // Zmiennej możemy używac także w tych klamrach i będzie działać.
}
cout << wiek; 
return 0;
}

No cóż, zmienna "wiek" na pewno zmienną globalną nie jest (tj. nie należy do globalnej przestrzeni nazw, oraz nie ma static-storage-duration; zazwyczaj te dwie cechy opisywały zmienne globalne).

C, 1: Cóż... o $ w nazwie pisał już lukasz1235 wyżej :)

C, 2: http://wiki.haker.com.pl/index.php?title=C/Preprocesor#.23define
Zły nawyk:

#define dodaj(a,b) a+b
int a = 2 * dodaj(1,1);

Wynik, którego będzie spodziewał się początkujący: 4
Wynik faktyczny: 3
Powinno być: #define DODAJ(a,b) ((a)+(b)) i do tego jakaś uwaga o tym dlaczego należy z makrami postępować ostrożnie

C, 3: http://wiki.haker.com.pl/index.php?title=C/Procedury_i_funkcje#Tworzenie_procedur

Procedura to funkcja, która nie zwraca wyniku.

W C nie ma procedur. Również, w C funkcja, która nie zwraca wyniku, nadal nazywana jest funkcją. Procedury w formie o jakiej piszesz są w Turbo Pascalu, ale jak rozumiem, to miał być kurs C?
Naprawdę sprawdzałeś to wg standardu? Widzę dokładnie 0 wystąpień słowa "procedure" zarówno w najnowszym drafcie C11 jak i w standardzie C89.

C, 4: http://wiki.haker.com.pl/index.php?title=C/Obs%C5%82uga_b%C5%82%C4%99d%C3%B3w

Język C nie oferuje żadnego systemu obsługi błędów (nazywanego też systemem obsługi wyjątków).
Obsługa błędów w języku C sprowadza się do sprawdzania wartości zwróconej przez funkcję, wyświetlenie odpowiedniego komunikatu oraz zamknięcie programu z kodem błędu.

A Signal handling z signal.h? Albo wsparcie dla error reporting z error.h? Oba liby są częścią standardu.

C, 5: I na deser: http://wiki.haker.com.pl/index.php?title=C/Pierwszy_program

Niżej mamy funkcję getchar() dodałem ją, aby program czekał na naciśnięcie klawisza, a nie znikał od razu po uruchomieniu.

Jak poznać początkującego? Nie umie obsługiwać konsoli, więc wrzuca getchar() na koniec swojego programu.

Uwag mam dużo więcej, ale nie o to chodzi, żebym po kolei wytykał każdy błąd, jak za parę dni wrzucicie kolejne arty z podobnego rodzaju błędami wynikającymi z nieprzetestowanego kodu, złych nawyków, czy braku doświadczenia z wyżej wymienionymi językami.
Idealnie by było, jakbyście przysiedli i porządnie się nauczyli pisać w C/C++, a przy pisaniu artów testowali kod i faktycznie sprawdzali każdą rzecz wg standardów.

0

Fakt, nie zauwazyłem tego braku typu w przykladzie z inline i extern. Może rzeczywiście sobie daruje pisanie tego typu rzeczy...

0

Ja powiem tak: Prawie nie ma polskojęzycznych servisów na taki właśnie temat ('Low Level' na 32/64 b systemach) i uważam, że fajnie by było gdyby takowy powstał.
Jednak ludzie - no nie jest "Low level" pisanie MessageBoxa w asemblerze.
Gynvael Coldwind - no on właściwie sam nie wie czy pisać po polsku czy po angielsku :) ale
proponuję panowie autorzy spojrzeć na http://rev3rsed.blogspot.com/2010_04_01_archive.html przeczytać tylko po to żeby zobaczyć co to low level jest.

1

Przykład jak może wyglądać Low Level w Windows - znalezione dzisiaj:

http://zine.net.pl/blogs/mgrzeg/default.aspx

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