Jump to content

Cipher

Members
  • Content Count

    0
  • Joined

  • Last visited

    Never

Community Reputation

0 Neutral

About Cipher

  • Rank
    Newbie
  1. Jeżeli dobrze zrozumiałem to funkcja sizeof() powinna być pomocna. Po prostu dzielisz rozmiar całej tablicy przez rozmiar pojedyńczego elementu. Przykład: int ileElementow; char tablica[]="Jakas tablica"; ileElementow=sizeof(tablica)/sizeof(tablica[0]);
  2. Na Delphi się nie znam więc wierze na słowo. Jeżeli chodzi o C++ to zawsze możesz skorzystać ze słowa kluczowego extern które poinformuje kompilator o istnieniu zmiennej zadeklarowanej w innym pliku. Przykład: //Plik zmienna.h. #ifndef ZMIENNA_H #define ZMIENNA_H extern int zmienna; #endif //Plik zmienna.cpp #include "zmienna.h" int zmienna=5; //Plik main.cpp #include <iostream> #include "zmienna.h" using namespace std; int main() { cout<<zmienna<<endl; system("pause"); return 0; } Myśle że nie ma co wyjaśniać, wszystko powinno być jasne.
  3. Z DevCpp nie kożystam jednak wydaje mi się że problem polega na tym iż w pliku nagłówkowyn masz umieszczone deklaracje zmiennych oraz definicje ciał funkcji. Gdy później dany plik nagłówkowy dołączasz w kilku innych plikach projektu to następuje zjawisko podwujnej definicji. Zasada jest prosta: NIE WOLNO definiować ciał funkcji w plikach nagłówkowych. NIE WOLNO umieszczać deklaracji zmiennych w plikach nagłówkowych. I nic tu nie pomogą dyrektywy #ifndef i #define. Podobny temat dotyczący jednak visual C++ był już niedawno na tym forum o tu https://www.winapi.org/forum/viewtopic.php?t=725 Jeżeli będziesz miał jeszcze jakieś pytania to wal śmiało.
  4. Cipher

    Przesyłanie zmiennych

    Miałem coś takiego przy jednym programie że na Win 98 działał dobrze a na Win 2000 profesional wywalał mi właśnie taką komende.
  5. Niestety na Delphi się nie znam i nie wiem za bardzo do czego służy Align. Jednak z Twego opisu wnioskuje iż chodzi Ci o to aby kontrolki zachowywały swoje proporcje (położenie) w stosunku do rozmiaru okna. Jeżeli tak to może spróbuj w ten sposób (przykład z przyciskiem): double xPrawy; double yPrawy; double xLewy; double yLewy; //.... //.... case WM_CREATE: hButton=CreateWindow("button","Przycisk",WS_CHILD|WS_VISIBLE,(int)xLewy,(int)yLewy,(int)xPrawy,(int)yPrawy,hWnd,(HMENU)100,GetModuleHandle(NULL),NULL); break; //.... //.... case WM_SIZE: xPrawy=(LOWORD(lParam))*0.225; yPrawy=(HIWORD(lParam))/20; xLewy=LOWORD(lParam)/40; yLewy=HIWORD(lParam)/40; MoveWindow(hButton,(int)xLewy,(int)yLewy,(int)xPrawy,(int)yPrawy,TRUE); break; Ok co się tam dzieje. W LOWORD(lParam) masz szerokość okna a w HIWORD(lParam) wysokość. Przy założeniu że okno główne ma rozmiary 400x400 przycisk będzie się znajdował w pozycji 10x10 bo xLewy=LOWORD(lParam)/40 (co daje 400/40=10) i yLewy=HIWORD(lParam)/40. Będzie miał rozmiar 90x100 bo xPrawy=(LOWORD(lParam))*0.225 (co daje 400*0.225=90) i yPrawy=(HIWORD(lParam))/20 (co daje 400/20=20). Po zmianie rozmiarów okna głównego wyniki tych działań ulegną zmianie a co za tym idzie zmieni się rozmiar i położenie przycisku jednak proporcje względem okna zostaną zachowane. Nie wiem jednak czy o to ci chodziło, jeżeli nie to napisz. Może pomyśli się coś innego.
  6. Cipher

    Początkujący, pytanie

    1)Tworzenie statica: CreateWindow("static","Napis w staticku",WS_CHILD|WS_VISIBLE,10,10,100,30,hWnd,NULL,hInstance,NULL); 2) Musisz chyba dołączyć do projektu biblioteke comctl32.lib. #pragma comment(lib,"comctl32.lib")
  7. Przejrzałem to tak pobieżnie i funkcja send serwera powinna chyba zamiast m_socket mieć AcceptSocket. Poza ty funkcje accept zamiast w pętli while dałbym w FD_ACCEPT. To tyle na razie. Dziś niedziela i święto (dwa w jednym (dzień przeciwłupierzowy :D )) i nie bardzo chce mi się analizować ten kod dokładnie, jeżeli te drobne uwagi nie pomogą to jutro po południu przejże ten kod dokładniej i może napisze coś więcej.
  8. Wydaje mi się że musiałeś gdzieś zrobić jakiś błąd. Szkoda że nie dałeś fragmentu kodu. Jak masz już socketa w trybie asynchronicznym czyli: WSAAsyncSelect(socket,uchwyt,WM_USER,FD_CONNECT|FD_READ|FD_WRITE); Parametry: 1- nasz socket 2- uchwyt okna programu 3- komunikat wewnątrz którego chcesz odbierać informacje od socketa (w tym wypadku WM_USER ale może być dowolny) 4- flagi mówiące o jakich zdarzeniach chcemy być informowani To dalej dajesz: case WM_USER: switch(WSAGETSELECTEVENT(lParam)) { //coś przyszło case FD_READ: //tu odbierasz to co przyszło break; //łączenie z serwerem case FD_CONNECT: //Tu próba łączenia z serwerem break; } break; I powinno działać. Oczywiście przykład ten dotyczy klienta. W serwerze zamiast FD_CONNECT (do łączenia) musisz obsłużyć FD_ACCEPT (do akceptowania połączenia). Jeżeli to nie działa to zapodaj kod źródłowy (fragmenty), to coś się pomyśli bo tak bez kodu to troche trudno coś doradzić.
  9. Może zapomniałeś dodać do projektu odpowiednie pliki .lib .
  10. Cipher

    zasoby internetowe

    A ja zapodam coś takiego www.koders.com Jest to wyszukiwarka kodów źródłowych. Myśle że może być pomocna.
  11. Szczerze mówiąc nie wiem dlaczego Ci się ten podział nie podoba ale jeżeli koniecznie chcesz mieć to w jednym pliku to może użyj dla funkcji specyfikatora inline. Po krótce mówiąc spowoduje on że kompilator będzie traktował takie funkcje jak by były zdefiniowane wewnątrz klasy a co za tym idzie nie powinno być z nimi problemu. Przykład: //klasa2.h class klasa2 { inline void funkcja(void); } void klasa2::funkcja(void) { } ps. Pragnę zaznaczyć że nie polecam stosowania tego sposobu. Ma on po prostu wiele wad i nie jest mile widziany przez programistów.
  12. Dobra praktyka programistycza mówi że nie powinno się definiować funkcji w plikach nagłówkowych. Dlaczego? To chyba już wiesz. Może zrób to w taki sposób: //klasa1.h class klasa1 { void funkcja(void) {} }; ---------------------------------------------------------- //klasa2.h class klasa2 { void funkcja(void); } ---------------------------------------------------------- //klasa2.cpp #include "klasa2.h" void klasa2::funkcja(void){} ---------------------------------------------------------- Jak widzisz funkcja z klasy klasa2 jest definiowana w pliku klasa2.cpp. Teraz możesz bez problemu dołączać plik klasa2.h tyle razy ile tylko chcesz i nie powinno być żadnych problemów. Pliki klasa2.h i klasa2.cpp stanowią w tym wypadku komplet. Jak widzisz twój plik klasa2.h został rozłożony na dwa mniejsze. Jeżeli ten opis jest mało zrozumiały to napisz postaram się opisać to szerzej.
  13. Być może źle zrozumiałem problem ale nie bardzo wiem dlaczego nie możesz zainkludować tam tych plików.
  14. Ja kiedyś zmieniałem rozdzielczość i ilość koloru w ten sposób : DEVMODE dm; //Struktura DEVMODE memset(&dm,0,sizeof(dm)); //Zerujemy strukture dm.dmSize=sizeof(dm); //Pobieramy jej rozmiar dm.dmBitsPerPel=16; //Ile bitowy kolor dm.dmPelsWidth=640; //Jaka szerokość ekranu (pixele) dm.dmPelsHeight=480; //Jaka wysokość ekranu (pixele) dm.dmFields=DM_BITSPERPEL|DM_PELSHEIGHT|DM_PELSWIDTH; //Kombinacja flag mówiących //które pola struktury wypełniliśmy ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY); //Funkcja zmienia nam ustawienia na te podane w strukturze DEVMODE.
×
×
  • Create New...