Skocz do zawartości

marcinEc

Stały użytkownik
  • Postów

    56
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez marcinEc

  1. Pouczcie się jeszcze C++ lepiej. Czym się różnic deklaracja od definicji, i co można zrobić z niekompletnym typem, a czego nie. http://forum.4programmers.net/viewtopic.php?id=73942
  2. Ups, mały błąd, powinno być: friend drzewo<T> &operator+<>(drzewo< T> &, T );bez "T" w "<>" po operator+, powinno działać...
  3. 1. To może ci pomóc wybrać właściwy rodzaj relacji pomiędzy wzorcem klasy, a funkcją zaprzyjaźnioną: http://publib.boulder.ibm.com/infocenter/m...d_templates.htm 2. A widziałeś co pokazuje kompilator? a.cpp:12: warning: friend declaration `drzewo<T>& operator+(drzewo<T>&, T)' decl ares a non-template function a.cpp:12: warning: (if this is not what you intended, make sure the function tem plate has already been declared and add <> after the function name here) -Wno-no n-template-friend disables this warning Tak naprawdę kompilator nie wie co TY chcesz zrobić, ale mówic ci co możesz zrobić :) Przerzuć deklarację operatora+ PRZED deklaracje klasy drzewo i dodaj "<>" po nazwie, to wtedy kompilator będzie wiedział, że chcesz użyć szablonu funkcji: [....]//!!template<class T> class drzewo; // forward declaration!//!! najpierw szablon funkcji//poczatek przeciazonego +template< class T >drzewo< T > &operator+( drzewo< T > &tree1 , T dana ) { tree1->wstaw_dane( dana );}//!!template< class T > class drzewo { friend class wierzcholek<T>; friend drzewo< T > &operator+<T>(drzewo< T> &, T ); //!! tu zmiana[.....]Powinno pomóc. 3. Żeby już wszystko wyłapać: In member function `bool drzewo<T>::wstaw_dane(const T&)': warning: no return statement in function returning non-void Nie zwracasz wartości! 4. W C++ raczej nie powinno używać sie NULL, tylko '0' (zero)
  4. marcinEc

    Generator Kodu Uml

    Hmmm... Dziwne macie podejście ludzie. C++ jest językiem i ma swój kod, zgadza się? Ale UML jest językiem i nie ma swojego kodu??!! Bzdury opowiadacie. Jeśli komuś diagram nie pasuje do kodu to może niech spojrzy na generator kodu ANSI C++ w Rational Rose, w helpie są ładne przykłady kodu UML zapisane tekstowo w stylu: class JakaśKlasa [CodeName=SomeClass] atribute m_i:int itp. Dokładnie nie mogę podać w tej chwili niestety ale chyba chwytacie ten KOD? :D Co do rev-engineeringu to wystarczy kupić Rose'a, MagicDraw UML-a, itp. :) Dla DIA są AutoDia, cpp2dia, itp. Druga sprawa: faktycznie nauczcie się zadawać sensowne pytania :/ EOT
  5. Pytanie powinno brzmieć: jak w Windows API obsługiwać tray bo jestem tak zielony, że nie potrafię przeczytać helpa/msdna-a ALBO jak zrobić obsługę tray w MFC... bo jak to jest VC++ to nie wiadomo... WinAPI patrz: Shell_NotifyIcon MFC: na codeguru.com jest klasa A tak przy okazji: tam się nie umieszcza programu (w sensie, że on tam jakoś "wchodzi") tylko IKONKĘ, a okno programu zostaje ukryte kiedy trzeba.
  6. marcinEc

    Wątki W C/c++

    W standardzie nie ma czegoś takiego jak wątek. Wątki zależą np. od systemu operacyjnego. Jakie szukanie takie znajdowanie... http://www.accu.org/c++sig/public/threads/...ndard_C++_1.htm
  7. Jakkolwiek UML nie jest nastawiony na konkretny język o tyle istnieją generatory kodu/moduły reverse engineering dla odpowiedniego języka. Dla Delphi: ModelMaker for Borland Delphi http://www.modelmakertools.com/ Generator diagramów z kodu (reverse engineering): ESS-MODEL http://essmodel.sourceforge.net/ [Nie używałem, nie znam się ;)]
  8. b.cpp: In function `int main()': b.cpp:17: error: non-lvalue in decrement Nie umiesz czytać inglisz? ;) Zamiast --n1.wypisz(); ma być (--n1).wypisz(); Nie zmienia to faktu, że program jest źle napisany... Poza tym czy wiesz , że przeciążone operatory ++ i -- nie zachowują się tak jak myślisz jeżeli chodzi o pre- i postfix? Operator przyrostkowy (post) jest stosowany natychmiast. #include <iostream>using namespace std;class A{public: int val; A(int v) {val=v;} A& operator++() { val++; return *this;} A& operator++(int) { val++; return *this;} void print() {cout<<val<<endl;}};int main(){ A a(55); a.print(); a++.print(); //56 (++a).print(); // i tak tez nie :> A c(55); c.print(); A d = c++; //56 d.print(); (++c).print(); int b=55; cout << b << endl; cout << b++ << endl; //55 !! cout << ++b << endl; }Wynik: 55 56 !! 57 55 56 !! 57 55 55 !! a tu ok :) 57
  9. 1. Sprawdź czy rzeczywiście przekazano argument dla programu... argc... 2. Sprawdź czy otwarto plik... po fopen(). 3. Metoda z fseek() jest dobra :) 4. Pod Windows można użyć jeszcze funkcji API GetFileSize(). 5. Tam gdzie jest to możliwe można także użyć szukania plików findfirst()/findnext() [lub odpowiedników] i pobrać informację o znalezionym pliku. 6. Tak jak w przypadku 5 - na pewno jest w MinGW i MSVC++: funkcje filelength, _filelength() i _filelengthi64 z <io.h>
  10. marcinEc

    Operatory

    Operator '-' może być dwu- jak i jednoargumentowy. Zależnie od ilości argumentów operatora (dwa lub jeden) taki zostanie użyty do obliczenia wyrażenia. Nie wiem gdzie widzisz problem... class A{ int a;public: A() { a = 11; } friend A operator-(A &a);};// jako funkcja zaprzyjaźniona o jednym argumencieA operator-(A &a){ A w; w.a=-a.a; return w;}Albo jako niestatyczną, bezparametrową funkcję składową, czyli operator-() w klasie.
  11. Poprawne jest ale nie spełnia warunków podanych przez Ciebie: gdzie jest rodzaj przechowywanych danych?
  12. Zapis: - zapisujesz rozmiar tablicy (tu dajesz spację albo '\n') - zapisujesz wszystkie liczby z tablicy (rozdzielone przecinkiem albo spacją). i tyle :) Czyli, dla tablicy {1,2,3,4} dostaniesz: "4 1 2 3 4" Odczyt: - wczytujesz pierwszą liczbę: rozmiar tablicy - alokujesz pamięć na tablicę (rozmiar już masz) - wczytujesz po kolei liczby i wpisujesz do tablicy. Ponieważ wiesz ile liczb masz wczytać (znasz rozmiar tablicy) od razu możesz wyłapać błąd w pliku danych (np. za mało liczb)
  13. Naucz się lepiej programować w C/C++. A w C++ to będzie: [php:1:543e445da4] #include <iostream> #include <fstream> using namespace std; class Pytanie { public: void read(istream &is); void print(ostream &o); protected: string pyt; string a,b,c; char odp; }; void Pytanie::read(istream &is) { const streamsize bufsize = 1024; // to juz do wyboru zeby sie zmiescilo :> char buf[bufsize] = {0}; is.getline( buf, bufsize ); pyt = buf; is.getline( buf, bufsize ); a = buf; is.getline( buf, bufsize ); b = buf; is.getline( buf, bufsize ); c = buf; is.getline( buf, bufsize ); // zjadamy cala linie :) odp = buf[0]; } void Pytanie::print(ostream &o) { o << pyt << 'n'; o << a << 'n' << b << 'n' << c << endl; o << "Odp: " << odp << endl; } int main() { Pytanie p; ifstream ff("quiz.sub"); p.read( ff ); p.print( cout ); } [/php:1:543e445da4]
  14. Dżizas! Co to za herezja?!
  15. Bo chyba po to jest OnItemClick...
  16. { EDITO: Hmm, sprawdziłem parę rzeczy i rozwiązaniem nie musi być tylko ustawienie locale... Przede wszystkim kodowanie w pliku tekstowym musi odpowiadać kodowaniu ekranu, wtedy locale nie są potrzebne :> Edytor tekstu nie musi zapisać akurat pliku w wymaganym przez nas kodowaniu... Warto jakiś konwerter zastosować albo edytor, w którym można wybrać kodowanie. Za to jeśli użyjemy Unicode (np. UTF-8 ) [kodowanie UTF-8 użyte w pliku z danymi] to wtedy mamy więcej możliwości, np. konwersja między formatami kodowań, bo np. nasz plik tekstowy z danymi zapisany w CP-852 oczywiście źle będzie widoczny na CP-1250. Z Unicode nie będzie takiego problemu, a wyjście naszego programu może być przekonwertowane już na konkretną stronę kodową (czytaj: u każdego niezależnie od strony kodowej jego ekranu będą prawidłowe polskie literki). Tak czy inaczej: narodowe znaczki i kodowanie może być cholernie ciężką sprawą... } Do rozwiązywania problemów lokalizacyjnych (język, waluta, format liczb, itd.) w C służy funkcja setlocale() z biblioteki <locale.h>; w C++ jest to klasa std::locale i pomocnicze (np. locale::facet) z <locale> [ale nie pytaj mnie jak się tego w C++ używa]. Ale obsługa języków i kodowań zależy już tylko od konkretniej biblioteki (czytaj producenta). Nie wiem jak to będzie z BC++ 3.0 sprzed kilkunastu lat... Na początek spróbuj po prostu wywołać: [php:1:4dc4b70805] int main() { setlocale( LC_ALL, "" ); //.... } [/php:1:4dc4b70805] Albo ze specyfikacją języka i strony kodowej: [php:1:4dc4b70805] int main() { setlocale( LC_ALL, "polish_poland.852" ); // albo "polish_poland.1250" dla CP-1250 //.... } [/php:1:4dc4b70805] Domyślna strona kodowa zależy od Windowsa, oczywiście można ją zmienić. Ustawienie locale ma wpływ na większość standardowych funkcji pobierających czy drukujących tekst, a także na kilka operujących na stringach [szczegóły w helpie do biblioteki]. Prawdziwie narodowy program powinien raczej używać Unicode (wchar_t, wprintf, itd.)[/b]
  17. Najpierw zastanów się co naprawdę chcesz zrobić... Czy potrzebna Ci jest naprawdę macierz? Jak sobie wyobrażasz posortowanie macierzy - kolumny, wiersze, kolumna jako klucz sortowania, wiersz jako klucz sortowania?! Problemem jest to, że można doszukać się kilku sposobów "posortowania" macierzy. Może wystarczy tablica + informacja o pierwotnym położeniu elementu w macierzy (jeśli to ma znaczenie)? Użyj wtedy struktury z informacją o położeniu (w,k) i wartości, sortujesz po wartościach.
  18. Miszczu DalejLamo :x przeczytaj sobie kilka razy co zostało napisane i w jakim sensie to jest napisane ( to o domyślnych konstruktorach/destruktorach , compare akapit1 akapit2 ) :o . Posłuchaj w języku programowania jakim jest C++ wszystko jest formalnie ustalone i nie ma "praktycznego punktu widzenia" albo coś się dzieje albo nie. I sens w jakim jest to napisane też tego nie zmienia. A nie rozumiesz, że to jest błędne stwierdzenie: Konstruktor domyślny NIE JEST zawsze deklarowany. Nie wierzysz pewnie, no to przykładzik: [php:1:294c2ccc79] class A { int i; public: A(int _i) { i = _i; } }; int main() { A a( 2 ); //ok A b; // error! } [/php:1:294c2ccc79] Wyjście kompilatora: c.cpp: In function `int main()': c.cpp:11: error: no matching function for call to `A::A()' c.cpp:2: note: candidates are: A::A(const A&) c.cpp:5: note: A::A(int) I gdzie jest konstruktor domyślny? :wink: P.S. Chodzi mi tylko i wyłącznie o faktyczny stan rzeczy, a nie domysły... Jeśli ktoś źle coś rozumie, nie wie czegoś to po co się pcha z odpowiedzią? P.S.2 Przy okazji ten wątek praktycznie przyda się osobom, które chcą się czegoś dowiedzieć o konstruktorach w C++.
  19. Hmmm, RTFH. EnumFontFamiliesEx() to funkcja API Windows GDI ('wingdi.h') a nie "coś" z .NET. Czy używanie API Windowsa to taki problem pod BCB?? Czy już bez VCL nie da się nic zrobić? :roll:
  20. "Przeczytaj jakis kurs/ksiazke, to jest obszerny temat i nikt nie bedzie go tutaj tlumaczyl." Fakt i tyle powinno wystarczyć. Weż nie osłabiaj mnie razor1, bo chyba nie wiesz kiedy jest automatycznie generowany konstruktor domyślny? A jak to automatycznie wygenerowany (w pewnych warunkach!) konstruktor domyślny nic nie robi??? A konstrukcja klas bazowych + konstrukcja obiektów składowych to jest nic?? Ech, nie znasz się to nie pisz.
  21. 1. A po co ? Object Pascal w niczym nie ustępuje C++ , jest równie szybki. 2. Co chcesz od VCL, to jest ogólnie mówiąc najbardziej user-friendly biblioteka (MFC i WinApi, jest bleee) 3. Jak słyszę gadanie o dużym .exe to smutno mi się robi :) To nie te czasy już, bo teraz nie liczy się +400 kB kodu więcej tylko jego szykość i stabilność , a dam se głowę uciąć że te + 400kb kodu (czy ile tam jest w Delphi) sprawia że program wykonuje się szybciej mając to w sobie na stałe zintegrowane niż jakby miał to tworzyć dynamicznie przez MSWirusa czy odczytywać z jakiegoś pliku biliotek. Większy .exe , .dll ale szybszy i bezproblemowy. Tak, tak... Mnie też by się przydał masażysta... Te, gościu czytaj może oryginalny post, co? "Potrzeba mi zmniejszyc wielkośc tworzonych plików . [...]" :evil:
  22. To akurat daje odwrotny efekt bo program/dll skompilowany pod delphi 2005 jest większy niz w D7. Oczywiście poprawienie generacji/optymalizacji kodu nie oznacza, że nie dodają mnóstwo rzeczy (klas czy całych technologi) do VCL... No ale to tak jak napisałem: albo małe albo VCL :roll:
  23. Ponieważ nie napisałeś dokładnie co w Delphi piszesz (a Delphi wcale nie implikuje programu okienkowego i to jeszcze w VCL...) to podaje różne możliwości. RTFH na temat generowania kodu. Wyłączyć generowanie/linkowanie debug info, line numbers, itd. Włączyć generację nastawioną na rozmiar, nie na szybkość. Włączyć generację kodu dla procesora Pentium (lub nowszego). Linkować tylko używane biblioteki (o ile automatycznie Delphi tego nie robi?). Wyłączyć wyjątki (?). Wyłączyć sprawdzanie indeksów tablic, NULL pointerów, itp. (?) [(?) Niestety akurat nie mam w tej chwili dostępu do Delphi i dokładnie nie mogę sprawdzić jakie są te opcje, i czy są w Delphi] NIE UŻYWAĆ VCL! Zamiast tego Windows API (o ile się umie i można...). [inne wyjście -> KOL http://bonanzas.rinet.ru/] Zmienić Delphi na nowszą wersję. Zmienić język programowania na C/C++ :) No niestety - jak się chce mieć łatwo to płaci się wielkością pliku, i jeszcze ten VCL... ech. No niestety, tu już nic nie poradzisz... Albo runtime DLL, albo linkowanie do (dużego) exe.
  24. Jednej funkcji to raczej nie ma... W WinAPI jest funkcja WideCharToMultiByte(), ale ona konwertuje z wide-char (wchar_t) na format wielobajtowy (np. UTF-8 ). Jest też MultiByteToWideChar(), która konwertuje odwrotnie. Łącząc działanie obu można uzyskać konwersję CP-1250 na UTF-8: [php:1:1f25a1b7d9] #include <windows.h> #include <string.h> #include <stdio.h> #include <locale.h> char s[] = "ZaxBFxF3xB3 cixE6n"; int main() { const int wbufsize = 1000; WCHAR wbuffer[ wbufsize ] = {0}; const int mbbufsize = 1000; char mbbuffer[1000]; // najpierw CP-1250 na unicode MultiByteToWideChar( 1250, // strona kodowa 0, // flags s, -1, wbuffer, wbufsize ); setlocale( LC_ALL, "" ); // zeby wprintf dobrze dzialal wprintf( wbuffer ); printf("n"); // z unicode na UTF-8 WideCharToMultiByte( CP_UTF8, 0, wbuffer, -1, mbbuffer, mbbufsize, NULL, NULL ); // wydrukuj w postaci UTF-8, oczywiscie bez dekodowania printf( mbbuffer ); } [/php:1:1f25a1b7d9]
  25. przeciez dosc wyraznie napisac ze c++ :) mysle ze jedynym slusznym wyjsciem bedzie: [php:1:223ea76b80] for(int i=0; i<strlen(tablica_znakow); ++i) { switch(tablica_znakow) { case kod_utf: tablica_znakow = kod_1250; case kod_utfnr2; tablica_znakow = kod_1250nr2; ... itd } } [/php:1:223ea76b80] w case wypisujesz kody znakow utf i kazesz zamieniac na kody znakow 1250 Tak, tak i co jeszcze? :? A co to za UTF jest?? Bo np. taki UTF-8 jest kodowany w taki sposób, że jeden znak nie musi wcale zająć 1 bajtu, np. polskie literki o kodach powyżej 0x0100, tylko może to być od 1 do 4 bajtów - jak to w Unicode zresztą... jest 2^31 znaków... A tych Unicode'ów to od cholery jest: UCS-2, UCS-2BE, UCS-2LE, UCS-4, UCS-4LE, UCS-4BE, UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, itd. :)
×
×
  • Dodaj nową pozycję...