Ĺadny brzuch
Postanowiłem zrobić FAQ, ponieważ napewno przydałoby się wielu ludziom.
A tak wogóle
REGULAMIN!
- piszcie posty w stylu
Pytanie
Odpowiedź Odpowiedź
Odpowiedź Odpowiedź
- piszcie w miarę bez błędów i mało chaotycznym językiem
- kod umieszczajcie pomiędzy [ code ] i [ /code ]
- nie piszcie samych pytań jeśli czegoś nie wiecie
- piszcie nowe posty a nie edytujcie (do moderatorów: wiem ze to nabijanie liczby postow, ale latwiej bedzie sie polapac z nowymi pytaniami)
Spis pytań będe uaktualniał jak będę miał wolny czas (przynajmniej spróbuje)
A więc piszcie...
Wszystkie odnośniki są nowe. Mam nadzieje, że działają... :D
Pytania wraz z odpowiedziami:
1. Jak zacząć
2. Jak zapisać/otworzyć plik? (C++ Builder)
3. Jak zapisać liczbę do pliku za pomocą STL?
4. Jak odczytać 128 bajt od końca pliku przy pomocy STL?
5. Jak wczytać dane z klawiatury?
6. Jak zapisać i odczytać z plików binarnych?
7. Jak wyświetlić tekst?
8. Jak zapętlić program?
9. Jak wyświetlić tekst literka po literce?
10. Jak przechowywać łańcuchy znaków?
11. Co to jest przestrzeń nazw (namespace) i jak tego używać?
12. Ile znaków w stringu?
13. Jak wyświetlić komunikat w Windows API?
14. Jak sprawdzić na jaki przycisk nacisnął użytkownik w okienku MessageBox?
15. Jak skopiować, przenieść lub skasować plik?
16. Jak sprawdzić, czy podana litera leży w alfabecie dajel czy bliżej niż druga podana litera?
17. Czy mozna umiescic procedure zdarzeniowa okna w klasie?
18. Jak odczytać nazwę komputera?
19. Jak odczytać nazwę użytkownika?
20. Jak wyłączyc komputer programowo w Windows 9x?
21. Jak odczytać numer seryjny dysku?
22. Jak wylączyc komputer w Windows NT i podobnych?
23. Jak odczytać nazwę dysku?
24. Jak odczytać system plików używany przez dysk?
25. Jak sprawdzic ilosc wolnej pamieci RAM?
26. Jak wysunac i wsunac szufladke CD-ROMu?
27. Potrzebuje opisu tej i tej funkcji, gdzie go moge znalezc?
28. Jak wyczyscic ekran (w wielu systemach)?
29. Jak zmienić kolor czcionki?
30. Jakie moge sobie wybrac atrybuty kosoli (w zwiazku z pytaniem wyzej)?
31. Chce napisac gre - jako jezyk wybralem C++. Jak to zrobic?
32. Do czego służą argumenty funkcji głównej i jak ich używać?
33. Jak wyswietlic tekst przy pomocy biblioteki stdio?
34. Jak pobrać w WinAPI wersje zainstalowanego systemu Windows?
35. Jak wyświetlić tekst na pulpcie? [WinApi]
36. Jak odczytać scieżki folderów systemowych?
37. Jak ustalic rozmiar folderu z plikami?
38. W jaki sposob przyblizyc liczbe zmiennoprzecinkowa do najblizszej calosci?
39. Juz kilka razy na forum widzialem zwrot "Warsztat",ale nic konkretnego mi to nie mowi. O co chodzi?
40. Jak drukować tekst?
41. Co to jest STL?
42. Jak napisac klase z mozliwoscia utworzenia tylko jednej instancji?
43. Jak zinterpretować i użyć liczbowych argumentów funkcji main?
44. Co to jest singleton i z czym to się je?
45. Jak skompilować program za pomocą C++ Buildera, by można było go uruchomić na innych komputerach, gdzie nie ma zainstalowanych bibliotek?
46. Jak w C++ Builderze włączyć/wyłączyć obsługę wyjątków ?
47. Jak sknfigurowac program w BCB, by można było go uruchomić na innych komputerach, gdzie nie ma zainstalowanych bibliotek? - sposob 2
48. Jak zamienić polskie małe literki typu ąćęłńóźż na duże ?
49. Jak uruchomić dany plik w domyślnym programie używająć funkcji powłoki ShellExecuteEx() ?
50. Jak napisać i używać biblioteki DLL?
51. Jak tworzyć i używać klas abstrakcyjnych ?
52. Co to jest WinAPI?
53. Jak zrobić własną konsolke windows? [WinApi]
54. Jak sprawdzić, ile czasu jest uruchomiony system Windows?
55. Jak zamienić pojedyńcze znaki na inne w łańcuchu std::string?
56. Jak pobrać listę plików NIE używając WinApi?
57. Jak pobrać długość pliku?
58. Jak odczytać dane z Rejestru?
59. Jak programowo kliknąć myszą?
60. Jak zamknąć, zrestartować system oraz wylogować użytkownika? (dla Win 9X)
61. Jak ukryć ikony z paska zadań?
62. Jak zablokować wygaszacz?
63. Jak zmienić godzinę systemową?
64. Jak rysowac po pulpicie?
65. Jak zablokować możliwość wyłączenia aplikacji?
Ściana chwały
Voodoo
lelek_m
kurak
Konrad_st
Real_Noname
kiperoman
Użytkownik Voodoo edytował ten post 24 wrzesień 2005, 08:32
Jak zacząć ???
Naukę kazdego języka najprosciej zaczac od napisania programu "Hello World".
Oto program "Hello World" w C++:
#include <iostream> // dołaczenie pliku, który zawiera definicje funkcji [np. cout] using namespace std; int main() // funkcja główna { cout << "Hello World !!!" << endl; // skieruj na ekran tekst "Hello World !!!" i wprowadź znak końca lini - przenies kursor do nastepnej system("PAUSE"); } // Koniec
P>S. To dla poczatkujacych ;] Powodzenia
Użytkownik migajek edytował ten post 23 sierpień 2006, 15:19
Jak zapisać/otworzyć plik?
A więc dwa przykłady otwierania
Jesli chcemy otworzyc plik do RichEdit if(OpenDialog1->Execute()) RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName); //za pomocą OpenDialog1 otwieramy plik //-------------------------------------------------------------------- A tu ValueListEditor if(OpenDialog1->Execute()) ValueListEditor1->Strings->LoadFromFile(OpenDialog1->FileName); //za pomocą OpenDialog1 otwieramy plik
A teraz zapisywanie
RichEdit1 if(SaveDialog1->Execute()) RichEdit1->Lines->SaveToFile(SaveDialog1->FileName); //za pomocą SaveDialog1 zapisujemy plik //-------------------------------------------------------------------- ValueListEditor if(SaveDialog1->Execute()) ValueListEditor1->Strings->SaveToFile(SaveDialog1->FileName); //za pomocą SaveDialog1 zapisujemy plik
U mnie działa...
Użytkownik Voodoo edytował ten post 04 sierpień 2005, 16:17
Jak zapisać liczbę do pliku za pomocą STL?
Zapis:
#include <iostream> #include <ofstream> #include <string> int main() { int licz = 20; // owa liczba std::string filename = "boo.txt"; // owy plik ofstream fp; // strumień wyjściowy fp.open( filename.c_str() ); fp << licz; // zapis fp.close(); return 0; }
Odczyt:
#include <iostream> #include <ifstream> #include <string> int main() { int licz; // zmienna na liczbe std::string filename = "boo.txt"; // owy plik ifstream fp; // strumień wejściowy fp.open( filename.c_str() ); fp >> licz; //odczyt fp.close(); cout << "Liczba: " << licz << std::endl; return 0; }
Komentarz:
Ja chce żeby tu było FAQ C++ a nie FAQ builder'a :P
Jak odczytać 128 bajt od końca pliku przy pomocy STL?
#include <iostream> #include <fstream> // jak ktoś woli może być ifstream #include <string> using namespace std; int main() { string strNazwaPliku = "x.mp3"; char cBajt; ifstream ifsFile; ifsFile.open(strNazwaPliku.c_str()); ifsFile.seekg(-128, ios::end); ifsFile.get(cBajt); ifsFile.close(); cout << "128 bajt od końca pliku to: " << cBajt; // Powinno być 'T' w przypadku pliku mp3 z tagami }
Ludzie!!! Przecież to faq czystego C++ a nie Borlanda. Jak tak dalej pójdzie to zobaczymy tu pytania o DirectX'a czy MFC!!!
Jak wczytać dane z klawiatury?
#include <iostream> using namespace std; int main(int argc, char *argv[]) { Â Â int liczba; Â Â cout << "Podaj jakas liczbe" << endl; Â Â cin >> liczba; Â Â cout << "Twoja liczba to " << liczba << endl; Â Â system("PAUSE"); Â Â return 0; }
Użytkownik Sobian edytował ten post 04 sierpień 2005, 16:19
Jak zapisać i odczytać z plików binarnych
Zapis:
#include <fstream> using namespace std; struct Str { char Nazwisko[30]; char Imie[15]; int Wiek; }; int main() { ofstream outfile("c:\\plik.dat", ios::binary); Str dane = {"Jan", "Kowalski", 17}; outfile.write((char*)&dane, sizeof(dane)); outfile.close(); }
Odczyt:
#include <iostream> #include <fstream> using namespace std; struct Str { char Nazwisko[30]; char Imie[15]; int Wiek; }; int main() { ifstream infile("c:\\plik.dat", ios::binary); Str dane; infile.read((char*)&dane, sizeof(dane)); infile.close(); cout << "Nazwisko: " << dane.Nazwisko << endl; cout << "Imie: " << dane.Imie << endl; cout << "Wiek: " << dane.Wiek << endl; }
Jak wyświetlić tekst?
#include <iostream> using namespace std; int main(int argc, char *argv[]) { cout << "To twoj tekst"; //tu wpisujemy tekst do wysietlenia system("PAUSE"); return 0; }
Użytkownik Voodoo edytował ten post 04 sierpień 2005, 16:25
Jak zapętlić program?
Wymienie tu dwa sposoby
Pętla while
#include <iostream> using namespace std; int main(int argc, char *argv[]) { int liczba = 10; while (liczba < 15) //ustawiamy warunek wykonania pętli { cout << "liczba to " << liczba; //instrukcje ++liczba; //instrukcje } cout << "liczba to " << liczba << endl; system("PAUSE"); return 0; }
Pętla będzie wykonywana dopóki zmienna ,,liczba" będzie mniejsza od 15
Pętla for
#include <iostream> using namespace std; int main(int argc, char *argv[]) { int liczba; for(liczba == 10;liczba < 15; ++liczba) //kolejno(warunek inicjujący;warunek sprawdzający;warunek końcowy)później opisze { cout << "liczba to " << liczba; } cout << "Twoja liczba to " << liczba << endl; system("PAUSE"); return 0; }
Warunek inicjujący - ustalamy ze zmienna ,,liczba" to 10
Warunek sprawdzajacy - kod sprawdza czy liczba jest mniejsza od 15 (jesli nie petla zostaje przerwana
Warunek koncowy - po kazdym zakonczeniu petli zostaje wykonywany
Obie petle wykonuja to samo
Jak wyświetlić tekst literka po literce ?
#include <iostream> using namespace std; int main() { char txt[25] = {"Tekst do wydrukowania..."}; for (int i = 0; i < 25; i++) //petla pozwalajaca wyswietlic kazda litere pokolei { cout << txt[i]; _sleep(1000); //funkcja ta zatrzymuje działanie programu na pewien okres milisekund podany jako parametr czyli 1000 = 1 sec. } cout << endl; //przejscie kursora do nastepnego wiersza cin.get(); //działa jak getch(); z conio.h return 0; }
Pisane na Dev-C++ 4.9.9.0. Oczywiscie to jest prosty program i mozna go udoskonalic wprowadzajac mozliwosc wyświetlania tekstu podanego przez uzytkownika.
Jak przechowywac lancuchy znakow?
Lancuchy znakow mozna przechowywac na kilka sposobow:
1. Jako tablice znakow
char acTablicaZnakow[] = { "Jol cziki rap" }; // Lancuch znakow std::cout << "Lancuch znakow to " << acTablicaZnakow << " a jego trzeci znak to " << acTablicaZnakow[2] << std::endl;
2. Jako wskaznik na znak (czyli jako tablice znakow tylko inaczej reprezentowana :D )
char* pszWskaznikNaChar = "Jakis lancuch znakow"; // Wyswietla sie tak samo!
3. Jako obiekt std::string
// Zeby korzystac z std::string trzeba dolaczyc <cstdlib> std::string strLancuchZnakow = "Bum szakalaka bum"; std::cout << "Trzeci znak lancucha znakow " << strLancuchZnakow << " to " << strLancuchZnakow[2] << std::endl;
Jezeli cos zle zrobilem to mnie poprawcie pisze to jak najszybciej moge :D Bo czasu nie mam :(
Co to jest przestrzen nazw (namespace) i jak tego uzywac?
Przestrzen nazw to taka przestrzen w ktorej mozna zadeklarowac dowolne zmienne itp, ktorych nazwy nie beda widoczne poza dana przestrzenia nazw.
Najbardziej znana przestrzenia nazw jest std ktora jest przestrzenia nazw biblioteki standardowej. Jest ona w wielu przykladowych kodach podlaczana na trwale co jest jednak zla praktyka (pozniej wyjasnie dlaczego).
1. Definiowanie przestrzeni nazw
namespace PojemnikJasia { class CPojemnikJasia { ... }; int iJakDuzeUcho = 0; int max(); }
2. Uzywanie elementu bedacego w przestrzeni nazw
// Jestesmy poza przestrzenia nazw PojemnikJasia cout << "Stopien duzosci ucha jasia to " << PojemnikJasia::iJakDuzeUcho << std::endl;
3. Podlaczanie na trwale przestrzeni nazw
//Na poczatku kodu, !!!Jestesmy poza przestrzenia nazw PojemnikJasia!!! using namespace PojemnikJasia; iJakDuzeUcho = 10; CPojemnikJasia Kowalski1("asa", 15);
Uzywanie przestrzeni nazw std
1. Uzywanie nazw z std
Przed kazda nazwa wpisujemy std::
std::cout << "Tekst" << std::endl;
2. Podlaczanie przestrzeni std
using namespace std; cout << "Jakis tekst" << endl;
3. Komentarz co do podlaczania na trwale przestrzeni std
Duzo osob na poczatku nauki C++ kiedy dowie sie, ze zeby pisac zgodnie ze standardami musi uzywac przestrzeni nazw od razu zaczyna podlaczac na trwale przestrzen std (bo przeciez mniej sie pisze wtedy - tak mysla). Jednak podlaczanie przestrzeni nazw na stale jest bez sensu, bo wtedy one zdawaja sie nie istniec. Nie po to zostaly wymyslone, zeby je omijac. Nie chce wywolac zadnej wojny, ale takie jest moje (i nie tylko zdanie).
Jezeli ten post jest zbyt zawily to prosze ojakies porady jak go wyczyscic :)
Ile znaków w stringu?
#include <iostream> #include <string> using namespace std; int main() { string slowo; int Len; cout << "Wprowadz slowo!" << endl; cin >> slowo; Len = slowo.length(); cout << endl << Len << endl; }
Jak wyswietlic komunikat w Windows API
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Tekst w okienku", "Tytul okienka", MB_OK | MB_ICONINFORMATION); return 0; }
Wiecej informacji: http://msdn.microsof.../messagebox.asp
Użytkownik kurak edytował ten post 04 sierpień 2005, 17:44
Jak sprawdzic na jaki przycisk nacisnal uzytkownik w okienku MessageBox?
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { if(IDYES == MessageBox(NULL, "Tak czy nie? Musisz wybrac sam!", "Pytanie", MB_YESNO)) MessageBox(NULL, "Wybrales TAK", "Tak!", MB_OK); else MessageBox(NULL, "NIE!", "Nie!", MB_OK); return 0; }
Funkcja MessageBox moze zwrocic kilka wartosci, z tego wykorzystane tutaj IDYES.
Wiecej informacji: http://msdn.microsof.../messagebox.asp
Jak skopiować, przenieść lub skasować plik?
Pamiętajcie o pliku nagłówkowym <windows.h>!
Kopiowanie:
#include <iostream> #include <windows.h> int main() { CopyFile("c:\\plik1.txt", "f:\\plik2.txt", true); //false - jeśli plik istnieje nadpisuje go. //true - jeśli plik istnieje nie jest nadpisywany }
Przenoszenie:
#include <iostream> #include <windows.h> int main() { MoveFile("c:\\plik1.txt", "d:\\plik2.txt"); }
Kasowanie:
#include <iostream> #include <windows.h> int main() { DeleteFile("c:\\plik1.txt"); }
Należy pamiętać że w pierwszym argumencie jest ścieżka pliku źródłowego, a w drugim ścieżka pliku docelowego np:
MoveFile("plik źródłowy", "Plik docelowy");Więc należy podać pełną ścieżkę pliku docelowego wraz z nazwą, a nie tylko samą ścieżkę.
Nazwa pliku docelowego może być inna niż źródłowego.
Sprawdzanie czy plik został poprawnie skopiowany:
#include <iostream> #include <windows.h> using namespace std; int main() { if (CopyFile("c:\\plik1.txt", "d:\\plik2.txt", true)==false) cout << "Blad podczas kopiowania pliku" << endl; else cout << "Plik został skopiowany poprawnie." << endl; }
//orty ;) - m
Użytkownik migajek edytował ten post 21 październik 2006, 13:16
Jak sprawdzic, czy podana litera lezy w alfabecie dalej czy blizej niz druga podana litera
(Jak macie lepsza nazwe to powiedzcie :D )
#include <iostream> #include <cctype> int main() { char cLitera1 = NULL; char cLitera2 = NULL; // Definicje zmiennych char cL1 = NULL; char cL2 = NULL; std::cout << "Litera 1: "; std::cin >> cLitera1; // Pobieramy literki std::cout << "\nLitera 2: "; std::cin >> cLitera2; tolower(&cLitera1, &cL1); // Zmieniamy litery duze na male tolower(&cLitera1, &cL2); if(cL1 > cL2) std::cout << "Litera 1 lezy w alfabecie dalej niz litera 2"; else if(cL1 == cL2) std::cout << "To sa te same litery!"; else std:: cout << "Litera 2 lezy w alfabecie dalej niz litera 1"; }
Nie jestem pewny co do tolower, ale z tego co sprawdzilem w MSDN lib to dobrze zmniejszylem litery :D
Użytkownik kurak edytował ten post 04 sierpień 2005, 18:01
Czy mozna umiescic procedure zdarzeniowa okna w klasie?
Tak, mozna, ale musi to byc funkcja statyczna klasy. Dlaczego? Poniewaz do listy argumentow kazdej nie-statycznej funkcji w klasie dodawany jest wskaznik this, a procedura zdarzeniowa musi miec z gory ustalona liste argumentow.
btw Pytania i odpowiedzi pisze w osobnych postach poniewaz uwazam ze tak jest czytelniej - nie jestem statciarzem
Jak odczytać nazwę komputera?
#include <iostream> using namespace std; int main() { DWORD Size = MAX_COMPUTERNAME_LENGTH + 1; char Nazwa[MAX_COMPUTERNAME_LENGTH + 1]; Nazwa[0] = '\0'; GetComputerName(Nazwa, &Size); cout << Nazwa << endl; }
Użytkownik Konrad_st edytował ten post 04 sierpień 2005, 19:15
Jak odczytać nazwę użytkownika?
#include <iostream> using namespace std; int main() { DWORD Rozmiar = 0; GetUserName(NULL, &Rozmiar); char *Uzytkownik = new char[Rozmiar]; Uzytkownik[0] = '\0'; GetUserName(Uzytkownik, &Rozmiar); cout << Uzytkownik; delete [] Uzytkownik; }
Użytkownik Konrad_st edytował ten post 04 sierpień 2005, 19:17
Jak wylanczyc komputer programowo w Windows 9x?
ExitWindowsEx(EWX_POWEROFF, NULL);
Jak odczytać numer seryjny dysku?
#include <iostream> using namespace std; int main() { char aName[255] = ""; char aFileSystem[255] = ""; DWORD dwTemp; DWORD dwSerial; if (GetVolumeInformation("d:\\", aName, sizeof(aName), &dwSerial, &dwTemp, &dwTemp, aFileSystem, sizeof(aFileSystem))) { cout << dwSerial; } }
Jak wylanczyc komputer w Windows NT i podobnych?
OSVERSIONINFO vi; vi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); if(GetVersionEx(&vi)) { if(vi.dwPlatformId==VER_PLATFORM_WIN32_NT) { HANDLE hToken; TOKEN_PRIVILEGES tkp; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS) { CloseHandle(hToken); return; } } } } ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0);
Ten i poprzedni post napisane wykorzystujac FAQ ze strony programuj.com
Jak odczytać nazwę dysku?
#include <iostream> using namespace std; int main() { char aName[255] = ""; char aFileSystem[255] = ""; DWORD dwTemp; if (GetVolumeInformation("c:\\", aName, sizeof(aName), NULL, &dwTemp, &dwTemp, aFileSystem, sizeof(aFileSystem))) { cout << aName; } }
Jak odczytać system plików używany przez dysk?
#include <iostream> using namespace std; int main() { char aName[255] = ""; char aFileSystem[255] = ""; DWORD dwTemp; if (GetVolumeInformation("c:\\", aName, sizeof(aName), NULL, &dwTemp, &dwTemp, aFileSystem, sizeof(aFileSystem))) { cout << aFileSystem; } }
Jak sprawdzic ilosc wolnej pamieci RAM?
#include <winbase.h> (...) _MEMORYSTATUS memory; GlobalMemoryStatus(&memory);
Jak wysunac i wsunac szufladke CD-ROMu?
#include <msystem.h> // Otwieramy mciSendString("Set cdaudio door open wait", NULL, 0, NULL); // Zamykamy :D mciSendString("Set cdaudio door closed wait", NULL, 0, NULL);
z FAQ programuj.com
Potrzebuje opisu tej i tej funkcji, gdzie go moge znalezc?
Tego typu informacji trzeba szukac w MSDN Library (Microsoft Developer Network Library) dostepnym tutaj lub off-line razem z MS Visual Studio
Jak wyczyscic ekran (w wielu systemach)?
#include <stdio.h> printf("\033[2J"); printf("\033[0;0f");
Dziala w praktycznie kazdym systemie
by bartosak (z 4p)
Jak zmienić kolor czcionki?
#include <iostream> #include <windows.h> // trzeba to dodac koniecznie. Bez tego nie moglibysmy zmienic koloru:P using namespace std; int main(int argc, char *argv[]) { Â Â SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); //w tym przypadku zmieszaliśmy kolor niebieski z zielonym i dodaliśmy intensywność. Â Â cout << "Chyba wszystko jasne :)" << endl; Â Â system("PAUSE"); Â Â return 0; }
Użytkownik Sobian edytował ten post 04 sierpień 2005, 20:07
Jakie moge sobie wybrac atrybuty kosoli (w zwiazku z pytaniem wyzej)
Mozna wybrac sobie 3 kolory tla i 3 tekstu, mozna je mieszac i robic takze inne rzeczy. Wszystkiego dowiedziec sie mozna na stronie http://msdn.microsof...xtattribute.asp
Chce napisac gre - jako jezyk wybralem C++. Jak to zrobic?
Przeczytaj artykul pt "Chce napisac gre" autorstwa naletha. Tekst ten znajdziesz tutaj: http://warsztat.mmog...c6f1ee0bf74978a
Pytanie to moze nie jest najbardziej zgodne z tematem, ale z tego co pamietam bylo kilka takich rzeczy juz na forum, wiec moze sie przydac.
Do czego służą argumenty funkcji głównej i jak ich używać?
Zawyczaj do tego, żeby uruchamiać program w różnych wariantach.
Standardowo do każdego programu automatycznie jest dodawany jeden
argument - ścieżka programu. Program z argumentem można uruchomić
przez cmd wpisując np. C:\mojprogram\program.exe argument lub w Dev C++
Uruchom->Parametry, w okienku które sie pojawi wpisz argument.
Argumentów może być kilka, oddziela się je spacją.
Przykładem będzie ten kod:
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) //argc-liczba argumentow {                 //argv-tablica stringow z argumentami   if(argc>1) //jezeli jest wiecej niz jeden standardowy argument   {     cout<<"Wywolales program z wlasnym argumentem."<<endl;     for(int i=0; i<argc; i++) //petla wyswietlajaca wszystkie argumenty     {       cout<<"Ten argument to "<<argv[i]<<endl;     }    }   else   {     cout<<"Wywolales program bez wlasnych argumentow."<<endl;   }   system("PAUSE");   return EXIT_SUCCESS; }
Ten kod sprawdzał tylko czy i jakie agumenty wpisano. A jak wykorzystac
je w praktyce? Załóżmy że piszesz gre i zeby wybrać rozdzielczosc można
uruchomic program z parametrem np. C:\gra.exe 800 600 (coś podobnego
zastosowano w The Sims 2).
Użytkownik Filos edytował ten post 05 sierpień 2005, 10:34
Jak wyswietlic tekst przy pomocy biblioteki stdio?
Biblioteka stdio jest alternatywa dla iostream (taka informacja :D )
#include <stdio.h> // koniecznie! (...) char string[] = { "Jol Jol!" }; int liczba1 = 15; printf("Ciag formatujacy - np. to jest string: %s, a to jest liczba: %d", string, &liczba1);
Wiecej informacji o funkcji printf znajdziesz tu: http://msdn.microsof...2c_.wprintf.asp.
Jak pobrać w WinAPI wersje zainstalowanego systemu Windows
GetVersionEx jest to funkcja WinAPI która służy do pobierania informacji na temat wersji systemu Windows. Pobiera ona jako parametr wskaźnik do struktury OSVERSIONINFO i zapisuje do niego te informacje.
Przykładowa funkcja zwracająca wersje w postaci string może wyglądać tak:
std::string GetSystemVersion() { OSVERSIONINFO os; os.dwOSVersionInfoSize = sizeof(os); GetVersionEx((OSVERSIONINFO*)&os); std::string osversion="Microsoft Windows "; std::stringstream str; // Pomocny string int build = os.dwBuildNumber; switch(os.dwPlatformId) { // Windows 95, 98, ME case VER_PLATFORM_WIN32_WINDOWS: build &= 0xffff; if(!os.dwMinorVersion) osversion += "95"; else osversion += "98"; break; // Windows NT, 2000, XP, 2003 case VER_PLATFORM_WIN32_NT: switch(os.dwMajorVersion) { case 4: str<<"NT "<<os.dwMajorVersion<<"."<<os.dwMinorVersion; osversion += str.str(); break; case 5: switch (os.dwMinorVersion) { case 0: osversion+= "2000"; break; case 1: osversion+= "XP"; break; case 2: osversion+= "2003"; break; } break; }; break; } str<<" "<<os.szCSDVersion<<" (Build: "<<build<<")"; osversion += str.str(); return osversion; };
Korzystanie z funkcji:
#include <iostream> #include <string> #include <sstream> #include <windows.h> using namespace std; int main() { cout<<"Twoj system operacyjny: "<<GetSystemVersion(); return 1; }
pozdro
spax.
Użytkownik spax edytował ten post 05 sierpień 2005, 23:09
Jak wyświetlić tekst na pulpcie? [WinApi]
Żeby zrobić takie cudo, wystarczy posłużyć się paroma sprytnymi funkcjami WinApi. Zauważ, że przykładowy program jest napisany jako konsolówka, a i tak będzie poprawnie działać pod Windows. Dzieje się tak dlatego, że nagłówek windows.h poprzez polecenia pragma dołącza wszystkie potrzebne bioblioteki DLL automatycznie.
#include <iostream> #include <string> #include <windows.h> int main() { std::cout << "Podaj tekst do wyświetlenia:" << std::endl; std::string str; std::cin >> str; // pobieramy uchwyt pulpitu jako uchwyt okna. HWND hDesk = GetDesktopWindow(); // pobieramy kontekst okna (pulpitu) HDC hDC = GetWindowDC( hDesk ); if( !hDC ) { std::cout << "BLAD!!" << std::endl; return 0; } // piszemy...     x   y if( !TextOut( hDC, 20, 20, str.c_str(), str.length() ) _ { std::cout << "BLAD!!" << std::endl; return 0; } // "puszczamy" kontekst ReleaseDC( hDC ); std::cout << "Brawo! Napisales: " << str << " !" << std::endl; return 0; }
Zauważ, że do GetWindowDC równie dobrze można podać NULL jako parametr, to wtedy dostaniemy kontekst całego ekranu, a nie pulpitu. Pamiętaj, że po każdych skończonych operacjach na kontekście trzeba go puścić, by zobaczyć zmiany (jest pare wyjątków, ale o tem potem :) ).
Użytkownik Real_Noname edytował ten post 28 październik 2005, 17:51
Jak odczytać scieżki folderów systemowych?
#include <iostream> #include <shlobj.h> using namespace std; int main() { char katalog[MAX_PATH]; SHGetSpecialFolderPath(NULL, katalog, CSIDL_PERSONAL, 0); cout << "Sciezka do Moje Dokumenty: " << katalog << endl; }
Sposób drugi: (poprzedni nie dzialał w DEV C++, ten działa)
#include <iostream> #include <shlobj.h> using namespace std; int main() { LPITEMIDLIST pidl; LPMALLOC pShellMalloc; char Dir[MAX_PATH]; if (SUCCEEDED(SHGetMalloc(&pShellMalloc))) if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl))) { if (SHGetPathFromIDList(pidl, Dir)) cout << Dir << endl; pShellMalloc->Free(pidl); } pShellMalloc->Release(); }
źrudło z jakiegoś FAQ
Inne katalogi specjalne:
* CSIDL_ALTSTARTUP - programy uruchamiane wraz z systemem * CSIDL_WINDOWS - Folder z systemem operacyjnym * CSIDL_SYSTEM - Folder System32 znajdujący sie w folderze Windows * CSIDL_APPDATA - Dane aplikacji * CSIDL_BITBUCKET - wirtualny folder Kosz * CSIDL_COMMON_ALTSTARTUP - wspólne programy użytkowników uruchamiane wraz ze startem systemu * CSIDL_COMMON_DESKTOPDIRECTORY - folder plików widocznych na Pulpicie każdego użytkownika * CSIDL_COMMON_FAVORITES - wspólne Ulubione wszystkich użytkowników * CSIDL_COMMON_PROGRAMS - wspólne Programy w Menu Start * CSIDL_COMMON_STARTMENU - elementy Menu Start dla wszystkich użytkowników * CSIDL_COMMON_STARTUP - Autostart dla wszystkich użytkowników * CSIDL_CONTROLS - wirtualny folder Panelu sterowania * CSIDL_COOKIES - Cookies stron internetowych * CSIDL_DESKTOP - wirtualny folder pulpitu * CSIDL_DESKTOPDIRECTORY - fizyczny folder Pulpit * CSIDL_DRIVES - wirtualny folder Mój komputer * CSIDL_FAVORITES - ulubione obiekty * CSIDL_FONTS - folder zawierający zainstalowane czcionki * CSIDL_HISTORY - łączniki do ostatnio odwiedzonych stron * CSIDL_INTERNET - wirtualny folder reprezentujący Internet * CSIDL_INTERNET_CACHE - Temporary Internet Files * CSIDL_NETHOOD - elementy wyswietlane w Otoczeniu sieciowym * CSIDL_NETWORK - wirtualny folder Otoczenia sieciowego * CSIDL_PERSONAL - Moje dokumenty * CSIDL_PRINTERS - wirtualny folder zainstalowanych drukarek * CSIDL_PRINTHOOD - repozytorium dla łączników do drukarek * CSIDL_PROGRAMS - Programy w Menu Start * CSIDL_RECENT - ostanio używane dokumenty * CSIDL_SENDTO - opcje menu "Wyślij do..." * CSIDL_STARTMENU - Menu Start * CSIDL_STARTUP - Autostart * CSIDL_TEMPLATES - Szablony
Nazwy katalogów systemowych skopiowane z FAQ delphi tego forum
Pamiętaj by dołączyć plik <shlobj.h>!
Użytkownik Konrad_st edytował ten post 25 grudzień 2005, 13:43
Ustalenie rozmiaru folderu z plikami
Interfejs Win32 nie udostępnia funkcji, która podaje rozmiar folderu z plikami (przynajmniej ja takiej nie znalazłem dla moich potrzeb). Nic nie stoi na przeszkodzie by stworzyć taką funkcję, tak więc do ustalenia rozmiaru folderu łącznie z podfolderami i zawartymi w nich plikami należy wykorzystać strukturę TSearchRec oraz dwie funkcje FindFirst i FindNext. Funkcję, która będzie podawała rozmiar folderu z całą jego zawartością można nazwać DirectorySize(). Funkcja DirectorySize(), jako parametr przyjmuje ścieżkę do folderu. W wyniku działania funkcja zostanie zwrócona liczbę typu unsigned __int64, będąca sumą wszystkich rozmiarów plików w danym katalogu czy też w podkatalogach katalogu podanego w ścieżce. Poniżej została przedstawiona przykładowa funkcja podająca rozmiar folderu:
unsigned __int64 DirectorySize(AnsiString Dir) { unsigned __int64 size=0; TSearchRec sr; if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0) { do { if(((sr.Attr & faDirectory) > 0) && (sr.Name != ".") && (sr.Name != "..")) size = DirectorySize(Dir + sr.Name + "\\") + size; if((sr.Attr & faDirectory) == 0) size = size + sr.Size; } while(FindNext(sr) == 0); FindClose(sr); } return size; }
Powyższa funkcja zwraca rozmiar folderu w bajtach. Jak wiadomo przy dużych rozmiarach liczba bajtów będzie duża, więc warto zadbać o odpowiednie formatowanie wyniku. Aby poprawić czytelność liczby można ją skonwertować do postaci napisu i wstawić separator spacji, w odpowiednich polach tego napisu. Tak więc należy napisać funkcję, która tego typu operacje wykona. Poniższy kod obrazuje jeden ze sposobów, który rozwiązuje ten problem:
AnsiString SepAdd(unsigned __int64 liczba) { if (liczba==0) return "0"; AnsiString r; while(liczba) { int w=liczba%1000; r=" "+IntToStr(w)+r; liczba/=1000; } return r; }
W wyniku działania tej funkcji liczba typu całkowitoliczbowego unsigned __int64 zostanie zamieniona na napis typu AnsiString. Celem tej zamiany jest poprawienie wizualnej czytelności liczby będącej już napisem. Przykładowy wydruk może mieć następującą postać:
123 456 789 101 123
Zabieg takiej zamiany ma na celu tylko i wyłącznie poprawienie czytelności wyniku.
W jaki sposob przyblizyc liczbe zmiennoprzecinkowa do najblizszej calosci?
Jak wiadomo, przypisanie liczby typu float lub double do zmiennej typu int powoduje obciecie czesci ulamkowej, a nie przyblizenie. Aby przyblizyc liczbe do najblizszej calosci nalezy poslozyc sie kodem:
// najpierw inkludujemy cmath (gdzies na poczatku pliku) #include <cmath> (...) double z1 = 2.34; int przybliz = floor(z1 + 0.5);Kod zaczerpniety z Warsztatu :D
Użytkownik kurak edytował ten post 10 sierpień 2005, 13:00
Juz kilka razy na forum widzialem zwrot "Warsztat",ale nic konkretnego mi to nie mowi. O co chodzi?
Mowiac (piszac :D ) "Warsztat" chodzi najczesciej o serwis Warsztat Game Design PL (w skrocie Warsztat GDPL). Znajdziesz go pod adresem http://warsztat.mmogspot.pl/. Warsztat GDPL traktuje o tworzeniu gier i zrzesza wiekszosc polskich programistow gier (tak ktos mi powiedzial :) )
Użytkownik kurak edytował ten post 07 sierpień 2005, 17:07
Jak drukować tekst?
Otóż sprawa jest bardzo prosta, zwłaszcza jeżeli znasz się na operacjach
na plikach i strumieniach. Drukarka to w PC tylko plik prn, więc
wystarczy puścić strumień do pliku. Oto kod źródłowy:
#include <cstdlib> #include <iostream> #include <fstream> #define DRUKARKA ofstream("prn", ios::out) using namespace std; int main(int argc, char *argv[]) { ofstream drukarka("prn",ios::out); //otwarcie strumienia drukarka<<"To jest tekst do wydrukowania"; //drukowanie drukarka.close(); //zamkniecie strumienia ofstream("prn", ios::out)<<"Tekst"; //^strumien anonimowy zalatwia w jednej instrukcji //otwarcie, drukowanie i zamkniecie strumienia DRUKARKA<<"Tekst 2"; //to tez nie zly pomysl system("PAUSE"); return EXIT_SUCCESS; }
Użyłem tutaj także strumieni anonimowych, które pozwalają zrobić
wszystko w jednej instrukcji.
Co to jest STL?
STL (Standard Template Library - Standardowa Biblioteka Szablonow) jest czescia biblioteki standardowej jezyka C++ i zawiera rozne pojemniki, iteratory oraz algorytmy oraz inne rzeczy.
Jak napisac klase z mozliwoscia utworzenia tylko jednej instancji?
Kod z Warsztatu, jego autorem jest revo (w troche innej wersji podal go Xion)
#include <cstdio> class CObject { private: CObject() {}; protected: static CObject* ms_pInstance; // wskaźnik do jedynej instancji public: static CObject* GetObject() { if (!ms_pInstance) ms_pInstance = new CObject(); return ms_pInstance; } void Test() { printf("Test\n"); } }; CObject* CObject::ms_pInstance=0; int main() { CObject* object = CObject::GetObject(); object->Test(); }
Chodzi tutaj o to, ze w klasie jest wskaznik na te jedyna instance, i wywolujac statyczna funkcje GetObject() ZAWSZE dostajemy ten sam wskaznik (na ten sam obiekt).
revo
Xion
Jak zinterpretować i użyć liczbowych argumentów funkcji main?
Do interpretacji liczbowych argumentów służą trzy funkcje z biblioteki stdlib.h:
atoi() - interpretacja liczb całkowitych
atol() - interpretacja liczb typu long
atof() - interpretacja liczb typu double
Zastosowanie:
//Program podnoszący liczbę podaną jako pierwszy parametr do potęgi liczby podanej jako drugi parametr #include <iostream.h> #include <stdlib.h> #include <math.h> // funkcja potegowania int main(int argc, char* argv[]) { int a = atoi(argv[1]); // liczba podnoszona do potegi int b = atoi(argv[2]); // potega int wynik = pow(a, b); cout << "Wynik potegowania to: " << wynik << endl; system("PAUSE"); }
Co to jest singleton i z czym to się je?
Singleton to klasa, która może posiadać tylko jedną instancję.
http://cpp.forall.pl..._singleton.html
Jak skompilować program za pomocą C++ Buildera, by można było go uruchomić na innych komputerach, gdzie nie ma zainstalowanych bibliotek (...)
Z menu wybieramy Project -> Options Shift+Ctrl+F11, wybieramy zakładkę Linkier Na zakładce należy odznaczyć:
- Create debug information
- Use dynamic RTL
Następnie przechodzimy na zakładkę Packages gdzie należy odznaczyć:
- Build with runtime packages
Wszystko należy oczywiście zatwierdzić przyciskiem OK :P
Jak w C++ Builderze włączyć/wyłączyć obsługę wyjątków ?
Z menu wybrać Tools -> Debugger Options...
Na zakładce General odznaczyć/zaznaczyć:
- Integrated debugging
Co zrobić gdy podczas kompilacji projekt się zawiesił i nie da się go zamknąć, bo został wywołany jakiś wyjątek?
Taki projekt można zawsze zresetować. Z menu
Run -> Reset program ewentualnie Ctrl+F2
Jak sknfigurowac program w BCB, by można było go uruchomić na innych komputerach, gdzie nie ma zainstalowanych bibliotek - sposob 2 (...)
Zamiast robic tak, jak gesiek, mozna wykorzystac to, ze wszystkie pliki, ktorych potrzebuje program do uruchomienia mozemy zobaczyc i dystrybuowac wraz z wlasnym programem. Jest to lepsze rozwiazanie, bo sam program zajmuje mniej miejsca w pamieci operacyjnej i w ogole jest mniejszy.
Wiec robimy tak:
Najpierw robimy odwrotnie ze wszystkimi opcjami, o ktorych napisal gesiek, nastepnieprzenosimy program na inny komputer ktory nie ma zainstalowanych bibliotek BCB, i odpalamy go. Na pewno pojawi sie kilka bledow o nieznalezieniu odpowiednich plikow DLL. Dokladnie zapisujemy nazwy brakujacych plikow. Nastepnie przechodzimy z powrotem na swoj komputer, szukamy odpowiednich plikow a nastepnie przenosimy je na drugi komputer, do katalogu z programem. Probojemy uruchomic program. Jezeli bedzie pytal sie o nastepne pliki, robimy z nimi tak samo, jak napisalem wczesniej, az do skutku.
ps powinno dzialac :)
ps2 ja nie chcialem bcb, ale jak juz psizecie o tym, to pomyslalem ze trzeba :)
Jak zamienić polskie małe literki typu ąćęłńóźż na duże ?
Można stworzyć własną funkcję i do tego użyć już istniejącej, np. tak jak poniżej
#include<ctype> // funkcja toupper() zamienia małe literki na wielkie unsign namespace std; char ToUpper(char z) { switch(z) { case 'ą': return 'Ą'; case 'ć': return 'Ć'; case 'ę': return 'Ę'; case 'ł': return 'Ł'; case 'ń': return 'Ń'; case 'ó': return 'Ó'; case 'ź': return 'Ź'; case 'ż': return 'Ż'; default: return toupper(z); } }
Jak zamienić polskie duże litery typu ĄĆĘŁŃÓŹŻ na małe ?
#include<ctype> // funkcja tolower() zamienia wielkie litery na małe unsign namespace std; char ToLower(char z) { switch(z) { case 'Ą': return 'ą'; case 'Ć': return 'ć'; case 'Ę': return 'ę'; case 'Ł': return 'ł'; case 'Ń': return 'ń'; case 'Ó': return 'ó'; case 'Ź': return 'ź'; case 'Ż': return 'ż'; default: return tolower(z); } }
Jak uruchomić dany plik w domyślnym programie używająć funkcji powłoki ShellExecuteEx() ?
//--------------------------------------------------------------------- void UruchomProgram(AnsiString sciezka) { SHELLEXECUTEINFO info; memset(&info,0,sizeof(info)); info.cbSize=sizeof(info); info.lpVerb="open"; info.lpFile=sciezka.c_str(); info.lpParameters=NULL; info.fMask=SEE_MASK_NOCLOSEPROCESS; info.nShow=SW_SHOWDEFAULT; if(!ShellExecuteEx(&info)) { ShowMessage("Błąd !!!"); } } //---------------------------------------------------------------------------------
Jak uruchomić dany plik np. tekstowy w notatniku używająć funkcji powłoki ShellExecute() ?
ShellExecute(this->Handle,"open","notepad.exe","c:\\plik. txt","",SW_SHOW); //ShellExecute(NULL"open","notepad.exe","c:\\plik.txt"," ",SW_SHOW); //ShellExecute(0,"open","notepad.exe","c:\\plik.txt","" ,SW_SHOW);
A czy jest inna funkcja do uruchamiania programów z rozszerzeniem *.exe ?
WinExec("c:\\prog.exe",SW_SHOW);
Jak napisać i używać biblioteki DLL?
Najbardziej uboga wersja DLL:
#include <windows.h> BOOL APIENTRY DllMain (HINSTANCE hInst /* uchwyt biblioteki */ , DWORD reason /* sposób wywołania DLL */ , LPVOID reserved /* Nie używane */ ) { switch (reason) { case DLL_PROCESS_ATTACH: //biblioteka jest ładowana break; case DLL_PROCESS_DETACH: //biblioteka jest usuwana break; case DLL_THREAD_ATTACH: //wątek jest tworzony break; case DLL_THREAD_DETACH: //wątek jest niszczony break; } /* Funkcja zwraca TRUE jeśli wszystko pójdzie dobrze*/ return TRUE; }
Taki DLL jest jednak mało użyteczny ,bo nie posiada żadnych zmiennych,funkcji,itp. na eksport.
Poniżej przedstawiam jak eksportuje się te elementy.Dla lepszej czytelności zdefiniowałem stałą:
#define EXPORT __declspec(dllexport)
Zmienne i stałe:
EXPORT int Zmienna; EXPORT extern const STALA = 8;
Przy czym trzeba zaznaczyć ,że można eksportować tylko zmienne i stałe globalne
Funkcje:
extern "C" int EXPORT test(int argument) { //instrukcje }
Wskaźnik:
EXPORT int* WskInt;//wskażnik do zmiennej EXPORT MojaKlasa* WskKlasa = new MojaKlasa;//wskażnik do klasy
Co do klasy to jej definicja powinna się znajdować zarówno w DLL jak i w programie wykożystującym.Najlepiej do tego celu stworzyć osobny plik nagłówkowy z definicjami wspólnych klas.
Więcej o klasach w DLL dowiesz się z następnego postu:
Warto wspomnieć ,iż taką bibliotekę można skompilować jako bibliotekę LIB.Od DLL różni się jedynie tym ,że jest ładowana do pamięci razem z programem ,który jej używa ,a DLL może być ładowana i zwalniana w dowolnym momencie.
Takie funkcje(zmienne,itp.) importuje się w sposób niemal identyczny jak eksportuje.Należy tylko zamienić dllexport na dllimport:
__declspec(dllimport) int zmienna_w_LIB;
Inaczej wygląda import dynamiczny.Oto przykładowy kod programu:
//deklaracja prototypu funkcji w DLL'ce int *(WINAPI MojaFunkcja) (int argument) int main(){ HMODULE biblDLL; biblDLL = LoadLibray("Biblioteka.dll");//można też GetModuleHandle("biblioteka.dll") if(!funkcja) { printf("Nie udało się stworzyć uchwytu do biblioteki"); return 0; } (MojaFunkcja &) funkcja = GetProcAdress(biblDLL,"test"); if(!funkcja) { printf("Wystąpił problem z wybieraniem funkcji"); return 0; } //wywołanie funkcji int zwrot; zwrot = funkcja(jakis_argument); printf("Funkcja w DLL zwróciła wartość: %d",zwrot); FreeLibray(biblDLL);//zwolnienie biblioteki }
Użytkownik felix.leg edytował ten post 30 sierpień 2005, 15:02
Nie no przepraszam za burzenie porządku FAQ, ale pozwolę się spytać, czy w ogóle próbowałeś kompilować powyższy kod?
Gdybyś to zrobił, to dowiedziałbyś się, że słowo EXPORT jest niezdefiniowane.
Definicja EXPORT:
#define EXPORT __declspec(dllexport)
Przykładowa eksportowana funkcja powinna wyglądać tak:
extern "C" typ_zwracany EXPORT nazwa_funkcji(parametry_funkcji);
Co tu jest ważne: extern "C" i __declspec(dllexport). To pierwsze jest wymagane do używania LoadLibrary - wymusza linkowanie w stylu C, dzięki czemu funkcja Funkcja w DLLu będzie się nazywała Funkcja, a nie typ#@@Funkcja@2b!de223 <--- ponieważ w C++ można przeciążać funkcje względem typów oraz jej stałości i tworzyć funkcje członkowskie, nazwy funkcji zawierają dodatkowe informacje. To też powoduje, że w praktyce nie da się ładować funkcji w C++ bezpośrednio przy użyciu GetProcAddress
A __declspec(dllexport) powoduje, iż funkcja jest w ogóle widziana na zewnątrz DLLa - umieszcza jej nazwę do tabeli eksportu.
extern "C" i __declspec(dllexport) da się chyba upakować do jednego define, ale nie chce mi się sprawdzać w jakiej to powinno być kolejności i kiedy stawiane :)
Idąc dalej tym tematem - kompatybilność metody LoadLibrary()/GetProcAddress()/FreeLibrary() z C++. Funkcje eksportowane w ten sposób muszą być funkcjami w stylu C. Oznacza to:
* Funkcja nie może być inline (dość logiczne, nie?) ani być członkiem klasy.
* Funkcja musi być linkowalna w stylu C - musi być poprzedzona deklaracją extern "C".
* Obiekty zwracane przez funkcje muszą mieć albo wszystkie funkcje inline albo znane po obu stronach powiązania - i u klienta, i w DLL - bo inaczej nie będzie się dało utworzyć obiektu ze względu na niezdefiniowane funkcje - a to jest lekko niepraktyczne rozwiązanie.
Powstaje zatem pytanie, jak importować duże moduły z funkcjami w C++?
Odpowiedzią jest użycie wzorca projektowego Interfejs.
Tworzymy sobie interfejs - czysto abstrakcyjną klasę z samymi publicznymi funkcjami wirtualnymi. Na przykład:
class IModule
{
public:
virtual void SomeIntrestingThing() =0;
};
Taka klasa czysto abstrakcyjna nie może być użyta jako obiekt, a jedynie jako wskaźnik. Umieszczamy jej deklarację w pliku nagłówkowym, który będzie współdzielony przez DLLa i program główny.
W tym samym pliku musimy jeszcze dać funkcję, która pobierze nasz interfejs:
extern "C" IModule* __declspec(dllexport) PobierzModul();
Funkcja ta zwróci nam wskaźnik na obiekt. Znowu, w pliku nagłówkowym znajduje się tylko deklaracja.
Następnie piszemy kod DLLa. W pliku DLLa implementujemy nasz moduł:
class CModule : public IModule
{
public:
virtual void SomeIntrestingThing()
{
std::cout << "CModule::SomeIntrestingThing()" << std::endl;
}
};
Zauważmy dziedziczenie - dzięki temu klasa CModule implementuje interfejs IModule - wykorzystując polimorfizm możemy teraz 'schować' klasę CModule pod wskaźnikiem IModule*, co zresztą zrobimy.
extern "C" IModule* __declspec(dllexport) PobierzModul()
{
static CModule module;
return &module;
}
Równie dobrze zamiast używać parametru static mogilbyśmy użyć zmiennej globalnej - niezależnie od tego chodzi po prostu o to, żeby wraz z zakończeniem funkcji nie zniknął nam przypadkiem obiekt.
W głównym programie możemy teraz zaimportować tą funkcję:
typedef void(*ptrFun)();
ptrFun funkcja = reinterpret_cast<ptrFun>(GetProcAddress("PobierzModul"));
IModule* modul = funkcja();
if(modul)
{
modul->SomeIntrestingThing();
}
Pobraliśmy wskaźnik na obiekt, i jeśli jest on poprawny to używamy go do wywołania należącej do tego obiektu funkcji. W ten sposób pisze się pluginy do programów. Metoda jest na tyle uniwersalna, że pod innym systemem operacyjnym zmieniają się tylko funkcje WinAPI i zazwyczaj znika __declspec.
Pozostaje jeszcze wytłumaczyć się z nazwy interfejs. Otóż, jak można zauważyć, program główny nie ma pojęcia o tym jaki obiekt kryje się pod wskaźnikiem na IModule - i nie powinno go to obchodzić. Wystarczy, że na tym obiekcie można wywołać funkcje zadeklarowane w IModule - program główny zna *interfejs* obiektu pod tym wskaźnikiem. Klasa CModule w DLLu implementuje interfejs IModule. Zaleta tego rozwiązania polega na tym, że możemy zrobić sobie drugą DLLkę, w niej inną klasę [np. CModule2] implementującą interfejs IModule, i dostarczyć taką samą funkcję pobierającą, a kod programu głównego tego nawet nie zauważy. Można zmieniać DLLe bez wiedzy programu.
Dobra, koniec tego przydługawego posta:)
Pozdrawiam wszystkich, CHAK DE PLANET [Hack The Planet]
TeMPOraL.
Użytkownik TeMPOraL edytował ten post 18 sierpień 2005, 15:21
Jak tworzyć i używać klas abstrakcyjnych ?
Po pierwsze - klasa abstrakcyjna to taka, która ma metody czysto wirtualne, czyli nie posiada definicji żadnej metody, co nie znaczy, że wszystkie metody muszą być czysto wirtualne, wystarczy jedna.
Metody definiujemy w klasie pochodnej.
Przykład:
#include <iostream.h> #include <conio.h> class ABSTRAKCYJNA { public: int a; virtual void aa() = 0; // metoda czysto wirtualna virtual void aaa() = 0; // druga metoda czysto wirtualna }; class POCHODNA: public ABSTRAKCYJNA { public: void aa(){ a=1; cout << "Funkcja " << a << " czysto wirtualna\n"; } // definiujemy metody void aaa(){ a=2; cout << "Funkcja " << a << " czysto wirtualna\n"; } // czysto wirtualne }; int main() { ABSTRAKCYJNA *wsk; // wskaznik do klasy abstrakcyjnej POCHODNA ob; // obiekt kl. pochodnej wsk = &ob; // wskaznik na obiekt kl. pochodnej - teraz mozemy wywolac funkcje wsk->aa(); // uzywamy funkcji wsk->aaa(); getch(); return 0; } // koniec :P
Oczywiście metody czysto wirtualne mogą robić coś innego niż przedstawiłem w przykładzie - np. wykonywać działania na liczbach.
Użytkownik ToNieJa edytował ten post 26 sierpień 2005, 20:22
Co to jest WinAPI
To interfejs programowania aplikacji Windows, można przy jego pomocy wyczyniać z systemem praktycznie wszystko na co system pozwala. Jest to biblioteka która nie jest specjalnie łatwa. Podstawa programowania Windows.
Przydatne w tej sprawie linki...
MSDN
Winapi.org
Dlaczego? A takich pytań namnożyło się jak wszy! Jak jest w FAQ - moderatorzy, usuwać topic, odesłać do FAQ i dać warna bo szlag może trafić
Użytkownik chomik edytował ten post 29 sierpień 2005, 10:06
Jak zrobić własną konsolke windows? [WinApi]
Dzisiaj postanowiłem dać coś hardcore :]. Konsola windows powinna wam się kojarzyć z tym okienkiem z czarnym tłem, która pojawia się po wpisaniu "cmd" lub "command" do polecenia "Uruchom". Jak się okazuje windows pozwala na tworzenie takich konsol dla własnego użytku. Sam zapragnąłem mieć taką, gdy zobaczyłem przy gierce Regedit'a (wtajemniczeni wiedzą o kogo chodzi :] ) przydatność tego narzędzia. Więc do dzieła!
Po wstępnym przejrzeniu biblioteki MSDN, możemy znaleźć ten arcytrudny sposób, jak powołać taką konsolkę do życia. A brzmi on tak:
AllocConsole();
I puf - pojawia się konsola! Jak na arkana WinApi, funkcja zaskakująco prosta :).
Jeżeli chcieliśmy się pochwalić, że umiemy coś takiego, to można już zakończyć konteplacje tego tekstu. No tak, ale ja zapragnąłem coś napisać na tej konsoli. I tu już rozległość WinApi daje o sobie znać :P.
Zacznijmy od tego, że żeby coś napisać, to trzeba mieć kartke... tzn, bufor do trzymania tego co napisaliśmy :]. Kolejna wizyta w źródle wiedzy ( MSDN Lib ) doprowadza mnie do funkcji GetStdHandle(); Jednak po eksperymentach okazuje się, że nie jest za dobra. Zwraca ona uchwyt do standardowego bufora, jednak się po jakimś czasię psuje i już nic nie można nic wpisać :P. Dlatego lepszym wyjściem jest stworzenie bufora własnoręcznie. A robi to się tak: Najpierw robimy uchwyt dla bufora, a później potrzebną strukturkę.
HANDLE OutHnd = NULL; SECURITY_ATTRIBUTES as;
Ta strukturka opisuje względy bezpieczeństwa dla bufora. My chcemy standardowe ustawienia, więc ustawiamy go tak:
ZeroMemory( &as, sizeof( SECURITY_ATTRIBUTES ) ); as.nLength = sizeof( SECURITY_ATTRIBUTES ); as.bInheritHandle = true;
Ok, mamy już wszystko, więc zaczynamy tworzyć bufor, z uprawnieniami, by można było go zapisywać i czytać, oraz inne procesy miały do niego dostęp.
OutHnd = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, // prawa dostępu FILE_SHARE_READ | FILE_SHARE_WRITE, // prawa dla innych procesow &as, // wskaźnik na strukture SECURITY_ATTRIBUTES CONSOLE_TEXTMODE_BUFFER, // typ konsoli, tylko taki dostępny NULL ); // zarezerwowane, nie używać
Uff, po tej operacji mamy już bufor. Można go jeszcze uczynić aktywnym buforem poprzez SetConsoleActiveScreenBuffer() dla pewności, ale to już wasze upodobanie.
Teraz nadszedł czas coś tam napisać. Robi się to tak:
char str[] = "Jakis tekst do zapisania...\n"; DWORD ile = 0; WriteConsole( OutHnd, // Uchwyt bufora str, // wskaznik na tablice z tekstem strlen( str ), // ilość znaków w tablicy &ile, // wskaźnik na zmienną, gdzie będzie zapisana ilość znaków poprawnie zapisana do bufora NULL ); // Zarezerwowane, nie używać
Yeah! Napis się wyświetlił!
No dobra, koniec zabawy, teraz trzeba wszystko pozwalniać. Musimy zniszczyć bufor, oraz zwolnić konsole. Robimy to tak:
CloseHandle( OutHnd ); FreeConsole();
No i tyle :]. Zrobiliśmy wielki wyczyn. Jeżeli jeszcze wam mało, to polecam odwiedzić biblioteke MSDN i zobaczyć kilkadziesiąt innych funkcji, którymi można wyprawiać zakręcone rzeczy, jak zmieniać kolor, napis na belce oraz wiele innych.
PS: Jak coś się kabaci, to prosze o kontakt na GG, lub e-mail na mojej stronie. Ekspertem nie jestem, ale może ja coś zwaliłem :).
Jak sprawdzić, ile czasu jest uruchomiony system Windows?
Należy użyć funkcji Win32 API GetTickCount() typu DWORD, zwracającej czas, który upłynął od włączenia systemu operacyjnego w milisekundach.
Jak zamienić pojedyńcze znaki na inne w łańcuchu std::string
Sam czasami używam tej funkcji ( np. w OpenGL po pobraniu ext'ów chce zamienić wszystkie spacje na nowe linie ), dlatego postanowiłem ją przedstawić:
#include <string> std::string StrReplaceChar( std::string str, char what, char to, bool all ) { size_t pos = 0; while( (pos = str.find( what, pos ) ) != std::string::npos ) { Â str[pos] = to; Â if( !all ) Â break; } return str; }
Zauważcie tu dwie rzeczy - pierwsza to to, że ingeruje w argument, zmieniając mu znaki. Jest to możliwe dla tego, ponieważ, jeżeli nie zaznaczymy, że mają być przekazane prawdziwe obiekty (poprzez wskaźnik, lub referencje), to zostaje stworzona ich dokładna kopia. Ja wykorzystałem ten fakt, by nie marnować pamięci, czasu na tworzenie nowego obiektu i kopiowanie do niego łańcucha, to operowałem na tej właśnie kopii, którą potem zwracam. Ale chola, chola! Przecież argumenty są kasowane pod koniec działania funkcji? Ano - nie zaznaczyłem, że obiekt zwracany musi być obiektem prawdziwym, dlatego znów tworzona jest kopia - znów wykorzystuje ten fakt kopiując wynik do nowego obiektu. Później dopiero feralny argument zostaje skasowany, a my ortrzymujemy to co chemy :]
Druga rzecz - w warunku if wykorzystuje dziwnie wyglądający ciąg std::string::npos. Jest to droga do zmiennej statycznej klasy string (wychaczam z przestrzeni nazw std, a później z klasy :] ). Co ta zmienna trzyma? Jest to wynik jaki zwraza metoda find() klasy string, gdy nie znajdzie rządanego znaku. Nie zapszątaj sobie głowy co to za wartość (tyle powiem, że nie jest ujemna, ani zerowa :] ), ważne, że działa :).
To tyle. Jak zwykle, jak coś się kaszani, itp, to mnie męczyć :]
Użytkownik Real_Noname edytował ten post 12 wrzesień 2005, 20:40
Jak pobrać listę plików NIE używając WinApi?
Jak widać - coś nowego. Jak wiadomo (prawda? :]) w WinApi jest zbiór funkcji Find*(), jednak nas ograniczają do jednego systemu. Ale jak się okazuje, są standardowe funkcje (prawda, że z C, ale zawsze coś :]), które dają nam podobną funkcjonalność. Są to funkcje _find*(); dostępne z nagłówka io.h. Oto przykładowy program:
#include <iostream> #include <io.h> int main() { std::string SourceDir; std::cout << "Enter Dir: "; std::cin >> SourceDir; std::cout << std::endl; _finddata32_t fd; memset( &fd, 0, sizeof( _finddata32_t ) ); intptr_t p = 0; if( (p = _findfirst32( ( SourceDir + "*.*" ).c_str(), &fd )) != -1 ) { do { std::cout << "File: " << this->SourceDir << fd.name; if( fd.attrib & _A_NORMAL ) std::cout << ", Normal"; if( fd.attrib & _A_RDONLY ) std::cout << ", Read Only"; if( fd.attrib & _A_HIDDEN ) std::cout << ", Hidden"; if( fd.attrib & _A_SYSTEM ) std::cout << ", System"; if( fd.attrib & _A_SUBDIR ) std::cout << ", Folder"; if( fd.attrib & _A_ARCH ) std::cout << ", Archive"; if( fd.size > 0 ) std::cout << ", Size: " << fd.size; std::cout << std::endl; } while( _findnext32( p,&fd ) != -1 ); _findclose( p ); } system("PAUSE"); return 0; }
W programie użyłem wersji funkcji 32 bitowych, ale istnieją i wersje 64 bit. Zapraszam do MSDN lib po więcej informacji.
Ważne: funkcje _findfirst i _findnext zwracają przy błędzie -1! 0 jest zwracane jako oznaka sukcesu!
Dzięki st3tc'owi za naprowadzenie na te funkcje :)
Jak pobrać długość pliku?
DataLen - wielkość pliku, unsigned int
Czysty C:
#include <io.h> #include <Fcntl.h> int fp; fp = _open( "ble.dat", _O_BINARY | _O_RDONLY ); DataLen = _filelength( fp ); _close( fp );
STL:
#include <fstream> std::fstream fp; fp.open( "ble.dat" ); fp.seekg( 0, std::ios::end ); DataLen = fp.tellg(); fp.close();
Jak odczytać dane z Rejestru?
Aby odczytać dane z rejestru w BCB, na początku trzeba zdeklarować klasę:
#include <Registry.hpp>
Więc skupmy się na odczytaniu danych pojedynczego klucza. Np. odczytamy ścieżkę folderu w którym przechowywane są czcionki systemu:
Tworzymy nowy komponent klasy TRegistry:
TRegistry *Rejestr = new TRegistry;
Teraz musimy okreslić dzial rejestru (tak to nazwałem ;) ):
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG
W moim przykładzie bedzie nas interesować HKEY_CURRENT_USER
Więc aby zaznaczyć z którego działu będziemy korzystać, wpisujemy:
Rejestr->RootKey = HKEY_CURRENT_USER; //bez cudzysłowia!!!
Jak juz wyznaczyliśmy dział musimy podac dokładną ścieżkę do naszych danych w rejestrze które chcemy odczytać.
Pamiętajmy aby wpisując ścieżkę pomijać dział oraz stawiać podwójne ukośniki:
Rejestr->OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\ \Explorer\\Shell Folders", true);
jak widzicie pojawia nam się tutaj parametr true - jeżeli wartość wynosi true, to jeżeli podana ścieżka nie istnieje to zostanie utworzone, lecz jeżeli wartość będzie wynosić false to ściezka nie zostanie utworzona w przypadku nie istnienia.
Po zdeklarowaniu ścieżki do naszego celu, możemy wybrac wiele możliwości odczytu danych. Międzi innymi odczytać całą listę kluczy z podanego wcześniej katalogu lub odczytać dane tylko z jednego klucza (String, Bool, Int), lecz my zajmiemy się w tej części odczytaniem tylko jednego klucza i zapiszemy go do zmiennej AnsiString.
Więc juz teraz pozostaje nam tylko odczytanie klucza:
AnsiString Sicezka_Fonts = Rejestr->ReadString("Fonts"); Rejestr->CloseKey(); delete Rejestr;
A więc w pierwszej linijce odczytaliśmy z klucza o nazwie "Fonts" ściezkę do folderu z czcionkami systemu windows, a następnie zapisaliśmy ją w zmiennej Sciezka_Fonts.
W drugiej linijce zamknęliśmy klucz (aby móc otworzyć następne)
A w trzeciej usunęliśmy z pamięci [b]Rejestr
mam nadzieję że ta porada wam się przyda i że zrozumieliście co tu napisałem. niebawem rozszerze ten temat i dodam jeszcze odczytywanie z rejestru
Użytkownik Ziombka edytował ten post 09 wrzesień 2005, 21:28
Jak programowo kliknąć myszą?
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Użytkownik kiperoman edytował ten post 11 wrzesień 2005, 13:25
Jak zamknąć, zrestartować system oraz wylogować użytkownika? (dla Win 9X)
Zamknięcie:
ExitWindowsEx(EWX_SHUTDOWN, 0);
lub
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
Restart:
ExitWindowsEx(EWX_REBOOT, 0);
Wylogowanie:
ExitWindowsEx(EWX_LOGOFF, 0);
Użytkownik kiperoman edytował ten post 21 listopad 2005, 19:56
Jak ukryć ikony z paska zadań?
ShowWindow(FindWindowEx(FindWindow("Shell_TrayWnd", NULL), HWND(0), "ReBarWindow32", NULL), SW_HIDE);
aby pokazać wystarczy zmienić SW_HIDE na SW_SHOW.
Użytkownik kiperoman edytował ten post 21 listopad 2005, 19:56
Jak zablokować wygaszacz?
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
Odblokowanie wygaszacza:
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
Użytkownik kiperoman edytował ten post 19 wrzesień 2005, 19:53
Jak zmienić godzinę systemową?
#include <dos.h> (...) struct time t; Â t.ti_hund = 0; Â t.ti_sec = 0; Â t.ti_min = 12; Â t.ti_hour = 15; Â settime(&t);
Użytkownik kiperoman edytował ten post 19 wrzesień 2005, 19:53
Jak rysowac po pulpicie?
TCanvas &PulpitCanvas = *new TCanvas();  PulpitCanvas.Handle = GetDC(0);  PulpitCanvas.Ellipse(50, 50, 200, 200);//tutaj piszemy co ma być rysowane  ReleaseDC(0, PulpitCanvas.Handle);  delete &PulpitCanvas;
Użytkownik kiperoman edytował ten post 19 wrzesień 2005, 19:54
Jak zablokować możliwość wyłączenia aplikacji?
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose) { CanClose = false; }
Użytkownik kiperoman edytował ten post 19 wrzesień 2005, 19:54
Jak rozpisać kwotę na odpowiednią ilość banknotów? Przy założeniu, że program nie jest idioto odporny, to mogło by to wyglądać tak:
#include<iostream.h> int RozmienKwote (int kwota, int &ile_200zl, int &ile_100zl, int &ile_50zl, int &ile_20zl, int &ile_10zl, int &ile_5zl, int &ile_2zl, int &ile_1zl); int main() { int kwota; cout<<"podaj kwote do rozpisania : "; cin>>kwota; int a, b, c, d, e, f, g, h, rob; rob=RozmienKwote (kwota, a, b, c,d,e,f,g,h); cout<<kwota<<"zl\n\n"<<a<<" x 200zl\n"<<b<<" x 100zl\n"<<c<<" x 50zl\n"<<d<<" x 20zl\n"<<e<<" x 10zl\n"<<f<<" x 5zl\n"<<g<<" x 2zl\n"<<h<<" x 1zl"<<endl<<endl; system ("pause"); return 0; } int RozmienKwote (int kwota,int &ile_200zl, int &ile_100zl, int &ile_50zl, int &ile_20zl, int &ile_10zl, int &ile_5zl, int &ile_2zl, int &ile_1zl) { ile_200zl = kwota / 200; kwota=kwota%200; ile_100zl = kwota / 100; kwota=kwota%100; ile_50zl = kwota / 50; kwota=kwota%50; ile_20zl = kwota / 20; kwota=kwota%20; ile_10zl = kwota / 10; kwota=kwota%10; ile_5zl = kwota / 5; kwota=kwota%5; ile_2zl = kwota / 2; kwota=kwota%2; ile_1zl = kwota; return ile_200zl+ile_100zl+ile_50zl+ile_20zl+ile_10zl+ile_5zl+ile_2zl+ile_1zl; }
Program rozmienia bez uwzględnienia przecinka, a jak kogoś pokusi o dorobienie reszty to bardzo prosze ;) najwyżej sam dodam jak znajde troche czasu.
Działania są w miare proste, oznaczenia chyba też. :unsure:
Jak wyliczyć sumę Sn=d(1)+d(2)+...+d(n) dla różnych wartości n, gdzie d(i) oznacza liczbę dzielników liczby i ?
#include <iostream> using namespace std; int main() { long long int a, ile, wynik; cout<<"a="; cin>>a; //if(a < 1 || a > 1000000000000) return 0; //zakres prosze ustalić sobie samemu ile=0; for(int i=1;i<=a;i++) { wynik=0; for(int k=1;k<=i;k++) { if(i%k==0) { wynik++; } } ile+=wynik; } cout<<ile; system("pause"); return 0; }
Interpolacja wielomianowa - przybliżanie (aproksymacja funkcji). Obliczanie pochodnych rzędu k. Z czym to się je ?
Algorytm Hornera wygląda tak (...) a jego przykładowa implementacja z wykorzystaniem struktury lub klasy np. tak jak po niżej
float Horner(TWielomian wielomian, float x) { float b; b=wielomian.a[0]; for(int k=1;k<=wielomian.n;k++) b=b*x+wielomian.a[k]; return b; }
A dla początkującego z przeszło 200-tu postowym stażem, gdzie by wydawać się mogło że wie w jakiej części formu zadaje się pytania, specjalna wersja bardzo uproszczona:
b=a(0);
b=b*x+ak; (gdzie k=1,2,...,n)
Jak zapisać znaki ASCII liczbowo, bitowo, hexdecymalnie i ósemkowo?
Oto lista:
Char  Num  Bits  Hex  Eight  0 00000000 0x00 00 1 00000001 0x01 01 2 00000010 0x02 02 3 00000011 0x03 03 4 00000100 0x04 04 5 00000101 0x05 05 6 00000110 0x06 06 7 00000111 0x07 07 8 00001000 0x08 10 \t 9 00001001 0x09 11 \n 10 00001010 0x0A 12 11 00001011 0x0B 13  12 00001100 0x0C 14 \r 13 00001101 0x0D 15 14 00001110 0x0E 16 15 00001111 0x0F 17 16 00010000 0x10 20 17 00010001 0x11 21 18 00010010 0x12 22 19 00010011 0x13 23 20 00010100 0x14 24 21 00010101 0x15 25 22 00010110 0x16 26 23 00010111 0x17 27 24 00011000 0x18 30 25 00011001 0x19 31 26 00011010 0x1A 32 27 00011011 0x1B 33 28 00011100 0x1C 34 29 00011101 0x1D 35 30 00011110 0x1E 36 31 00011111 0x1F 37 ' ' 32 00100000 0x20 40 ! 33 00100001 0x21 41 " 34 00100010 0x22 42 # 35 00100011 0x23 43 $ 36 00100100 0x24 44 % 37 00100101 0x25 45 & 38 00100110 0x26 46 ' 39 00100111 0x27 47 ( 40 00101000 0x28 50 ) 41 00101001 0x29 51 * 42 00101010 0x2A 52 + 43 00101011 0x2B 53 , 44 00101100 0x2C 54 - 45 00101101 0x2D 55 . 46 00101110 0x2E 56 / 47 00101111 0x2F 57 0 48 00110000 0x30 60 1 49 00110001 0x31 61 2 50 00110010 0x32 62 3 51 00110011 0x33 63 4 52 00110100 0x34 64 5 53 00110101 0x35 65 6 54 00110110 0x36 66 7 55 00110111 0x37 67 8 56 00111000 0x38 70 9 57 00111001 0x39 71 : 58 00111010 0x3A 72 ; 59 00111011 0x3B 73 < 60 00111100 0x3C 74 = 61 00111101 0x3D 75 > 62 00111110 0x3E 76 ? 63 00111111 0x3F 77 @ 64 01000000 0x40 80 A 65 01000001 0x41 81 B 66 01000010 0x42 82 C 67 01000011 0x43 83 D 68 01000100 0x44 84 E 69 01000101 0x45 85 F 70 01000110 0x46 86 G 71 01000111 0x47 87 H 72 01001000 0x48 90 I 73 01001001 0x49 91 J 74 01001010 0x4A 92 K 75 01001011 0x4B 93 L 76 01001100 0x4C 94 M 77 01001101 0x4D 95 N 78 01001110 0x4E 96 O 79 01001111 0x4F 97 P 80 01010000 0x50 100 Q 81 01010001 0x51 101 R 82 01010010 0x52 102 S 83 01010011 0x53 103 T 84 01010100 0x54 104 U 85 01010101 0x55 105 V 86 01010110 0x56 106 W 87 01010111 0x57 107 X 88 01011000 0x58 110 Y 89 01011001 0x59 111 Z 90 01011010 0x5A 112 [ 91 01011011 0x5B 113 \ 92 01011100 0x5C 114 ] 93 01011101 0x5D 115 ^ 94 01011110 0x5E 116 _ 95 01011111 0x5F 117 ` 96 01100000 0x60 120 a 97 01100001 0x61 121 b 98 01100010 0x62 122 c 99 01100011 0x63 123 d 100 01100100 0x64 124 e 101 01100101 0x65 125 f 102 01100110 0x66 126 g 103 01100111 0x67 127 h 104 01101000 0x68 130 i 105 01101001 0x69 131 j 106 01101010 0x6A 132 k 107 01101011 0x6B 133 l 108 01101100 0x6C 134 m 109 01101101 0x6D 135 n 110 01101110 0x6E 136 o 111 01101111 0x6F 137 p 112 01110000 0x70 140 q 113 01110001 0x71 141 r 114 01110010 0x72 142 s 115 01110011 0x73 143 t 116 01110100 0x74 144 u 117 01110101 0x75 145 v 118 01110110 0x76 146 w 119 01110111 0x77 147 x 120 01111000 0x78 150 y 121 01111001 0x79 151 z 122 01111010 0x7A 152 { 123 01111011 0x7B 153 | 124 01111100 0x7C 154 } 125 01111101 0x7D 155 ~ 126 01111110 0x7E 156 127 01111111 0x7F 157 € 128 10000000 0x80 160  129 10000001 0x81 161 ‚ 130 10000010 0x82 162  131 10000011 0x83 163 „ 132 10000100 0x84 164 … 133 10000101 0x85 165 † 134 10000110 0x86 166 ‡ 135 10000111 0x87 167  136 10001000 0x88 170 ‰ 137 10001001 0x89 171 Ĺ 138 10001010 0x8A 172 ‹ 139 10001011 0x8B 173 Ś 140 10001100 0x8C 174 Ť 141 10001101 0x8D 175 Ĺ˝ 142 10001110 0x8E 176 Ź 143 10001111 0x8F 177  144 10010000 0x90 180 ‘ 145 10010001 0x91 181 ’ 146 10010010 0x92 182 “ 147 10010011 0x93 183 ” 148 10010100 0x94 184 • 149 10010101 0x95 185 – 150 10010110 0x96 186 — 151 10010111 0x97 187  152 10011000 0x98 190 ™ 153 10011001 0x99 191 ĹĄ 154 10011010 0x9A 192 › 155 10011011 0x9B 193 ś 156 10011100 0x9C 194 ĹĄ 157 10011101 0x9D 195 Ĺź 158 10011110 0x9E 196 ź 159 10011111 0x9F 197  160 10100000 0xA0 200 Ë 161 10100001 0xA1 201 Ë 162 10100010 0xA2 202 Ł 163 10100011 0xA3 203 ¤ 164 10100100 0xA4 204 Ą 165 10100101 0xA5 205 ¦ 166 10100110 0xA6 206 § 167 10100111 0xA7 207 ¨ 168 10101000 0xA8 210 © 169 10101001 0xA9 211 Ĺź 170 10101010 0xAA 212 « 171 10101011 0xAB 213 ¬ 172 10101100 0xAC 214  173 10101101 0xAD 215 ® 174 10101110 0xAE 216 Ż 175 10101111 0xAF 217 ° 176 10110000 0xB0 220 ± 177 10110001 0xB1 221 Ë 178 10110010 0xB2 222 ł 179 10110011 0xB3 223 ´ 180 10110100 0xB4 224 µ 181 10110101 0xB5 225 ¶ 182 10110110 0xB6 226 · 183 10110111 0xB7 227 ¸ 184 10111000 0xB8 230 ą 185 10111001 0xB9 231 Ĺź 186 10111010 0xBA 232 » 187 10111011 0xBB 233 Ä˝ 188 10111100 0xBC 234 Ë 189 10111101 0xBD 235 Äź 190 10111110 0xBE 236 ż 191 10111111 0xBF 237 Ĺ 192 11000000 0xC0 240 Ă 193 11000001 0xC1 241 Ă 194 11000010 0xC2 242 Ä 195 11000011 0xC3 243 Ă 196 11000100 0xC4 244 Äą 197 11000101 0xC5 245 Ć 198 11000110 0xC6 246 Ă 199 11000111 0xC7 247 ÄŚ 200 11001000 0xC8 250 Ă 201 11001001 0xC9 251 Ę 202 11001010 0xCA 252 Ă 203 11001011 0xCB 253 Ä 204 11001100 0xCC 254 Ă 205 11001101 0xCD 255 Ă 206 11001110 0xCE 256 Ä 207 11001111 0xCF 257 Ä 208 11010000 0xD0 260 Ń 209 11010001 0xD1 261 Ĺ 210 11010010 0xD2 262 Ó 211 11010011 0xD3 263 Ă 212 11010100 0xD4 264 Ĺ 213 11010101 0xD5 265 Ă 214 11010110 0xD6 266 Ă 215 11010111 0xD7 267 Ĺ 216 11011000 0xD8 270 ĹŽ 217 11011001 0xD9 271 Ă 218 11011010 0xDA 272 Ĺ° 219 11011011 0xDB 273 Ăś 220 11011100 0xDC 274 Ă 221 11011101 0xDD 275 Ţ 222 11011110 0xDE 276 Ăź 223 11011111 0xDF 277 Ĺ 224 11100000 0xE0 280 ĂĄ 225 11100001 0xE1 281 â 226 11100010 0xE2 282 Ä 227 11100011 0xE3 283 ä 228 11100100 0xE4 284 Äş 229 11100101 0xE5 285 ć 230 11100110 0xE6 286 ç 231 11100111 0xE7 287 Ä 232 11101000 0xE8 290 ĂŠ 233 11101001 0xE9 291 ę 234 11101010 0xEA 292 ĂŤ 235 11101011 0xEB 293 Ä 236 11101100 0xEC 294 Ă 237 11101101 0xED 295 ĂŽ 238 11101110 0xEE 296 ÄŹ 239 11101111 0xEF 297 Ä 240 11110000 0xF0 300 ń 241 11110001 0xF1 301 Ĺ 242 11110010 0xF2 302 ó 243 11110011 0xF3 303 Ă´ 244 11110100 0xF4 304 Ĺ 245 11110101 0xF5 305 Ăś 246 11110110 0xF6 306 á 247 11110111 0xF7 307 Ĺ 248 11111000 0xF8 310 ĹŻ 249 11111001 0xF9 311 Ăş 250 11111010 0xFA 312 Ĺą 251 11111011 0xFB 313 Ăź 252 11111100 0xFC 314 Ă˝ 253 11111101 0xFD 315 ĹŁ 254 11111110 0xFE 316 Ë 255 11111111 0xFF 317
Użytkownik Real_Noname edytował ten post 26 październik 2005, 18:01
Sortowanie tablicy metodą bąbelkową
#include<conio.h> #include<iomanip.h> main() { int n, i, pom; int t[10]; //tablica 10 elementowa; int zmiana; cout << "Podaj elementy tablicy" <<endl; for (i=0; i<10; i++) cin >> t[i]; zmiana = 1; while (zmiana) { zmiana = 0; for (i=0; i<10; i++) if (t[i]>t[i+1]) { pom = t[i]; //zamiana dwoch elementow miejscami t[i] = t[i+1]; t[i+1] = pom; zmiana = 1; } } cout << "Tablica po uporzadkowaniu " <<endl; for (i=0; i<10; i++) cout <<t[i] << " "; }
Jak odczytać swój adres IP?
WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 0 ); err = WSAStartup( wVersionRequested, &wsaData );// inicjalizacja WinSock if ( err != 0 ){ Application->MessageBox("Inicjalizacja biblioteki WinSock nie powiodła się !!! ","Project 1",MB_OK ); return; } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) { Application->MessageBox("Nie posiadasz biblioteki WinSock ","Project 1",MB_OK ); WSACleanup( ); return; } unsigned long max=MAX_COMPUTERNAME_LENGTH + 1; char bufor[MAX_COMPUTERNAME_LENGTH + 1]; if(gethostname(bufor,max)==0){ hostent *MojHost; MojHost=gethostbyname(bufor); if(MojHost!=NULL){ in_addr adresIP; memcpy(&adresIP, MojHost->h_addr, sizeof(in_addr)); Label1->Caption=inet_ntoa(adresIP); //przekształcenie adresu IP na napis } } WSACleanup( );
Na formie trzeba umieścić Labela.
Użytkownik kiperoman edytował ten post 12 listopad 2005, 14:09
Jak sprawić aby program nie był wyświeltany na pasku zadań?
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { long l; l=WS_EX_TOOLWINDOW; SetWindowLong(Application->Handle,GWL_EXSTYLE,l); }
Jak odczytać nazwę BIOSu?
char MainBoardBiosName[100]; strcpy(MainBoardBiosName, (char*)0xFE061); Label1->Caption = MainBoardBiosName;
Użytkownik kiperoman edytował ten post 12 listopad 2005, 14:17
Jak zablokować przycisk START?
EnableWindow(FindWindowEx(FindWindow("Shell_TrayWnd", NULL), 0, "Button", NULL), false);
Jak odblokować przycisk START?
EnableWindow(FindWindowEx(FindWindow("Shell_TrayWnd", NULL), 0, "Button", NULL), true);
Napisałem program na konsole, czy to oznacza, że będzie działał w DOS'ie?
Odp: Nie.
Wyjaśnienie:
Najpierw poprawka: to coś co znamy pod nazwą DOS, to był 16 bitowy (o ile dobrze pamiętam) system operacyjny pracujący w trybie tekstowym. Dzisiaj dzisiaj praktycznie się go nie używa, a jego ostatnią wersję można było spotkać w Windows 95, jako dodatek do tego systemu (słynna opcja "Uruchom komputer w trybie MS-DOS").
Obecnie, aplikacje napisane pod mianem "na konsole", są skompilowane na kompilatorach 32-bitowych, i jak wskazuje nazwa - są przeznaczone na tak zwaną konsole, czyli rozszerzenie systemu operacyjnego (w Windowsie, czy Linuksie), które zwykle służyło jako narzędzie do testowania systemu (w Linuksie pełni o wiele większą rolę :) ).
A jak ktoś jest bardzo uparty, to może sobie ściągnąć 16 bitowy kompilator i napisać aplikacje działającą pod DOS, ze wszystkimi jego ograniczeniami (i możliwościami).
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
A tak wogóle
REGULAMIN!
- piszcie posty w stylu
Pytanie
Odpowiedź Odpowiedź
Odpowiedź Odpowiedź
- piszcie w miarę bez błędów i mało chaotycznym językiem
- kod umieszczajcie pomiędzy [ code ] i [ /code ]
- nie piszcie samych pytań jeśli czegoś nie wiecie
- piszcie nowe posty a nie edytujcie (do moderatorów: wiem ze to nabijanie liczby postow, ale latwiej bedzie sie polapac z nowymi pytaniami)
Spis pytań będe uaktualniał jak będę miał wolny czas (przynajmniej spróbuje)
A więc piszcie...
Wszystkie odnośniki są nowe. Mam nadzieje, że działają... :D
Pytania wraz z odpowiedziami:
1. Jak zacząć
2. Jak zapisać/otworzyć plik? (C++ Builder)
3. Jak zapisać liczbę do pliku za pomocą STL?
4. Jak odczytać 128 bajt od końca pliku przy pomocy STL?
5. Jak wczytać dane z klawiatury?
6. Jak zapisać i odczytać z plików binarnych?
7. Jak wyświetlić tekst?
8. Jak zapętlić program?
9. Jak wyświetlić tekst literka po literce?
10. Jak przechowywać łańcuchy znaków?
11. Co to jest przestrzeń nazw (namespace) i jak tego używać?
12. Ile znaków w stringu?
13. Jak wyświetlić komunikat w Windows API?
14. Jak sprawdzić na jaki przycisk nacisnął użytkownik w okienku MessageBox?
15. Jak skopiować, przenieść lub skasować plik?
16. Jak sprawdzić, czy podana litera leży w alfabecie dajel czy bliżej niż druga podana litera?
17. Czy mozna umiescic procedure zdarzeniowa okna w klasie?
18. Jak odczytać nazwę komputera?
19. Jak odczytać nazwę użytkownika?
20. Jak wyłączyc komputer programowo w Windows 9x?
21. Jak odczytać numer seryjny dysku?
22. Jak wylączyc komputer w Windows NT i podobnych?
23. Jak odczytać nazwę dysku?
24. Jak odczytać system plików używany przez dysk?
25. Jak sprawdzic ilosc wolnej pamieci RAM?
26. Jak wysunac i wsunac szufladke CD-ROMu?
27. Potrzebuje opisu tej i tej funkcji, gdzie go moge znalezc?
28. Jak wyczyscic ekran (w wielu systemach)?
29. Jak zmienić kolor czcionki?
30. Jakie moge sobie wybrac atrybuty kosoli (w zwiazku z pytaniem wyzej)?
31. Chce napisac gre - jako jezyk wybralem C++. Jak to zrobic?
32. Do czego służą argumenty funkcji głównej i jak ich używać?
33. Jak wyswietlic tekst przy pomocy biblioteki stdio?
34. Jak pobrać w WinAPI wersje zainstalowanego systemu Windows?
35. Jak wyświetlić tekst na pulpcie? [WinApi]
36. Jak odczytać scieżki folderów systemowych?
37. Jak ustalic rozmiar folderu z plikami?
38. W jaki sposob przyblizyc liczbe zmiennoprzecinkowa do najblizszej calosci?
39. Juz kilka razy na forum widzialem zwrot "Warsztat",ale nic konkretnego mi to nie mowi. O co chodzi?
40. Jak drukować tekst?
41. Co to jest STL?
42. Jak napisac klase z mozliwoscia utworzenia tylko jednej instancji?
43. Jak zinterpretować i użyć liczbowych argumentów funkcji main?
44. Co to jest singleton i z czym to się je?
45. Jak skompilować program za pomocą C++ Buildera, by można było go uruchomić na innych komputerach, gdzie nie ma zainstalowanych bibliotek?
46. Jak w C++ Builderze włączyć/wyłączyć obsługę wyjątków ?
47. Jak sknfigurowac program w BCB, by można było go uruchomić na innych komputerach, gdzie nie ma zainstalowanych bibliotek? - sposob 2
48. Jak zamienić polskie małe literki typu ąćęłńóźż na duże ?
49. Jak uruchomić dany plik w domyślnym programie używająć funkcji powłoki ShellExecuteEx() ?
50. Jak napisać i używać biblioteki DLL?
51. Jak tworzyć i używać klas abstrakcyjnych ?
52. Co to jest WinAPI?
53. Jak zrobić własną konsolke windows? [WinApi]
54. Jak sprawdzić, ile czasu jest uruchomiony system Windows?
55. Jak zamienić pojedyńcze znaki na inne w łańcuchu std::string?
56. Jak pobrać listę plików NIE używając WinApi?
57. Jak pobrać długość pliku?
58. Jak odczytać dane z Rejestru?
59. Jak programowo kliknąć myszą?
60. Jak zamknąć, zrestartować system oraz wylogować użytkownika? (dla Win 9X)
61. Jak ukryć ikony z paska zadań?
62. Jak zablokować wygaszacz?
63. Jak zmienić godzinę systemową?
64. Jak rysowac po pulpicie?
65. Jak zablokować możliwość wyłączenia aplikacji?
Ściana chwały
Voodoo
lelek_m
kurak
Konrad_st
Real_Noname
kiperoman
Użytkownik Voodoo edytował ten post 24 wrzesień 2005, 08:32
Jak zacząć ???
Naukę kazdego języka najprosciej zaczac od napisania programu "Hello World".
Oto program "Hello World" w C++:
#include <iostream> // dołaczenie pliku, który zawiera definicje funkcji [np. cout] using namespace std; int main() // funkcja główna { cout << "Hello World !!!" << endl; // skieruj na ekran tekst "Hello World !!!" i wprowadź znak końca lini - przenies kursor do nastepnej system("PAUSE"); } // Koniec
P>S. To dla poczatkujacych ;] Powodzenia
Użytkownik migajek edytował ten post 23 sierpień 2006, 15:19
Jak zapisać/otworzyć plik?
A więc dwa przykłady otwierania
Jesli chcemy otworzyc plik do RichEdit if(OpenDialog1->Execute()) RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName); //za pomocą OpenDialog1 otwieramy plik //-------------------------------------------------------------------- A tu ValueListEditor if(OpenDialog1->Execute()) ValueListEditor1->Strings->LoadFromFile(OpenDialog1->FileName); //za pomocą OpenDialog1 otwieramy plik
A teraz zapisywanie
RichEdit1 if(SaveDialog1->Execute()) RichEdit1->Lines->SaveToFile(SaveDialog1->FileName); //za pomocą SaveDialog1 zapisujemy plik //-------------------------------------------------------------------- ValueListEditor if(SaveDialog1->Execute()) ValueListEditor1->Strings->SaveToFile(SaveDialog1->FileName); //za pomocą SaveDialog1 zapisujemy plik
U mnie działa...
Użytkownik Voodoo edytował ten post 04 sierpień 2005, 16:17
Jak zapisać liczbę do pliku za pomocą STL?
Zapis:
#include <iostream> #include <ofstream> #include <string> int main() { int licz = 20; // owa liczba std::string filename = "boo.txt"; // owy plik ofstream fp; // strumień wyjściowy fp.open( filename.c_str() ); fp << licz; // zapis fp.close(); return 0; }
Odczyt:
#include <iostream> #include <ifstream> #include <string> int main() { int licz; // zmienna na liczbe std::string filename = "boo.txt"; // owy plik ifstream fp; // strumień wejściowy fp.open( filename.c_str() ); fp >> licz; //odczyt fp.close(); cout << "Liczba: " << licz << std::endl; return 0; }
Komentarz:
Ja chce żeby tu było FAQ C++ a nie FAQ builder'a :P
Jak odczytać 128 bajt od końca pliku przy pomocy STL?
#include <iostream> #include <fstream> // jak ktoś woli może być ifstream #include <string> using namespace std; int main() { string strNazwaPliku = "x.mp3"; char cBajt; ifstream ifsFile; ifsFile.open(strNazwaPliku.c_str()); ifsFile.seekg(-128, ios::end); ifsFile.get(cBajt); ifsFile.close(); cout << "128 bajt od końca pliku to: " << cBajt; // Powinno być 'T' w przypadku pliku mp3 z tagami }
Ludzie!!! Przecież to faq czystego C++ a nie Borlanda. Jak tak dalej pójdzie to zobaczymy tu pytania o DirectX'a czy MFC!!!
Jak wczytać dane z klawiatury?
#include <iostream> using namespace std; int main(int argc, char *argv[]) { Â Â int liczba; Â Â cout << "Podaj jakas liczbe" << endl; Â Â cin >> liczba; Â Â cout << "Twoja liczba to " << liczba << endl; Â Â system("PAUSE"); Â Â return 0; }
Użytkownik Sobian edytował ten post 04 sierpień 2005, 16:19
Jak zapisać i odczytać z plików binarnych
Zapis:
#include <fstream> using namespace std; struct Str { char Nazwisko[30]; char Imie[15]; int Wiek; }; int main() { ofstream outfile("c:\\plik.dat", ios::binary); Str dane = {"Jan", "Kowalski", 17}; outfile.write((char*)&dane, sizeof(dane)); outfile.close(); }
Odczyt:
#include <iostream> #include <fstream> using namespace std; struct Str { char Nazwisko[30]; char Imie[15]; int Wiek; }; int main() { ifstream infile("c:\\plik.dat", ios::binary); Str dane; infile.read((char*)&dane, sizeof(dane)); infile.close(); cout << "Nazwisko: " << dane.Nazwisko << endl; cout << "Imie: " << dane.Imie << endl; cout << "Wiek: " << dane.Wiek << endl; }
Jak wyświetlić tekst?
#include <iostream> using namespace std; int main(int argc, char *argv[]) { cout << "To twoj tekst"; //tu wpisujemy tekst do wysietlenia system("PAUSE"); return 0; }
Użytkownik Voodoo edytował ten post 04 sierpień 2005, 16:25
Jak zapętlić program?
Wymienie tu dwa sposoby
Pętla while
#include <iostream> using namespace std; int main(int argc, char *argv[]) { int liczba = 10; while (liczba < 15) //ustawiamy warunek wykonania pętli { cout << "liczba to " << liczba; //instrukcje ++liczba; //instrukcje } cout << "liczba to " << liczba << endl; system("PAUSE"); return 0; }
Pętla będzie wykonywana dopóki zmienna ,,liczba" będzie mniejsza od 15
Pętla for
#include <iostream> using namespace std; int main(int argc, char *argv[]) { int liczba; for(liczba == 10;liczba < 15; ++liczba) //kolejno(warunek inicjujący;warunek sprawdzający;warunek końcowy)później opisze { cout << "liczba to " << liczba; } cout << "Twoja liczba to " << liczba << endl; system("PAUSE"); return 0; }
Warunek inicjujący - ustalamy ze zmienna ,,liczba" to 10
Warunek sprawdzajacy - kod sprawdza czy liczba jest mniejsza od 15 (jesli nie petla zostaje przerwana
Warunek koncowy - po kazdym zakonczeniu petli zostaje wykonywany
Obie petle wykonuja to samo
Jak wyświetlić tekst literka po literce ?
#include <iostream> using namespace std; int main() { char txt[25] = {"Tekst do wydrukowania..."}; for (int i = 0; i < 25; i++) //petla pozwalajaca wyswietlic kazda litere pokolei { cout << txt[i]; _sleep(1000); //funkcja ta zatrzymuje działanie programu na pewien okres milisekund podany jako parametr czyli 1000 = 1 sec. } cout << endl; //przejscie kursora do nastepnego wiersza cin.get(); //działa jak getch(); z conio.h return 0; }
Pisane na Dev-C++ 4.9.9.0. Oczywiscie to jest prosty program i mozna go udoskonalic wprowadzajac mozliwosc wyświetlania tekstu podanego przez uzytkownika.
Jak przechowywac lancuchy znakow?
Lancuchy znakow mozna przechowywac na kilka sposobow:
1. Jako tablice znakow
char acTablicaZnakow[] = { "Jol cziki rap" }; // Lancuch znakow std::cout << "Lancuch znakow to " << acTablicaZnakow << " a jego trzeci znak to " << acTablicaZnakow[2] << std::endl;
2. Jako wskaznik na znak (czyli jako tablice znakow tylko inaczej reprezentowana :D )
char* pszWskaznikNaChar = "Jakis lancuch znakow"; // Wyswietla sie tak samo!
3. Jako obiekt std::string
// Zeby korzystac z std::string trzeba dolaczyc <cstdlib> std::string strLancuchZnakow = "Bum szakalaka bum"; std::cout << "Trzeci znak lancucha znakow " << strLancuchZnakow << " to " << strLancuchZnakow[2] << std::endl;
Jezeli cos zle zrobilem to mnie poprawcie pisze to jak najszybciej moge :D Bo czasu nie mam :(
Co to jest przestrzen nazw (namespace) i jak tego uzywac?
Przestrzen nazw to taka przestrzen w ktorej mozna zadeklarowac dowolne zmienne itp, ktorych nazwy nie beda widoczne poza dana przestrzenia nazw.
Najbardziej znana przestrzenia nazw jest std ktora jest przestrzenia nazw biblioteki standardowej. Jest ona w wielu przykladowych kodach podlaczana na trwale co jest jednak zla praktyka (pozniej wyjasnie dlaczego).
1. Definiowanie przestrzeni nazw
namespace PojemnikJasia { class CPojemnikJasia { ... }; int iJakDuzeUcho = 0; int max(); }
2. Uzywanie elementu bedacego w przestrzeni nazw
// Jestesmy poza przestrzenia nazw PojemnikJasia cout << "Stopien duzosci ucha jasia to " << PojemnikJasia::iJakDuzeUcho << std::endl;
3. Podlaczanie na trwale przestrzeni nazw
//Na poczatku kodu, !!!Jestesmy poza przestrzenia nazw PojemnikJasia!!! using namespace PojemnikJasia; iJakDuzeUcho = 10; CPojemnikJasia Kowalski1("asa", 15);
Uzywanie przestrzeni nazw std
1. Uzywanie nazw z std
Przed kazda nazwa wpisujemy std::
std::cout << "Tekst" << std::endl;
2. Podlaczanie przestrzeni std
using namespace std; cout << "Jakis tekst" << endl;
3. Komentarz co do podlaczania na trwale przestrzeni std
Duzo osob na poczatku nauki C++ kiedy dowie sie, ze zeby pisac zgodnie ze standardami musi uzywac przestrzeni nazw od razu zaczyna podlaczac na trwale przestrzen std (bo przeciez mniej sie pisze wtedy - tak mysla). Jednak podlaczanie przestrzeni nazw na stale jest bez sensu, bo wtedy one zdawaja sie nie istniec. Nie po to zostaly wymyslone, zeby je omijac. Nie chce wywolac zadnej wojny, ale takie jest moje (i nie tylko zdanie).
Jezeli ten post jest zbyt zawily to prosze ojakies porady jak go wyczyscic :)
Ile znaków w stringu?
#include <iostream> #include <string> using namespace std; int main() { string slowo; int Len; cout << "Wprowadz slowo!" << endl; cin >> slowo; Len = slowo.length(); cout << endl << Len << endl; }
Jak wyswietlic komunikat w Windows API
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Tekst w okienku", "Tytul okienka", MB_OK | MB_ICONINFORMATION); return 0; }
Wiecej informacji: http://msdn.microsof.../messagebox.asp
Użytkownik kurak edytował ten post 04 sierpień 2005, 17:44
Jak sprawdzic na jaki przycisk nacisnal uzytkownik w okienku MessageBox?
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { if(IDYES == MessageBox(NULL, "Tak czy nie? Musisz wybrac sam!", "Pytanie", MB_YESNO)) MessageBox(NULL, "Wybrales TAK", "Tak!", MB_OK); else MessageBox(NULL, "NIE!", "Nie!", MB_OK); return 0; }
Funkcja MessageBox moze zwrocic kilka wartosci, z tego wykorzystane tutaj IDYES.
Wiecej informacji: http://msdn.microsof.../messagebox.asp
Jak skopiować, przenieść lub skasować plik?
Pamiętajcie o pliku nagłówkowym <windows.h>!
Kopiowanie:
#include <iostream> #include <windows.h> int main() { CopyFile("c:\\plik1.txt", "f:\\plik2.txt", true); //false - jeśli plik istnieje nadpisuje go. //true - jeśli plik istnieje nie jest nadpisywany }
Przenoszenie:
#include <iostream> #include <windows.h> int main() { MoveFile("c:\\plik1.txt", "d:\\plik2.txt"); }
Kasowanie:
#include <iostream> #include <windows.h> int main() { DeleteFile("c:\\plik1.txt"); }
Należy pamiętać że w pierwszym argumencie jest ścieżka pliku źródłowego, a w drugim ścieżka pliku docelowego np:
MoveFile("plik źródłowy", "Plik docelowy");Więc należy podać pełną ścieżkę pliku docelowego wraz z nazwą, a nie tylko samą ścieżkę.
Nazwa pliku docelowego może być inna niż źródłowego.
Sprawdzanie czy plik został poprawnie skopiowany:
#include <iostream> #include <windows.h> using namespace std; int main() { if (CopyFile("c:\\plik1.txt", "d:\\plik2.txt", true)==false) cout << "Blad podczas kopiowania pliku" << endl; else cout << "Plik został skopiowany poprawnie." << endl; }
//orty ;) - m
Użytkownik migajek edytował ten post 21 październik 2006, 13:16
Jak sprawdzic, czy podana litera lezy w alfabecie dalej czy blizej niz druga podana litera
(Jak macie lepsza nazwe to powiedzcie :D )
#include <iostream> #include <cctype> int main() { char cLitera1 = NULL; char cLitera2 = NULL; // Definicje zmiennych char cL1 = NULL; char cL2 = NULL; std::cout << "Litera 1: "; std::cin >> cLitera1; // Pobieramy literki std::cout << "\nLitera 2: "; std::cin >> cLitera2; tolower(&cLitera1, &cL1); // Zmieniamy litery duze na male tolower(&cLitera1, &cL2); if(cL1 > cL2) std::cout << "Litera 1 lezy w alfabecie dalej niz litera 2"; else if(cL1 == cL2) std::cout << "To sa te same litery!"; else std:: cout << "Litera 2 lezy w alfabecie dalej niz litera 1"; }
Nie jestem pewny co do tolower, ale z tego co sprawdzilem w MSDN lib to dobrze zmniejszylem litery :D
Użytkownik kurak edytował ten post 04 sierpień 2005, 18:01
Czy mozna umiescic procedure zdarzeniowa okna w klasie?
Tak, mozna, ale musi to byc funkcja statyczna klasy. Dlaczego? Poniewaz do listy argumentow kazdej nie-statycznej funkcji w klasie dodawany jest wskaznik this, a procedura zdarzeniowa musi miec z gory ustalona liste argumentow.
btw Pytania i odpowiedzi pisze w osobnych postach poniewaz uwazam ze tak jest czytelniej - nie jestem statciarzem
Jak odczytać nazwę komputera?
#include <iostream> using namespace std; int main() { DWORD Size = MAX_COMPUTERNAME_LENGTH + 1; char Nazwa[MAX_COMPUTERNAME_LENGTH + 1]; Nazwa[0] = '\0'; GetComputerName(Nazwa, &Size); cout << Nazwa << endl; }
Użytkownik Konrad_st edytował ten post 04 sierpień 2005, 19:15
Jak odczytać nazwę użytkownika?
#include <iostream> using namespace std; int main() { DWORD Rozmiar = 0; GetUserName(NULL, &Rozmiar); char *Uzytkownik = new char[Rozmiar]; Uzytkownik[0] = '\0'; GetUserName(Uzytkownik, &Rozmiar); cout << Uzytkownik; delete [] Uzytkownik; }
Użytkownik Konrad_st edytował ten post 04 sierpień 2005, 19:17
Jak wylanczyc komputer programowo w Windows 9x?
ExitWindowsEx(EWX_POWEROFF, NULL);
Jak odczytać numer seryjny dysku?
#include <iostream> using namespace std; int main() { char aName[255] = ""; char aFileSystem[255] = ""; DWORD dwTemp; DWORD dwSerial; if (GetVolumeInformation("d:\\", aName, sizeof(aName), &dwSerial, &dwTemp, &dwTemp, aFileSystem, sizeof(aFileSystem))) { cout << dwSerial; } }
Jak wylanczyc komputer w Windows NT i podobnych?
OSVERSIONINFO vi; vi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); if(GetVersionEx(&vi)) { if(vi.dwPlatformId==VER_PLATFORM_WIN32_NT) { HANDLE hToken; TOKEN_PRIVILEGES tkp; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS) { CloseHandle(hToken); return; } } } } ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0);
Ten i poprzedni post napisane wykorzystujac FAQ ze strony programuj.com
Jak odczytać nazwę dysku?
#include <iostream> using namespace std; int main() { char aName[255] = ""; char aFileSystem[255] = ""; DWORD dwTemp; if (GetVolumeInformation("c:\\", aName, sizeof(aName), NULL, &dwTemp, &dwTemp, aFileSystem, sizeof(aFileSystem))) { cout << aName; } }
Jak odczytać system plików używany przez dysk?
#include <iostream> using namespace std; int main() { char aName[255] = ""; char aFileSystem[255] = ""; DWORD dwTemp; if (GetVolumeInformation("c:\\", aName, sizeof(aName), NULL, &dwTemp, &dwTemp, aFileSystem, sizeof(aFileSystem))) { cout << aFileSystem; } }
Jak sprawdzic ilosc wolnej pamieci RAM?
#include <winbase.h> (...) _MEMORYSTATUS memory; GlobalMemoryStatus(&memory);
Jak wysunac i wsunac szufladke CD-ROMu?
#include <msystem.h> // Otwieramy mciSendString("Set cdaudio door open wait", NULL, 0, NULL); // Zamykamy :D mciSendString("Set cdaudio door closed wait", NULL, 0, NULL);
z FAQ programuj.com
Potrzebuje opisu tej i tej funkcji, gdzie go moge znalezc?
Tego typu informacji trzeba szukac w MSDN Library (Microsoft Developer Network Library) dostepnym tutaj lub off-line razem z MS Visual Studio
Jak wyczyscic ekran (w wielu systemach)?
#include <stdio.h> printf("\033[2J"); printf("\033[0;0f");
Dziala w praktycznie kazdym systemie
by bartosak (z 4p)
Jak zmienić kolor czcionki?
#include <iostream> #include <windows.h> // trzeba to dodac koniecznie. Bez tego nie moglibysmy zmienic koloru:P using namespace std; int main(int argc, char *argv[]) { Â Â SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); //w tym przypadku zmieszaliśmy kolor niebieski z zielonym i dodaliśmy intensywność. Â Â cout << "Chyba wszystko jasne :)" << endl; Â Â system("PAUSE"); Â Â return 0; }
Użytkownik Sobian edytował ten post 04 sierpień 2005, 20:07
Jakie moge sobie wybrac atrybuty kosoli (w zwiazku z pytaniem wyzej)
Mozna wybrac sobie 3 kolory tla i 3 tekstu, mozna je mieszac i robic takze inne rzeczy. Wszystkiego dowiedziec sie mozna na stronie http://msdn.microsof...xtattribute.asp
Chce napisac gre - jako jezyk wybralem C++. Jak to zrobic?
Przeczytaj artykul pt "Chce napisac gre" autorstwa naletha. Tekst ten znajdziesz tutaj: http://warsztat.mmog...c6f1ee0bf74978a
Pytanie to moze nie jest najbardziej zgodne z tematem, ale z tego co pamietam bylo kilka takich rzeczy juz na forum, wiec moze sie przydac.
Do czego służą argumenty funkcji głównej i jak ich używać?
Zawyczaj do tego, żeby uruchamiać program w różnych wariantach.
Standardowo do każdego programu automatycznie jest dodawany jeden
argument - ścieżka programu. Program z argumentem można uruchomić
przez cmd wpisując np. C:\mojprogram\program.exe argument lub w Dev C++
Uruchom->Parametry, w okienku które sie pojawi wpisz argument.
Argumentów może być kilka, oddziela się je spacją.
Przykładem będzie ten kod:
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) //argc-liczba argumentow {                 //argv-tablica stringow z argumentami   if(argc>1) //jezeli jest wiecej niz jeden standardowy argument   {     cout<<"Wywolales program z wlasnym argumentem."<<endl;     for(int i=0; i<argc; i++) //petla wyswietlajaca wszystkie argumenty     {       cout<<"Ten argument to "<<argv[i]<<endl;     }    }   else   {     cout<<"Wywolales program bez wlasnych argumentow."<<endl;   }   system("PAUSE");   return EXIT_SUCCESS; }
Ten kod sprawdzał tylko czy i jakie agumenty wpisano. A jak wykorzystac
je w praktyce? Załóżmy że piszesz gre i zeby wybrać rozdzielczosc można
uruchomic program z parametrem np. C:\gra.exe 800 600 (coś podobnego
zastosowano w The Sims 2).
Użytkownik Filos edytował ten post 05 sierpień 2005, 10:34
Jak wyswietlic tekst przy pomocy biblioteki stdio?
Biblioteka stdio jest alternatywa dla iostream (taka informacja :D )
#include <stdio.h> // koniecznie! (...) char string[] = { "Jol Jol!" }; int liczba1 = 15; printf("Ciag formatujacy - np. to jest string: %s, a to jest liczba: %d", string, &liczba1);
Wiecej informacji o funkcji printf znajdziesz tu: http://msdn.microsof...2c_.wprintf.asp.
Jak pobrać w WinAPI wersje zainstalowanego systemu Windows
GetVersionEx jest to funkcja WinAPI która służy do pobierania informacji na temat wersji systemu Windows. Pobiera ona jako parametr wskaźnik do struktury OSVERSIONINFO i zapisuje do niego te informacje.
Przykładowa funkcja zwracająca wersje w postaci string może wyglądać tak:
std::string GetSystemVersion() { OSVERSIONINFO os; os.dwOSVersionInfoSize = sizeof(os); GetVersionEx((OSVERSIONINFO*)&os); std::string osversion="Microsoft Windows "; std::stringstream str; // Pomocny string int build = os.dwBuildNumber; switch(os.dwPlatformId) { // Windows 95, 98, ME case VER_PLATFORM_WIN32_WINDOWS: build &= 0xffff; if(!os.dwMinorVersion) osversion += "95"; else osversion += "98"; break; // Windows NT, 2000, XP, 2003 case VER_PLATFORM_WIN32_NT: switch(os.dwMajorVersion) { case 4: str<<"NT "<<os.dwMajorVersion<<"."<<os.dwMinorVersion; osversion += str.str(); break; case 5: switch (os.dwMinorVersion) { case 0: osversion+= "2000"; break; case 1: osversion+= "XP"; break; case 2: osversion+= "2003"; break; } break; }; break; } str<<" "<<os.szCSDVersion<<" (Build: "<<build<<")"; osversion += str.str(); return osversion; };
Korzystanie z funkcji:
#include <iostream> #include <string> #include <sstream> #include <windows.h> using namespace std; int main() { cout<<"Twoj system operacyjny: "<<GetSystemVersion(); return 1; }
pozdro
spax.
Użytkownik spax edytował ten post 05 sierpień 2005, 23:09
Jak wyświetlić tekst na pulpcie? [WinApi]
Żeby zrobić takie cudo, wystarczy posłużyć się paroma sprytnymi funkcjami WinApi. Zauważ, że przykładowy program jest napisany jako konsolówka, a i tak będzie poprawnie działać pod Windows. Dzieje się tak dlatego, że nagłówek windows.h poprzez polecenia pragma dołącza wszystkie potrzebne bioblioteki DLL automatycznie.
#include <iostream> #include <string> #include <windows.h> int main() { std::cout << "Podaj tekst do wyświetlenia:" << std::endl; std::string str; std::cin >> str; // pobieramy uchwyt pulpitu jako uchwyt okna. HWND hDesk = GetDesktopWindow(); // pobieramy kontekst okna (pulpitu) HDC hDC = GetWindowDC( hDesk ); if( !hDC ) { std::cout << "BLAD!!" << std::endl; return 0; } // piszemy...     x   y if( !TextOut( hDC, 20, 20, str.c_str(), str.length() ) _ { std::cout << "BLAD!!" << std::endl; return 0; } // "puszczamy" kontekst ReleaseDC( hDC ); std::cout << "Brawo! Napisales: " << str << " !" << std::endl; return 0; }
Zauważ, że do GetWindowDC równie dobrze można podać NULL jako parametr, to wtedy dostaniemy kontekst całego ekranu, a nie pulpitu. Pamiętaj, że po każdych skończonych operacjach na kontekście trzeba go puścić, by zobaczyć zmiany (jest pare wyjątków, ale o tem potem :) ).
Użytkownik Real_Noname edytował ten post 28 październik 2005, 17:51
Jak odczytać scieżki folderów systemowych?
#include <iostream> #include <shlobj.h> using namespace std; int main() { char katalog[MAX_PATH]; SHGetSpecialFolderPath(NULL, katalog, CSIDL_PERSONAL, 0); cout << "Sciezka do Moje Dokumenty: " << katalog << endl; }
Sposób drugi: (poprzedni nie dzialał w DEV C++, ten działa)
#include <iostream> #include <shlobj.h> using namespace std; int main() { LPITEMIDLIST pidl; LPMALLOC pShellMalloc; char Dir[MAX_PATH]; if (SUCCEEDED(SHGetMalloc(&pShellMalloc))) if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl))) { if (SHGetPathFromIDList(pidl, Dir)) cout << Dir << endl; pShellMalloc->Free(pidl); } pShellMalloc->Release(); }
źrudło z jakiegoś FAQ
Inne katalogi specjalne:
* CSIDL_ALTSTARTUP - programy uruchamiane wraz z systemem * CSIDL_WINDOWS - Folder z systemem operacyjnym * CSIDL_SYSTEM - Folder System32 znajdujący sie w folderze Windows * CSIDL_APPDATA - Dane aplikacji * CSIDL_BITBUCKET - wirtualny folder Kosz * CSIDL_COMMON_ALTSTARTUP - wspólne programy użytkowników uruchamiane wraz ze startem systemu * CSIDL_COMMON_DESKTOPDIRECTORY - folder plików widocznych na Pulpicie każdego użytkownika * CSIDL_COMMON_FAVORITES - wspólne Ulubione wszystkich użytkowników * CSIDL_COMMON_PROGRAMS - wspólne Programy w Menu Start * CSIDL_COMMON_STARTMENU - elementy Menu Start dla wszystkich użytkowników * CSIDL_COMMON_STARTUP - Autostart dla wszystkich użytkowników * CSIDL_CONTROLS - wirtualny folder Panelu sterowania * CSIDL_COOKIES - Cookies stron internetowych * CSIDL_DESKTOP - wirtualny folder pulpitu * CSIDL_DESKTOPDIRECTORY - fizyczny folder Pulpit * CSIDL_DRIVES - wirtualny folder Mój komputer * CSIDL_FAVORITES - ulubione obiekty * CSIDL_FONTS - folder zawierający zainstalowane czcionki * CSIDL_HISTORY - łączniki do ostatnio odwiedzonych stron * CSIDL_INTERNET - wirtualny folder reprezentujący Internet * CSIDL_INTERNET_CACHE - Temporary Internet Files * CSIDL_NETHOOD - elementy wyswietlane w Otoczeniu sieciowym * CSIDL_NETWORK - wirtualny folder Otoczenia sieciowego * CSIDL_PERSONAL - Moje dokumenty * CSIDL_PRINTERS - wirtualny folder zainstalowanych drukarek * CSIDL_PRINTHOOD - repozytorium dla łączników do drukarek * CSIDL_PROGRAMS - Programy w Menu Start * CSIDL_RECENT - ostanio używane dokumenty * CSIDL_SENDTO - opcje menu "Wyślij do..." * CSIDL_STARTMENU - Menu Start * CSIDL_STARTUP - Autostart * CSIDL_TEMPLATES - Szablony
Nazwy katalogów systemowych skopiowane z FAQ delphi tego forum
Pamiętaj by dołączyć plik <shlobj.h>!
Użytkownik Konrad_st edytował ten post 25 grudzień 2005, 13:43
Ustalenie rozmiaru folderu z plikami
Interfejs Win32 nie udostępnia funkcji, która podaje rozmiar folderu z plikami (przynajmniej ja takiej nie znalazłem dla moich potrzeb). Nic nie stoi na przeszkodzie by stworzyć taką funkcję, tak więc do ustalenia rozmiaru folderu łącznie z podfolderami i zawartymi w nich plikami należy wykorzystać strukturę TSearchRec oraz dwie funkcje FindFirst i FindNext. Funkcję, która będzie podawała rozmiar folderu z całą jego zawartością można nazwać DirectorySize(). Funkcja DirectorySize(), jako parametr przyjmuje ścieżkę do folderu. W wyniku działania funkcja zostanie zwrócona liczbę typu unsigned __int64, będąca sumą wszystkich rozmiarów plików w danym katalogu czy też w podkatalogach katalogu podanego w ścieżce. Poniżej została przedstawiona przykładowa funkcja podająca rozmiar folderu:
unsigned __int64 DirectorySize(AnsiString Dir) { unsigned __int64 size=0; TSearchRec sr; if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0) { do { if(((sr.Attr & faDirectory) > 0) && (sr.Name != ".") && (sr.Name != "..")) size = DirectorySize(Dir + sr.Name + "\\") + size; if((sr.Attr & faDirectory) == 0) size = size + sr.Size; } while(FindNext(sr) == 0); FindClose(sr); } return size; }
Powyższa funkcja zwraca rozmiar folderu w bajtach. Jak wiadomo przy dużych rozmiarach liczba bajtów będzie duża, więc warto zadbać o odpowiednie formatowanie wyniku. Aby poprawić czytelność liczby można ją skonwertować do postaci napisu i wstawić separator spacji, w odpowiednich polach tego napisu. Tak więc należy napisać funkcję, która tego typu operacje wykona. Poniższy kod obrazuje jeden ze sposobów, który rozwiązuje ten problem:
AnsiString SepAdd(unsigned __int64 liczba) { if (liczba==0) return "0"; AnsiString r; while(liczba) { int w=liczba%1000; r=" "+IntToStr(w)+r; liczba/=1000; } return r; }
W wyniku działania tej funkcji liczba typu całkowitoliczbowego unsigned __int64 zostanie zamieniona na napis typu AnsiString. Celem tej zamiany jest poprawienie wizualnej czytelności liczby będącej już napisem. Przykładowy wydruk może mieć następującą postać:
123 456 789 101 123
Zabieg takiej zamiany ma na celu tylko i wyłącznie poprawienie czytelności wyniku.
W jaki sposob przyblizyc liczbe zmiennoprzecinkowa do najblizszej calosci?
Jak wiadomo, przypisanie liczby typu float lub double do zmiennej typu int powoduje obciecie czesci ulamkowej, a nie przyblizenie. Aby przyblizyc liczbe do najblizszej calosci nalezy poslozyc sie kodem:
// najpierw inkludujemy cmath (gdzies na poczatku pliku) #include <cmath> (...) double z1 = 2.34; int przybliz = floor(z1 + 0.5);Kod zaczerpniety z Warsztatu :D
Użytkownik kurak edytował ten post 10 sierpień 2005, 13:00
Juz kilka razy na forum widzialem zwrot "Warsztat",ale nic konkretnego mi to nie mowi. O co chodzi?
Mowiac (piszac :D ) "Warsztat" chodzi najczesciej o serwis Warsztat Game Design PL (w skrocie Warsztat GDPL). Znajdziesz go pod adresem http://warsztat.mmogspot.pl/. Warsztat GDPL traktuje o tworzeniu gier i zrzesza wiekszosc polskich programistow gier (tak ktos mi powiedzial :) )
Użytkownik kurak edytował ten post 07 sierpień 2005, 17:07
Jak drukować tekst?
Otóż sprawa jest bardzo prosta, zwłaszcza jeżeli znasz się na operacjach
na plikach i strumieniach. Drukarka to w PC tylko plik prn, więc
wystarczy puścić strumień do pliku. Oto kod źródłowy:
#include <cstdlib> #include <iostream> #include <fstream> #define DRUKARKA ofstream("prn", ios::out) using namespace std; int main(int argc, char *argv[]) { ofstream drukarka("prn",ios::out); //otwarcie strumienia drukarka<<"To jest tekst do wydrukowania"; //drukowanie drukarka.close(); //zamkniecie strumienia ofstream("prn", ios::out)<<"Tekst"; //^strumien anonimowy zalatwia w jednej instrukcji //otwarcie, drukowanie i zamkniecie strumienia DRUKARKA<<"Tekst 2"; //to tez nie zly pomysl system("PAUSE"); return EXIT_SUCCESS; }
Użyłem tutaj także strumieni anonimowych, które pozwalają zrobić
wszystko w jednej instrukcji.
Co to jest STL?
STL (Standard Template Library - Standardowa Biblioteka Szablonow) jest czescia biblioteki standardowej jezyka C++ i zawiera rozne pojemniki, iteratory oraz algorytmy oraz inne rzeczy.
Jak napisac klase z mozliwoscia utworzenia tylko jednej instancji?
Kod z Warsztatu, jego autorem jest revo (w troche innej wersji podal go Xion)
#include <cstdio> class CObject { private: CObject() {}; protected: static CObject* ms_pInstance; // wskaźnik do jedynej instancji public: static CObject* GetObject() { if (!ms_pInstance) ms_pInstance = new CObject(); return ms_pInstance; } void Test() { printf("Test\n"); } }; CObject* CObject::ms_pInstance=0; int main() { CObject* object = CObject::GetObject(); object->Test(); }
Chodzi tutaj o to, ze w klasie jest wskaznik na te jedyna instance, i wywolujac statyczna funkcje GetObject() ZAWSZE dostajemy ten sam wskaznik (na ten sam obiekt).
revo
Xion
Jak zinterpretować i użyć liczbowych argumentów funkcji main?
Do interpretacji liczbowych argumentów służą trzy funkcje z biblioteki stdlib.h:
atoi() - interpretacja liczb całkowitych
atol() - interpretacja liczb typu long
atof() - interpretacja liczb typu double
Zastosowanie:
//Program podnoszący liczbę podaną jako pierwszy parametr do potęgi liczby podanej jako drugi parametr #include <iostream.h> #include <stdlib.h> #include <math.h> // funkcja potegowania int main(int argc, char* argv[]) { int a = atoi(argv[1]); // liczba podnoszona do potegi int b = atoi(argv[2]); // potega int wynik = pow(a, b); cout << "Wynik potegowania to: " << wynik << endl; system("PAUSE"); }
Co to jest singleton i z czym to się je?
Singleton to klasa, która może posiadać tylko jedną instancję.
http://cpp.forall.pl..._singleton.html
Jak skompilować program za pomocą C++ Buildera, by można było go uruchomić na innych komputerach, gdzie nie ma zainstalowanych bibliotek (...)
Z menu wybieramy Project -> Options Shift+Ctrl+F11, wybieramy zakładkę Linkier Na zakładce należy odznaczyć:
- Create debug information
- Use dynamic RTL
Następnie przechodzimy na zakładkę Packages gdzie należy odznaczyć:
- Build with runtime packages
Wszystko należy oczywiście zatwierdzić przyciskiem OK :P
Jak w C++ Builderze włączyć/wyłączyć obsługę wyjątków ?
Z menu wybrać Tools -> Debugger Options...
Na zakładce General odznaczyć/zaznaczyć:
- Integrated debugging
Co zrobić gdy podczas kompilacji projekt się zawiesił i nie da się go zamknąć, bo został wywołany jakiś wyjątek?
Taki projekt można zawsze zresetować. Z menu
Run -> Reset program ewentualnie Ctrl+F2
Jak sknfigurowac program w BCB, by można było go uruchomić na innych komputerach, gdzie nie ma zainstalowanych bibliotek - sposob 2 (...)
Zamiast robic tak, jak gesiek, mozna wykorzystac to, ze wszystkie pliki, ktorych potrzebuje program do uruchomienia mozemy zobaczyc i dystrybuowac wraz z wlasnym programem. Jest to lepsze rozwiazanie, bo sam program zajmuje mniej miejsca w pamieci operacyjnej i w ogole jest mniejszy.
Wiec robimy tak:
Najpierw robimy odwrotnie ze wszystkimi opcjami, o ktorych napisal gesiek, nastepnieprzenosimy program na inny komputer ktory nie ma zainstalowanych bibliotek BCB, i odpalamy go. Na pewno pojawi sie kilka bledow o nieznalezieniu odpowiednich plikow DLL. Dokladnie zapisujemy nazwy brakujacych plikow. Nastepnie przechodzimy z powrotem na swoj komputer, szukamy odpowiednich plikow a nastepnie przenosimy je na drugi komputer, do katalogu z programem. Probojemy uruchomic program. Jezeli bedzie pytal sie o nastepne pliki, robimy z nimi tak samo, jak napisalem wczesniej, az do skutku.
ps powinno dzialac :)
ps2 ja nie chcialem bcb, ale jak juz psizecie o tym, to pomyslalem ze trzeba :)
Jak zamienić polskie małe literki typu ąćęłńóźż na duże ?
Można stworzyć własną funkcję i do tego użyć już istniejącej, np. tak jak poniżej
#include<ctype> // funkcja toupper() zamienia małe literki na wielkie unsign namespace std; char ToUpper(char z) { switch(z) { case 'ą': return 'Ą'; case 'ć': return 'Ć'; case 'ę': return 'Ę'; case 'ł': return 'Ł'; case 'ń': return 'Ń'; case 'ó': return 'Ó'; case 'ź': return 'Ź'; case 'ż': return 'Ż'; default: return toupper(z); } }
Jak zamienić polskie duże litery typu ĄĆĘŁŃÓŹŻ na małe ?
#include<ctype> // funkcja tolower() zamienia wielkie litery na małe unsign namespace std; char ToLower(char z) { switch(z) { case 'Ą': return 'ą'; case 'Ć': return 'ć'; case 'Ę': return 'ę'; case 'Ł': return 'ł'; case 'Ń': return 'ń'; case 'Ó': return 'ó'; case 'Ź': return 'ź'; case 'Ż': return 'ż'; default: return tolower(z); } }
Jak uruchomić dany plik w domyślnym programie używająć funkcji powłoki ShellExecuteEx() ?
//--------------------------------------------------------------------- void UruchomProgram(AnsiString sciezka) { SHELLEXECUTEINFO info; memset(&info,0,sizeof(info)); info.cbSize=sizeof(info); info.lpVerb="open"; info.lpFile=sciezka.c_str(); info.lpParameters=NULL; info.fMask=SEE_MASK_NOCLOSEPROCESS; info.nShow=SW_SHOWDEFAULT; if(!ShellExecuteEx(&info)) { ShowMessage("Błąd !!!"); } } //---------------------------------------------------------------------------------
Jak uruchomić dany plik np. tekstowy w notatniku używająć funkcji powłoki ShellExecute() ?
ShellExecute(this->Handle,"open","notepad.exe","c:\\plik. txt","",SW_SHOW); //ShellExecute(NULL"open","notepad.exe","c:\\plik.txt"," ",SW_SHOW); //ShellExecute(0,"open","notepad.exe","c:\\plik.txt","" ,SW_SHOW);
A czy jest inna funkcja do uruchamiania programów z rozszerzeniem *.exe ?
WinExec("c:\\prog.exe",SW_SHOW);
Jak napisać i używać biblioteki DLL?
Najbardziej uboga wersja DLL:
#include <windows.h> BOOL APIENTRY DllMain (HINSTANCE hInst /* uchwyt biblioteki */ , DWORD reason /* sposób wywołania DLL */ , LPVOID reserved /* Nie używane */ ) { switch (reason) { case DLL_PROCESS_ATTACH: //biblioteka jest ładowana break; case DLL_PROCESS_DETACH: //biblioteka jest usuwana break; case DLL_THREAD_ATTACH: //wątek jest tworzony break; case DLL_THREAD_DETACH: //wątek jest niszczony break; } /* Funkcja zwraca TRUE jeśli wszystko pójdzie dobrze*/ return TRUE; }
Taki DLL jest jednak mało użyteczny ,bo nie posiada żadnych zmiennych,funkcji,itp. na eksport.
Poniżej przedstawiam jak eksportuje się te elementy.Dla lepszej czytelności zdefiniowałem stałą:
#define EXPORT __declspec(dllexport)
Zmienne i stałe:
EXPORT int Zmienna; EXPORT extern const STALA = 8;
Przy czym trzeba zaznaczyć ,że można eksportować tylko zmienne i stałe globalne
Funkcje:
extern "C" int EXPORT test(int argument) { //instrukcje }
Wskaźnik:
EXPORT int* WskInt;//wskażnik do zmiennej EXPORT MojaKlasa* WskKlasa = new MojaKlasa;//wskażnik do klasy
Co do klasy to jej definicja powinna się znajdować zarówno w DLL jak i w programie wykożystującym.Najlepiej do tego celu stworzyć osobny plik nagłówkowy z definicjami wspólnych klas.
Więcej o klasach w DLL dowiesz się z następnego postu:

Warto wspomnieć ,iż taką bibliotekę można skompilować jako bibliotekę LIB.Od DLL różni się jedynie tym ,że jest ładowana do pamięci razem z programem ,który jej używa ,a DLL może być ładowana i zwalniana w dowolnym momencie.
Takie funkcje(zmienne,itp.) importuje się w sposób niemal identyczny jak eksportuje.Należy tylko zamienić dllexport na dllimport:
__declspec(dllimport) int zmienna_w_LIB;
Inaczej wygląda import dynamiczny.Oto przykładowy kod programu:
//deklaracja prototypu funkcji w DLL'ce int *(WINAPI MojaFunkcja) (int argument) int main(){ HMODULE biblDLL; biblDLL = LoadLibray("Biblioteka.dll");//można też GetModuleHandle("biblioteka.dll") if(!funkcja) { printf("Nie udało się stworzyć uchwytu do biblioteki"); return 0; } (MojaFunkcja &) funkcja = GetProcAdress(biblDLL,"test"); if(!funkcja) { printf("Wystąpił problem z wybieraniem funkcji"); return 0; } //wywołanie funkcji int zwrot; zwrot = funkcja(jakis_argument); printf("Funkcja w DLL zwróciła wartość: %d",zwrot); FreeLibray(biblDLL);//zwolnienie biblioteki }
Użytkownik felix.leg edytował ten post 30 sierpień 2005, 15:02
Nie no przepraszam za burzenie porządku FAQ, ale pozwolę się spytać, czy w ogóle próbowałeś kompilować powyższy kod?
Gdybyś to zrobił, to dowiedziałbyś się, że słowo EXPORT jest niezdefiniowane.
Definicja EXPORT:
#define EXPORT __declspec(dllexport)
Przykładowa eksportowana funkcja powinna wyglądać tak:
extern "C" typ_zwracany EXPORT nazwa_funkcji(parametry_funkcji);
Co tu jest ważne: extern "C" i __declspec(dllexport). To pierwsze jest wymagane do używania LoadLibrary - wymusza linkowanie w stylu C, dzięki czemu funkcja Funkcja w DLLu będzie się nazywała Funkcja, a nie typ#@@Funkcja@2b!de223 <--- ponieważ w C++ można przeciążać funkcje względem typów oraz jej stałości i tworzyć funkcje członkowskie, nazwy funkcji zawierają dodatkowe informacje. To też powoduje, że w praktyce nie da się ładować funkcji w C++ bezpośrednio przy użyciu GetProcAddress
A __declspec(dllexport) powoduje, iż funkcja jest w ogóle widziana na zewnątrz DLLa - umieszcza jej nazwę do tabeli eksportu.
extern "C" i __declspec(dllexport) da się chyba upakować do jednego define, ale nie chce mi się sprawdzać w jakiej to powinno być kolejności i kiedy stawiane :)
Idąc dalej tym tematem - kompatybilność metody LoadLibrary()/GetProcAddress()/FreeLibrary() z C++. Funkcje eksportowane w ten sposób muszą być funkcjami w stylu C. Oznacza to:
* Funkcja nie może być inline (dość logiczne, nie?) ani być członkiem klasy.
* Funkcja musi być linkowalna w stylu C - musi być poprzedzona deklaracją extern "C".
* Obiekty zwracane przez funkcje muszą mieć albo wszystkie funkcje inline albo znane po obu stronach powiązania - i u klienta, i w DLL - bo inaczej nie będzie się dało utworzyć obiektu ze względu na niezdefiniowane funkcje - a to jest lekko niepraktyczne rozwiązanie.
Powstaje zatem pytanie, jak importować duże moduły z funkcjami w C++?
Odpowiedzią jest użycie wzorca projektowego Interfejs.
Tworzymy sobie interfejs - czysto abstrakcyjną klasę z samymi publicznymi funkcjami wirtualnymi. Na przykład:
class IModule
{
public:
virtual void SomeIntrestingThing() =0;
};
Taka klasa czysto abstrakcyjna nie może być użyta jako obiekt, a jedynie jako wskaźnik. Umieszczamy jej deklarację w pliku nagłówkowym, który będzie współdzielony przez DLLa i program główny.
W tym samym pliku musimy jeszcze dać funkcję, która pobierze nasz interfejs:
extern "C" IModule* __declspec(dllexport) PobierzModul();
Funkcja ta zwróci nam wskaźnik na obiekt. Znowu, w pliku nagłówkowym znajduje się tylko deklaracja.
Następnie piszemy kod DLLa. W pliku DLLa implementujemy nasz moduł:
class CModule : public IModule
{
public:
virtual void SomeIntrestingThing()
{
std::cout << "CModule::SomeIntrestingThing()" << std::endl;
}
};
Zauważmy dziedziczenie - dzięki temu klasa CModule implementuje interfejs IModule - wykorzystując polimorfizm możemy teraz 'schować' klasę CModule pod wskaźnikiem IModule*, co zresztą zrobimy.
extern "C" IModule* __declspec(dllexport) PobierzModul()
{
static CModule module;
return &module;
}
Równie dobrze zamiast używać parametru static mogilbyśmy użyć zmiennej globalnej - niezależnie od tego chodzi po prostu o to, żeby wraz z zakończeniem funkcji nie zniknął nam przypadkiem obiekt.
W głównym programie możemy teraz zaimportować tą funkcję:
typedef void(*ptrFun)();
ptrFun funkcja = reinterpret_cast<ptrFun>(GetProcAddress("PobierzModul"));
IModule* modul = funkcja();
if(modul)
{
modul->SomeIntrestingThing();
}
Pobraliśmy wskaźnik na obiekt, i jeśli jest on poprawny to używamy go do wywołania należącej do tego obiektu funkcji. W ten sposób pisze się pluginy do programów. Metoda jest na tyle uniwersalna, że pod innym systemem operacyjnym zmieniają się tylko funkcje WinAPI i zazwyczaj znika __declspec.
Pozostaje jeszcze wytłumaczyć się z nazwy interfejs. Otóż, jak można zauważyć, program główny nie ma pojęcia o tym jaki obiekt kryje się pod wskaźnikiem na IModule - i nie powinno go to obchodzić. Wystarczy, że na tym obiekcie można wywołać funkcje zadeklarowane w IModule - program główny zna *interfejs* obiektu pod tym wskaźnikiem. Klasa CModule w DLLu implementuje interfejs IModule. Zaleta tego rozwiązania polega na tym, że możemy zrobić sobie drugą DLLkę, w niej inną klasę [np. CModule2] implementującą interfejs IModule, i dostarczyć taką samą funkcję pobierającą, a kod programu głównego tego nawet nie zauważy. Można zmieniać DLLe bez wiedzy programu.
Dobra, koniec tego przydługawego posta:)
Pozdrawiam wszystkich, CHAK DE PLANET [Hack The Planet]
TeMPOraL.
Użytkownik TeMPOraL edytował ten post 18 sierpień 2005, 15:21
Jak tworzyć i używać klas abstrakcyjnych ?
Po pierwsze - klasa abstrakcyjna to taka, która ma metody czysto wirtualne, czyli nie posiada definicji żadnej metody, co nie znaczy, że wszystkie metody muszą być czysto wirtualne, wystarczy jedna.
Metody definiujemy w klasie pochodnej.
Przykład:
#include <iostream.h> #include <conio.h> class ABSTRAKCYJNA { public: int a; virtual void aa() = 0; // metoda czysto wirtualna virtual void aaa() = 0; // druga metoda czysto wirtualna }; class POCHODNA: public ABSTRAKCYJNA { public: void aa(){ a=1; cout << "Funkcja " << a << " czysto wirtualna\n"; } // definiujemy metody void aaa(){ a=2; cout << "Funkcja " << a << " czysto wirtualna\n"; } // czysto wirtualne }; int main() { ABSTRAKCYJNA *wsk; // wskaznik do klasy abstrakcyjnej POCHODNA ob; // obiekt kl. pochodnej wsk = &ob; // wskaznik na obiekt kl. pochodnej - teraz mozemy wywolac funkcje wsk->aa(); // uzywamy funkcji wsk->aaa(); getch(); return 0; } // koniec :P
Oczywiście metody czysto wirtualne mogą robić coś innego niż przedstawiłem w przykładzie - np. wykonywać działania na liczbach.
Użytkownik ToNieJa edytował ten post 26 sierpień 2005, 20:22
Co to jest WinAPI
To interfejs programowania aplikacji Windows, można przy jego pomocy wyczyniać z systemem praktycznie wszystko na co system pozwala. Jest to biblioteka która nie jest specjalnie łatwa. Podstawa programowania Windows.
Przydatne w tej sprawie linki...
MSDN
Winapi.org
Dlaczego? A takich pytań namnożyło się jak wszy! Jak jest w FAQ - moderatorzy, usuwać topic, odesłać do FAQ i dać warna bo szlag może trafić
Użytkownik chomik edytował ten post 29 sierpień 2005, 10:06
Jak zrobić własną konsolke windows? [WinApi]
Dzisiaj postanowiłem dać coś hardcore :]. Konsola windows powinna wam się kojarzyć z tym okienkiem z czarnym tłem, która pojawia się po wpisaniu "cmd" lub "command" do polecenia "Uruchom". Jak się okazuje windows pozwala na tworzenie takich konsol dla własnego użytku. Sam zapragnąłem mieć taką, gdy zobaczyłem przy gierce Regedit'a (wtajemniczeni wiedzą o kogo chodzi :] ) przydatność tego narzędzia. Więc do dzieła!
Po wstępnym przejrzeniu biblioteki MSDN, możemy znaleźć ten arcytrudny sposób, jak powołać taką konsolkę do życia. A brzmi on tak:
AllocConsole();
I puf - pojawia się konsola! Jak na arkana WinApi, funkcja zaskakująco prosta :).
Jeżeli chcieliśmy się pochwalić, że umiemy coś takiego, to można już zakończyć konteplacje tego tekstu. No tak, ale ja zapragnąłem coś napisać na tej konsoli. I tu już rozległość WinApi daje o sobie znać :P.
Zacznijmy od tego, że żeby coś napisać, to trzeba mieć kartke... tzn, bufor do trzymania tego co napisaliśmy :]. Kolejna wizyta w źródle wiedzy ( MSDN Lib ) doprowadza mnie do funkcji GetStdHandle(); Jednak po eksperymentach okazuje się, że nie jest za dobra. Zwraca ona uchwyt do standardowego bufora, jednak się po jakimś czasię psuje i już nic nie można nic wpisać :P. Dlatego lepszym wyjściem jest stworzenie bufora własnoręcznie. A robi to się tak: Najpierw robimy uchwyt dla bufora, a później potrzebną strukturkę.
HANDLE OutHnd = NULL; SECURITY_ATTRIBUTES as;
Ta strukturka opisuje względy bezpieczeństwa dla bufora. My chcemy standardowe ustawienia, więc ustawiamy go tak:
ZeroMemory( &as, sizeof( SECURITY_ATTRIBUTES ) ); as.nLength = sizeof( SECURITY_ATTRIBUTES ); as.bInheritHandle = true;
Ok, mamy już wszystko, więc zaczynamy tworzyć bufor, z uprawnieniami, by można było go zapisywać i czytać, oraz inne procesy miały do niego dostęp.
OutHnd = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, // prawa dostępu FILE_SHARE_READ | FILE_SHARE_WRITE, // prawa dla innych procesow &as, // wskaźnik na strukture SECURITY_ATTRIBUTES CONSOLE_TEXTMODE_BUFFER, // typ konsoli, tylko taki dostępny NULL ); // zarezerwowane, nie używać
Uff, po tej operacji mamy już bufor. Można go jeszcze uczynić aktywnym buforem poprzez SetConsoleActiveScreenBuffer() dla pewności, ale to już wasze upodobanie.
Teraz nadszedł czas coś tam napisać. Robi się to tak:
char str[] = "Jakis tekst do zapisania...\n"; DWORD ile = 0; WriteConsole( OutHnd, // Uchwyt bufora str, // wskaznik na tablice z tekstem strlen( str ), // ilość znaków w tablicy &ile, // wskaźnik na zmienną, gdzie będzie zapisana ilość znaków poprawnie zapisana do bufora NULL ); // Zarezerwowane, nie używać
Yeah! Napis się wyświetlił!
No dobra, koniec zabawy, teraz trzeba wszystko pozwalniać. Musimy zniszczyć bufor, oraz zwolnić konsole. Robimy to tak:
CloseHandle( OutHnd ); FreeConsole();
No i tyle :]. Zrobiliśmy wielki wyczyn. Jeżeli jeszcze wam mało, to polecam odwiedzić biblioteke MSDN i zobaczyć kilkadziesiąt innych funkcji, którymi można wyprawiać zakręcone rzeczy, jak zmieniać kolor, napis na belce oraz wiele innych.
PS: Jak coś się kabaci, to prosze o kontakt na GG, lub e-mail na mojej stronie. Ekspertem nie jestem, ale może ja coś zwaliłem :).
Jak sprawdzić, ile czasu jest uruchomiony system Windows?
Należy użyć funkcji Win32 API GetTickCount() typu DWORD, zwracającej czas, który upłynął od włączenia systemu operacyjnego w milisekundach.
Jak zamienić pojedyńcze znaki na inne w łańcuchu std::string
Sam czasami używam tej funkcji ( np. w OpenGL po pobraniu ext'ów chce zamienić wszystkie spacje na nowe linie ), dlatego postanowiłem ją przedstawić:
#include <string> std::string StrReplaceChar( std::string str, char what, char to, bool all ) { size_t pos = 0; while( (pos = str.find( what, pos ) ) != std::string::npos ) { Â str[pos] = to; Â if( !all ) Â break; } return str; }
Zauważcie tu dwie rzeczy - pierwsza to to, że ingeruje w argument, zmieniając mu znaki. Jest to możliwe dla tego, ponieważ, jeżeli nie zaznaczymy, że mają być przekazane prawdziwe obiekty (poprzez wskaźnik, lub referencje), to zostaje stworzona ich dokładna kopia. Ja wykorzystałem ten fakt, by nie marnować pamięci, czasu na tworzenie nowego obiektu i kopiowanie do niego łańcucha, to operowałem na tej właśnie kopii, którą potem zwracam. Ale chola, chola! Przecież argumenty są kasowane pod koniec działania funkcji? Ano - nie zaznaczyłem, że obiekt zwracany musi być obiektem prawdziwym, dlatego znów tworzona jest kopia - znów wykorzystuje ten fakt kopiując wynik do nowego obiektu. Później dopiero feralny argument zostaje skasowany, a my ortrzymujemy to co chemy :]
Druga rzecz - w warunku if wykorzystuje dziwnie wyglądający ciąg std::string::npos. Jest to droga do zmiennej statycznej klasy string (wychaczam z przestrzeni nazw std, a później z klasy :] ). Co ta zmienna trzyma? Jest to wynik jaki zwraza metoda find() klasy string, gdy nie znajdzie rządanego znaku. Nie zapszątaj sobie głowy co to za wartość (tyle powiem, że nie jest ujemna, ani zerowa :] ), ważne, że działa :).
To tyle. Jak zwykle, jak coś się kaszani, itp, to mnie męczyć :]
Użytkownik Real_Noname edytował ten post 12 wrzesień 2005, 20:40
Jak pobrać listę plików NIE używając WinApi?
Jak widać - coś nowego. Jak wiadomo (prawda? :]) w WinApi jest zbiór funkcji Find*(), jednak nas ograniczają do jednego systemu. Ale jak się okazuje, są standardowe funkcje (prawda, że z C, ale zawsze coś :]), które dają nam podobną funkcjonalność. Są to funkcje _find*(); dostępne z nagłówka io.h. Oto przykładowy program:
#include <iostream> #include <io.h> int main() { std::string SourceDir; std::cout << "Enter Dir: "; std::cin >> SourceDir; std::cout << std::endl; _finddata32_t fd; memset( &fd, 0, sizeof( _finddata32_t ) ); intptr_t p = 0; if( (p = _findfirst32( ( SourceDir + "*.*" ).c_str(), &fd )) != -1 ) { do { std::cout << "File: " << this->SourceDir << fd.name; if( fd.attrib & _A_NORMAL ) std::cout << ", Normal"; if( fd.attrib & _A_RDONLY ) std::cout << ", Read Only"; if( fd.attrib & _A_HIDDEN ) std::cout << ", Hidden"; if( fd.attrib & _A_SYSTEM ) std::cout << ", System"; if( fd.attrib & _A_SUBDIR ) std::cout << ", Folder"; if( fd.attrib & _A_ARCH ) std::cout << ", Archive"; if( fd.size > 0 ) std::cout << ", Size: " << fd.size; std::cout << std::endl; } while( _findnext32( p,&fd ) != -1 ); _findclose( p ); } system("PAUSE"); return 0; }
W programie użyłem wersji funkcji 32 bitowych, ale istnieją i wersje 64 bit. Zapraszam do MSDN lib po więcej informacji.
Ważne: funkcje _findfirst i _findnext zwracają przy błędzie -1! 0 jest zwracane jako oznaka sukcesu!
Dzięki st3tc'owi za naprowadzenie na te funkcje :)
Jak pobrać długość pliku?
DataLen - wielkość pliku, unsigned int
Czysty C:
#include <io.h> #include <Fcntl.h> int fp; fp = _open( "ble.dat", _O_BINARY | _O_RDONLY ); DataLen = _filelength( fp ); _close( fp );
STL:
#include <fstream> std::fstream fp; fp.open( "ble.dat" ); fp.seekg( 0, std::ios::end ); DataLen = fp.tellg(); fp.close();
Jak odczytać dane z Rejestru?
Aby odczytać dane z rejestru w BCB, na początku trzeba zdeklarować klasę:
#include <Registry.hpp>
Więc skupmy się na odczytaniu danych pojedynczego klucza. Np. odczytamy ścieżkę folderu w którym przechowywane są czcionki systemu:
Tworzymy nowy komponent klasy TRegistry:
TRegistry *Rejestr = new TRegistry;
Teraz musimy okreslić dzial rejestru (tak to nazwałem ;) ):
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG
W moim przykładzie bedzie nas interesować HKEY_CURRENT_USER
Więc aby zaznaczyć z którego działu będziemy korzystać, wpisujemy:
Rejestr->RootKey = HKEY_CURRENT_USER; //bez cudzysłowia!!!
Jak juz wyznaczyliśmy dział musimy podac dokładną ścieżkę do naszych danych w rejestrze które chcemy odczytać.
Pamiętajmy aby wpisując ścieżkę pomijać dział oraz stawiać podwójne ukośniki:
Rejestr->OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\ \Explorer\\Shell Folders", true);
jak widzicie pojawia nam się tutaj parametr true - jeżeli wartość wynosi true, to jeżeli podana ścieżka nie istnieje to zostanie utworzone, lecz jeżeli wartość będzie wynosić false to ściezka nie zostanie utworzona w przypadku nie istnienia.
Po zdeklarowaniu ścieżki do naszego celu, możemy wybrac wiele możliwości odczytu danych. Międzi innymi odczytać całą listę kluczy z podanego wcześniej katalogu lub odczytać dane tylko z jednego klucza (String, Bool, Int), lecz my zajmiemy się w tej części odczytaniem tylko jednego klucza i zapiszemy go do zmiennej AnsiString.
Więc juz teraz pozostaje nam tylko odczytanie klucza:
AnsiString Sicezka_Fonts = Rejestr->ReadString("Fonts"); Rejestr->CloseKey(); delete Rejestr;
A więc w pierwszej linijce odczytaliśmy z klucza o nazwie "Fonts" ściezkę do folderu z czcionkami systemu windows, a następnie zapisaliśmy ją w zmiennej Sciezka_Fonts.
W drugiej linijce zamknęliśmy klucz (aby móc otworzyć następne)
A w trzeciej usunęliśmy z pamięci [b]Rejestr
mam nadzieję że ta porada wam się przyda i że zrozumieliście co tu napisałem. niebawem rozszerze ten temat i dodam jeszcze odczytywanie z rejestru
Użytkownik Ziombka edytował ten post 09 wrzesień 2005, 21:28
Jak programowo kliknąć myszą?
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Użytkownik kiperoman edytował ten post 11 wrzesień 2005, 13:25
Jak zamknąć, zrestartować system oraz wylogować użytkownika? (dla Win 9X)
Zamknięcie:
ExitWindowsEx(EWX_SHUTDOWN, 0);
lub
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
Restart:
ExitWindowsEx(EWX_REBOOT, 0);
Wylogowanie:
ExitWindowsEx(EWX_LOGOFF, 0);
Użytkownik kiperoman edytował ten post 21 listopad 2005, 19:56
Jak ukryć ikony z paska zadań?
ShowWindow(FindWindowEx(FindWindow("Shell_TrayWnd", NULL), HWND(0), "ReBarWindow32", NULL), SW_HIDE);
aby pokazać wystarczy zmienić SW_HIDE na SW_SHOW.
Użytkownik kiperoman edytował ten post 21 listopad 2005, 19:56
Jak zablokować wygaszacz?
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
Odblokowanie wygaszacza:
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
Użytkownik kiperoman edytował ten post 19 wrzesień 2005, 19:53
Jak zmienić godzinę systemową?
#include <dos.h> (...) struct time t; Â t.ti_hund = 0; Â t.ti_sec = 0; Â t.ti_min = 12; Â t.ti_hour = 15; Â settime(&t);
Użytkownik kiperoman edytował ten post 19 wrzesień 2005, 19:53
Jak rysowac po pulpicie?
TCanvas &PulpitCanvas = *new TCanvas();  PulpitCanvas.Handle = GetDC(0);  PulpitCanvas.Ellipse(50, 50, 200, 200);//tutaj piszemy co ma być rysowane  ReleaseDC(0, PulpitCanvas.Handle);  delete &PulpitCanvas;
Użytkownik kiperoman edytował ten post 19 wrzesień 2005, 19:54
Jak zablokować możliwość wyłączenia aplikacji?
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose) { CanClose = false; }
Użytkownik kiperoman edytował ten post 19 wrzesień 2005, 19:54
Jak rozpisać kwotę na odpowiednią ilość banknotów? Przy założeniu, że program nie jest idioto odporny, to mogło by to wyglądać tak:
#include<iostream.h> int RozmienKwote (int kwota, int &ile_200zl, int &ile_100zl, int &ile_50zl, int &ile_20zl, int &ile_10zl, int &ile_5zl, int &ile_2zl, int &ile_1zl); int main() { int kwota; cout<<"podaj kwote do rozpisania : "; cin>>kwota; int a, b, c, d, e, f, g, h, rob; rob=RozmienKwote (kwota, a, b, c,d,e,f,g,h); cout<<kwota<<"zl\n\n"<<a<<" x 200zl\n"<<b<<" x 100zl\n"<<c<<" x 50zl\n"<<d<<" x 20zl\n"<<e<<" x 10zl\n"<<f<<" x 5zl\n"<<g<<" x 2zl\n"<<h<<" x 1zl"<<endl<<endl; system ("pause"); return 0; } int RozmienKwote (int kwota,int &ile_200zl, int &ile_100zl, int &ile_50zl, int &ile_20zl, int &ile_10zl, int &ile_5zl, int &ile_2zl, int &ile_1zl) { ile_200zl = kwota / 200; kwota=kwota%200; ile_100zl = kwota / 100; kwota=kwota%100; ile_50zl = kwota / 50; kwota=kwota%50; ile_20zl = kwota / 20; kwota=kwota%20; ile_10zl = kwota / 10; kwota=kwota%10; ile_5zl = kwota / 5; kwota=kwota%5; ile_2zl = kwota / 2; kwota=kwota%2; ile_1zl = kwota; return ile_200zl+ile_100zl+ile_50zl+ile_20zl+ile_10zl+ile_5zl+ile_2zl+ile_1zl; }
Program rozmienia bez uwzględnienia przecinka, a jak kogoś pokusi o dorobienie reszty to bardzo prosze ;) najwyżej sam dodam jak znajde troche czasu.
Działania są w miare proste, oznaczenia chyba też. :unsure:
Jak wyliczyć sumę Sn=d(1)+d(2)+...+d(n) dla różnych wartości n, gdzie d(i) oznacza liczbę dzielników liczby i ?
#include <iostream> using namespace std; int main() { long long int a, ile, wynik; cout<<"a="; cin>>a; //if(a < 1 || a > 1000000000000) return 0; //zakres prosze ustalić sobie samemu ile=0; for(int i=1;i<=a;i++) { wynik=0; for(int k=1;k<=i;k++) { if(i%k==0) { wynik++; } } ile+=wynik; } cout<<ile; system("pause"); return 0; }
Interpolacja wielomianowa - przybliżanie (aproksymacja funkcji). Obliczanie pochodnych rzędu k. Z czym to się je ?
Algorytm Hornera wygląda tak (...) a jego przykładowa implementacja z wykorzystaniem struktury lub klasy np. tak jak po niżej
float Horner(TWielomian wielomian, float x) { float b; b=wielomian.a[0]; for(int k=1;k<=wielomian.n;k++) b=b*x+wielomian.a[k]; return b; }
A dla początkującego z przeszło 200-tu postowym stażem, gdzie by wydawać się mogło że wie w jakiej części formu zadaje się pytania, specjalna wersja bardzo uproszczona:
b=a(0);
b=b*x+ak; (gdzie k=1,2,...,n)
Jak zapisać znaki ASCII liczbowo, bitowo, hexdecymalnie i ósemkowo?
Oto lista:
Char  Num  Bits  Hex  Eight  0 00000000 0x00 00 1 00000001 0x01 01 2 00000010 0x02 02 3 00000011 0x03 03 4 00000100 0x04 04 5 00000101 0x05 05 6 00000110 0x06 06 7 00000111 0x07 07 8 00001000 0x08 10 \t 9 00001001 0x09 11 \n 10 00001010 0x0A 12 11 00001011 0x0B 13  12 00001100 0x0C 14 \r 13 00001101 0x0D 15 14 00001110 0x0E 16 15 00001111 0x0F 17 16 00010000 0x10 20 17 00010001 0x11 21 18 00010010 0x12 22 19 00010011 0x13 23 20 00010100 0x14 24 21 00010101 0x15 25 22 00010110 0x16 26 23 00010111 0x17 27 24 00011000 0x18 30 25 00011001 0x19 31 26 00011010 0x1A 32 27 00011011 0x1B 33 28 00011100 0x1C 34 29 00011101 0x1D 35 30 00011110 0x1E 36 31 00011111 0x1F 37 ' ' 32 00100000 0x20 40 ! 33 00100001 0x21 41 " 34 00100010 0x22 42 # 35 00100011 0x23 43 $ 36 00100100 0x24 44 % 37 00100101 0x25 45 & 38 00100110 0x26 46 ' 39 00100111 0x27 47 ( 40 00101000 0x28 50 ) 41 00101001 0x29 51 * 42 00101010 0x2A 52 + 43 00101011 0x2B 53 , 44 00101100 0x2C 54 - 45 00101101 0x2D 55 . 46 00101110 0x2E 56 / 47 00101111 0x2F 57 0 48 00110000 0x30 60 1 49 00110001 0x31 61 2 50 00110010 0x32 62 3 51 00110011 0x33 63 4 52 00110100 0x34 64 5 53 00110101 0x35 65 6 54 00110110 0x36 66 7 55 00110111 0x37 67 8 56 00111000 0x38 70 9 57 00111001 0x39 71 : 58 00111010 0x3A 72 ; 59 00111011 0x3B 73 < 60 00111100 0x3C 74 = 61 00111101 0x3D 75 > 62 00111110 0x3E 76 ? 63 00111111 0x3F 77 @ 64 01000000 0x40 80 A 65 01000001 0x41 81 B 66 01000010 0x42 82 C 67 01000011 0x43 83 D 68 01000100 0x44 84 E 69 01000101 0x45 85 F 70 01000110 0x46 86 G 71 01000111 0x47 87 H 72 01001000 0x48 90 I 73 01001001 0x49 91 J 74 01001010 0x4A 92 K 75 01001011 0x4B 93 L 76 01001100 0x4C 94 M 77 01001101 0x4D 95 N 78 01001110 0x4E 96 O 79 01001111 0x4F 97 P 80 01010000 0x50 100 Q 81 01010001 0x51 101 R 82 01010010 0x52 102 S 83 01010011 0x53 103 T 84 01010100 0x54 104 U 85 01010101 0x55 105 V 86 01010110 0x56 106 W 87 01010111 0x57 107 X 88 01011000 0x58 110 Y 89 01011001 0x59 111 Z 90 01011010 0x5A 112 [ 91 01011011 0x5B 113 \ 92 01011100 0x5C 114 ] 93 01011101 0x5D 115 ^ 94 01011110 0x5E 116 _ 95 01011111 0x5F 117 ` 96 01100000 0x60 120 a 97 01100001 0x61 121 b 98 01100010 0x62 122 c 99 01100011 0x63 123 d 100 01100100 0x64 124 e 101 01100101 0x65 125 f 102 01100110 0x66 126 g 103 01100111 0x67 127 h 104 01101000 0x68 130 i 105 01101001 0x69 131 j 106 01101010 0x6A 132 k 107 01101011 0x6B 133 l 108 01101100 0x6C 134 m 109 01101101 0x6D 135 n 110 01101110 0x6E 136 o 111 01101111 0x6F 137 p 112 01110000 0x70 140 q 113 01110001 0x71 141 r 114 01110010 0x72 142 s 115 01110011 0x73 143 t 116 01110100 0x74 144 u 117 01110101 0x75 145 v 118 01110110 0x76 146 w 119 01110111 0x77 147 x 120 01111000 0x78 150 y 121 01111001 0x79 151 z 122 01111010 0x7A 152 { 123 01111011 0x7B 153 | 124 01111100 0x7C 154 } 125 01111101 0x7D 155 ~ 126 01111110 0x7E 156 127 01111111 0x7F 157 € 128 10000000 0x80 160  129 10000001 0x81 161 ‚ 130 10000010 0x82 162  131 10000011 0x83 163 „ 132 10000100 0x84 164 … 133 10000101 0x85 165 † 134 10000110 0x86 166 ‡ 135 10000111 0x87 167  136 10001000 0x88 170 ‰ 137 10001001 0x89 171 Ĺ 138 10001010 0x8A 172 ‹ 139 10001011 0x8B 173 Ś 140 10001100 0x8C 174 Ť 141 10001101 0x8D 175 Ĺ˝ 142 10001110 0x8E 176 Ź 143 10001111 0x8F 177  144 10010000 0x90 180 ‘ 145 10010001 0x91 181 ’ 146 10010010 0x92 182 “ 147 10010011 0x93 183 ” 148 10010100 0x94 184 • 149 10010101 0x95 185 – 150 10010110 0x96 186 — 151 10010111 0x97 187  152 10011000 0x98 190 ™ 153 10011001 0x99 191 ĹĄ 154 10011010 0x9A 192 › 155 10011011 0x9B 193 ś 156 10011100 0x9C 194 ĹĄ 157 10011101 0x9D 195 Ĺź 158 10011110 0x9E 196 ź 159 10011111 0x9F 197  160 10100000 0xA0 200 Ë 161 10100001 0xA1 201 Ë 162 10100010 0xA2 202 Ł 163 10100011 0xA3 203 ¤ 164 10100100 0xA4 204 Ą 165 10100101 0xA5 205 ¦ 166 10100110 0xA6 206 § 167 10100111 0xA7 207 ¨ 168 10101000 0xA8 210 © 169 10101001 0xA9 211 Ĺź 170 10101010 0xAA 212 « 171 10101011 0xAB 213 ¬ 172 10101100 0xAC 214  173 10101101 0xAD 215 ® 174 10101110 0xAE 216 Ż 175 10101111 0xAF 217 ° 176 10110000 0xB0 220 ± 177 10110001 0xB1 221 Ë 178 10110010 0xB2 222 ł 179 10110011 0xB3 223 ´ 180 10110100 0xB4 224 µ 181 10110101 0xB5 225 ¶ 182 10110110 0xB6 226 · 183 10110111 0xB7 227 ¸ 184 10111000 0xB8 230 ą 185 10111001 0xB9 231 Ĺź 186 10111010 0xBA 232 » 187 10111011 0xBB 233 Ä˝ 188 10111100 0xBC 234 Ë 189 10111101 0xBD 235 Äź 190 10111110 0xBE 236 ż 191 10111111 0xBF 237 Ĺ 192 11000000 0xC0 240 Ă 193 11000001 0xC1 241 Ă 194 11000010 0xC2 242 Ä 195 11000011 0xC3 243 Ă 196 11000100 0xC4 244 Äą 197 11000101 0xC5 245 Ć 198 11000110 0xC6 246 Ă 199 11000111 0xC7 247 ÄŚ 200 11001000 0xC8 250 Ă 201 11001001 0xC9 251 Ę 202 11001010 0xCA 252 Ă 203 11001011 0xCB 253 Ä 204 11001100 0xCC 254 Ă 205 11001101 0xCD 255 Ă 206 11001110 0xCE 256 Ä 207 11001111 0xCF 257 Ä 208 11010000 0xD0 260 Ń 209 11010001 0xD1 261 Ĺ 210 11010010 0xD2 262 Ó 211 11010011 0xD3 263 Ă 212 11010100 0xD4 264 Ĺ 213 11010101 0xD5 265 Ă 214 11010110 0xD6 266 Ă 215 11010111 0xD7 267 Ĺ 216 11011000 0xD8 270 ĹŽ 217 11011001 0xD9 271 Ă 218 11011010 0xDA 272 Ĺ° 219 11011011 0xDB 273 Ăś 220 11011100 0xDC 274 Ă 221 11011101 0xDD 275 Ţ 222 11011110 0xDE 276 Ăź 223 11011111 0xDF 277 Ĺ 224 11100000 0xE0 280 ĂĄ 225 11100001 0xE1 281 â 226 11100010 0xE2 282 Ä 227 11100011 0xE3 283 ä 228 11100100 0xE4 284 Äş 229 11100101 0xE5 285 ć 230 11100110 0xE6 286 ç 231 11100111 0xE7 287 Ä 232 11101000 0xE8 290 ĂŠ 233 11101001 0xE9 291 ę 234 11101010 0xEA 292 ĂŤ 235 11101011 0xEB 293 Ä 236 11101100 0xEC 294 Ă 237 11101101 0xED 295 ĂŽ 238 11101110 0xEE 296 ÄŹ 239 11101111 0xEF 297 Ä 240 11110000 0xF0 300 ń 241 11110001 0xF1 301 Ĺ 242 11110010 0xF2 302 ó 243 11110011 0xF3 303 Ă´ 244 11110100 0xF4 304 Ĺ 245 11110101 0xF5 305 Ăś 246 11110110 0xF6 306 á 247 11110111 0xF7 307 Ĺ 248 11111000 0xF8 310 ĹŻ 249 11111001 0xF9 311 Ăş 250 11111010 0xFA 312 Ĺą 251 11111011 0xFB 313 Ăź 252 11111100 0xFC 314 Ă˝ 253 11111101 0xFD 315 ĹŁ 254 11111110 0xFE 316 Ë 255 11111111 0xFF 317
Użytkownik Real_Noname edytował ten post 26 październik 2005, 18:01
Sortowanie tablicy metodą bąbelkową
#include<conio.h> #include<iomanip.h> main() { int n, i, pom; int t[10]; //tablica 10 elementowa; int zmiana; cout << "Podaj elementy tablicy" <<endl; for (i=0; i<10; i++) cin >> t[i]; zmiana = 1; while (zmiana) { zmiana = 0; for (i=0; i<10; i++) if (t[i]>t[i+1]) { pom = t[i]; //zamiana dwoch elementow miejscami t[i] = t[i+1]; t[i+1] = pom; zmiana = 1; } } cout << "Tablica po uporzadkowaniu " <<endl; for (i=0; i<10; i++) cout <<t[i] << " "; }
Jak odczytać swój adres IP?
WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 0 ); err = WSAStartup( wVersionRequested, &wsaData );// inicjalizacja WinSock if ( err != 0 ){ Application->MessageBox("Inicjalizacja biblioteki WinSock nie powiodła się !!! ","Project 1",MB_OK ); return; } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) { Application->MessageBox("Nie posiadasz biblioteki WinSock ","Project 1",MB_OK ); WSACleanup( ); return; } unsigned long max=MAX_COMPUTERNAME_LENGTH + 1; char bufor[MAX_COMPUTERNAME_LENGTH + 1]; if(gethostname(bufor,max)==0){ hostent *MojHost; MojHost=gethostbyname(bufor); if(MojHost!=NULL){ in_addr adresIP; memcpy(&adresIP, MojHost->h_addr, sizeof(in_addr)); Label1->Caption=inet_ntoa(adresIP); //przekształcenie adresu IP na napis } } WSACleanup( );
Na formie trzeba umieścić Labela.
Użytkownik kiperoman edytował ten post 12 listopad 2005, 14:09
Jak sprawić aby program nie był wyświeltany na pasku zadań?
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { long l; l=WS_EX_TOOLWINDOW; SetWindowLong(Application->Handle,GWL_EXSTYLE,l); }
Jak odczytać nazwę BIOSu?
char MainBoardBiosName[100]; strcpy(MainBoardBiosName, (char*)0xFE061); Label1->Caption = MainBoardBiosName;
Użytkownik kiperoman edytował ten post 12 listopad 2005, 14:17
Jak zablokować przycisk START?
EnableWindow(FindWindowEx(FindWindow("Shell_TrayWnd", NULL), 0, "Button", NULL), false);
Jak odblokować przycisk START?
EnableWindow(FindWindowEx(FindWindow("Shell_TrayWnd", NULL), 0, "Button", NULL), true);
Napisałem program na konsole, czy to oznacza, że będzie działał w DOS'ie?
Odp: Nie.
Wyjaśnienie:
Najpierw poprawka: to coś co znamy pod nazwą DOS, to był 16 bitowy (o ile dobrze pamiętam) system operacyjny pracujący w trybie tekstowym. Dzisiaj dzisiaj praktycznie się go nie używa, a jego ostatnią wersję można było spotkać w Windows 95, jako dodatek do tego systemu (słynna opcja "Uruchom komputer w trybie MS-DOS").
Obecnie, aplikacje napisane pod mianem "na konsole", są skompilowane na kompilatorach 32-bitowych, i jak wskazuje nazwa - są przeznaczone na tak zwaną konsole, czyli rozszerzenie systemu operacyjnego (w Windowsie, czy Linuksie), które zwykle służyło jako narzędzie do testowania systemu (w Linuksie pełni o wiele większą rolę :) ).
A jak ktoś jest bardzo uparty, to może sobie ściągnąć 16 bitowy kompilator i napisać aplikacje działającą pod DOS, ze wszystkimi jego ograniczeniami (i możliwościami).