1. Всем пользователям необходимо проверить работоспособность своего электронного почтового адреса. Для этого на, указанный в вашем профиле электронный адрес, в период с 14 по 18 июня, отправлено письмо. Вам необходимо проверить свою почту, возможно папку "спам". Если там есть письмо от нас, то можете не беспокоиться, в противном случае необходимо либо изменить адрес электронной почты в настройках профиля , либо если у вас электронная почта от компании "Интерсвязь" (@is74.ru) вы им долго не пользовались и хотите им пользоваться, позвоните в СТП по телефону 247-9-555 для активации вашего адреса электронной почты.
    Скрыть объявление

Обсуждение Программирование на C/C++

Тема в разделе "Мастерская", создана пользователем ansis, 13 июн 2006.

  1. ansis

    ansis

    Репутация:
    695
    ansis, 13 июн 2006
    Эта тема предназначена для обсуждения и решение любых проблем, связанных с программированием на языке C/C++, обмена секретами, опытом и помощи в программирование другим пользователям.

    Также рекомендуется ознакомиться со справочной литературой:
    Страуструп Б. - Язык программирования С++. Special Edition.djvu 10.02 Мб
    Шилдт Г. - Самоучитель С++.pdf 2.48 Мб
    [C] Архангельский - программирование в C builder 6.djvu 17.30 Мб

    Ссылки на компиляторы:
    И не забывайте оформлять свой код тегом
    Код:
    [/B][/COLOR]
     
    #1
  2. Штурман

    Штурман Guest

    Репутация:
    0
    Штурман, 19 окт 2007
    В продолжении темы... активно работая с стандартным генератором случайных чисел rand(), покозало его особую грязность. Особенно при использованние выражия rand()%n. Ответ был найден в "Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerica Recipes in C".

    А потом об этом же прочитал у Страустрапа.
     
  3. SentineL

    SentineL Ословед

    Репутация:
    608
    SentineL, 20 окт 2007
    с техническим англиским у меня не очень хорошо... понятл только что стоит использовать первый вариан и никогда не использовать второй. но почему? сам заметил, что "rand() % 10" постоянно выдаёт одну и ту же последовательность чисел. к примеру, в моей задаче это всегда были 6,0,2,0,... второй вариант этим не грешен?
     
  4. v0rbis

    v0rbis Ословед

    Репутация:
    515
    v0rbis, 20 окт 2007
    а srand() отменили?)
     
  5. Штурман

    Штурман Guest

    Репутация:
    0
    Штурман, 20 окт 2007
    1) Младшие биты в случайном числе менее случайные, чем старшие :)... поэтому второй вариант более качественный.

    2)Для генерации разных последовательностей используют функцию void srand(unsigned int seed). seed-у можно присвоить время. Советую во время кодирования, тестирования и отсладки не пользоваться srand()-ом. А когда программа отлажена, раскомментировать или дописать srand().

    3) Все это работает приблизительно так
    Код:
    [COLOR=#009999]/* (в модуле stdlib.h) */[/COLOR]
    #define RAND_MAX 32767
    
    [COLOR=#009999]/* "пример" от комитета ANSI-C */[/COLOR]
    unsigned long next=1;
    
    int rand(void) {
     next=next*1103515245+12345;
     return((unsigned int)(next/65536)%32768);
    }
    
    void srand(unsigned int seed) {
     next=seed;
    }
    
     
  6. gureedo

    gureedo Самец :)

    Репутация:
    42.252
    gureedo, 20 окт 2007
    юзайте boost если rand() обыкновенный не нравиться.
     
  7. Штурман

    Штурман Guest

    Репутация:
    0
    Штурман, 20 окт 2007
    Что это?... библиотека функций или классов?
     
  8. Archy

    Archy

    Репутация:
    1.787
    Archy, 20 окт 2007
    а лучше пишите свою функцию рандома. привязывайтесь к милисекундам или микросекундам на момент дерганья этой функции и тогда действительно можно сказать: "ну это судьба" :)
     
  9. gureedo

    gureedo Самец :)

    Репутация:
    42.252
    gureedo, 21 окт 2007
    ну лучше чем в бусте долго придеться писать свою функцию.
    boost это набор темплейтов и классов. мультиплатформенный.
    несколько постов назад я его выкладывал.
     
  10. Пона

    Пона Ословед

    Репутация:
    1.158
    Пона, 21 окт 2007
    А как эту штуку присоединить к visual studio 2005 ?
    Просто я в этом не соображаю ничего:)
     
  11. gureedo

    gureedo Самец :)

    Репутация:
    42.252
    gureedo, 21 окт 2007
    ну прописываете его в просматриваемых директориях для инклюда.
    В меню.
    Tols -> Options... -> Project and Solutions -> VC++Directories.
    Там в правом верхнем комбобоксе выбираем Include files.
    И в списочек заносим директорию которая содержит буст.
    "F:\dev\boost" к примеру так.
     
  12. Пона

    Пона Ословед

    Репутация:
    1.158
    Пона, 21 окт 2007
    Помогите, пожалуйста!!!!
    Код:
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
    using namespace std;
    
    LRESULT CALLBACK WindowFunc (HWND, UINT, WPARAM, LPARAM);
    
    	char szWinName [] = "Mywin";
    	char str [80] = "STr of af";
    
    int WINAPI WinMain (HINSTANCE hThisInst,
    					HINSTANCE hPrevInst,
    					LPSTR lpszArgs,
    					int nWinMode)
    {
    	HWND hwnd;
    	MSG msg;
    	WNDCLASS wcl;
    
    	wcl.hInstance = hThisInst;
    	wcl.lpszClassName = szWinName;
    	wcl.lpfnWndProc = WindowFunc;
    	wcl.style = 0;
    	wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wcl.hCursor= LoadCursor(NULL, IDC_ARROW);
    	wcl.lpszMenuName = NULL;
    	wcl.cbClsExtra = 0;
    	wcl.cbWndExtra = 0;
    	wcl.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
    
    	if (!RegisterClass (&wcl) )
    		return 0;
    
    	hwnd = CreateWindow (szWinName,
    		"1234",
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		HWND_DESKTOP,
    		NULL,
    		hThisInst,
    		NULL);
    	ShowWindow(hwnd, nWinMode);
    	UpdateWindow (hwnd);
    
    	while (GetMessage (&msg, NULL,0,0) )
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WindowFunc (HWND hwnd,
    							 UINT message,
    							 WPARAM wParam,
    							 LPARAM lParam)
    {
    	HDC hdc;
    	PAINTSTRUCT paintstruct;
    	switch (message)
    	{
    	case WM_CHAR:
    		hdc = GetDC(hwnd);
    		TextOut (hdc, 1,1," ",2);
    		sprintf(str,"%c",(char)wParam);
    		TextOut (hdc, 1,1,str,strlen(str));
    		ReleaseDC(hwnd,hdc);
    		break;
    
    	case WM_PAINT:
    		hdc = BeginPaint (hwnd, &paintstruct);
    		TextOut (hdc, 1,1,str,strlen(str));
    		EndPaint(hwnd, &paintstruct);
    		break;
    
    	case WM_RBUTTONDOWN:
    		hdc = GetDC(hwnd);
    		strcpy(str,"Right button");
    		TextOut(hdc, LOWORD (lParam), HIWORD(lParam), str,strlen(str));
    		ReleaseDC(hwnd,hdc);
    		break;
    
    	case WM_LBUTTONDOWN:
    		hdc = GetDC(hwnd);
    		strcpy(str,"Left button");
    		TextOut(hdc, LOWORD (lParam), HIWORD(lParam), str,strlen(str));
    		ReleaseDC(hwnd,hdc);
    		break;
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    
    	default:
    		return DefWindowProc(hwnd, message,wParam,lParam);
    	}
    	return 0;
    }
    Visual Studio выдает фактически однотипные ошибки которые никак не могу исправить:(
    код из книги, вроде как должен компилиться нормально ...:

    Код:
    Error	1	error C2871: 'std' : a namespace with this name does not exist		4
    Error	2	error C2440: '=' : cannot convert from 'char [6]' to 'LPCWSTR'		21
    Error	3	error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'char [6]' to 'LPCWSTR'		44
    Warning	4	warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data		53
    Error	5	error C2664: 'TextOutW' : cannot convert parameter 4 from 'const char [2]' to 'LPCWSTR'		67
    Error	6	error C2664: 'TextOutW' : cannot convert parameter 4 from 'char [80]' to 'LPCWSTR'		69
    Error	7	error C2664: 'TextOutW' : cannot convert parameter 4 from 'char [80]' to 'LPCWSTR'		75
    Error	8	error C2664: 'TextOutW' : cannot convert parameter 4 from 'char [80]' to 'LPCWSTR'		82
    Error	9	error C2664: 'TextOutW' : cannot convert parameter 4 from 'char [80]' to 'LPCWSTR'		89
    
     
  13. Konung

    Konung

    Репутация:
    57.404
    Konung, 21 окт 2007
    Дык вроде все по-русски... ну тоесть по английски написано.. :)
     
  14. Пона

    Пона Ословед

    Репутация:
    1.158
    Пона, 21 окт 2007
    Ага:)
    Прсто в чем фишка-то?
    В универе подобное нормально рабтает ...
    Попробуй у себя запустить, если не трудно ...
     
  15. JC Denton

    JC Denton Ословед

    Репутация:
    529
    JC Denton, 21 окт 2007
    'std' : a namespace with this name does not exist - не удивительно, ведь вы не подключаете никаких библиотек STL (те, что с .h содержат только безымянное пространство имен)
    '=' : cannot convert from 'char [6]' to 'LPCWSTR' здесь и в остальных местах подобных сделайте приведение типов, пример:
    TextOut (hdc, 1,1,(LPCWSTR)" ",2);
    warning C4244: 'return' - поменяйте возвращаемый тип на WPARAM
     
  16. Пона

    Пона Ословед

    Репутация:
    1.158
    Пона, 21 окт 2007
    Вот решение проблемы:)



     
  17. elle

    elle Ословед

    Репутация:
    1.730
    elle, 21 окт 2007
    может у кого-нить ести исходники реализующие простой (не кольцевой) двусвязный список?
     
  18. Konung

    Konung

    Репутация:
    57.404
    Konung, 21 окт 2007
    Вот... только я не помню, кольцевой ли там (да один хрен - указатель уберешь если что :) )
    K2.rar 3.62 Кб [100-103]
     
  19. Bob

    Bob Ословед

    Репутация:
    209
    Bob, 22 окт 2007
    Про СОМ-порты

    Народ, вопрос не совсем по С++, скорее по знанию API:
    Суть проблемы:
    Делается операция асинхронного чтения из СОМ-порта (ReadFile)
    Далее проверяется результат возвращаемый ф-ей ReadFile:
    Если "1", то операция полностью завершена и мы прочитали столько байт из порта сколько и запрашивали.
    Если "0" и ф-я GetLastError возвращает нам ERROR_IO_PENDING, значит операция ReadFile выполняется в фоне и мы ожидаем ее завершения в функции GetOverlappedResult.
    Так вот, GetOverlappedResult возвращает нам не все байты, которые были приняти из СОМ-порта, а только часть. Оставшаяся часть сидит где-то в буферах винды и выйдет оттуда только при следующем приеме.
    Тоесть винда отдает нам байты принятые из СОМ-порта порциями, примерно по 10 .. 30 байт и пока она эту порцию не накопит, она нам ничего не отдаст.
    Тоесть если длина сообщения допустим равна 15 байт, то мы либо сразу можем их все получить(Readfile возвратил 1), либо получить 10 байт(после GetOverlappedResult) , а оставшеся 5 засядут в приемном буфере винды. Вот собственно и вопрос: Как сделать, чтобы GetOverlappedResult возвращал нам ВСЕ, что накоплено в приемном буфере допустим по истечении таймаута ? (SetCommTimeouts у меня установлен в заведомо большее значение, чем требуется для приема необходимого числа байт)

    Код:
    ;процедура приема данных
    ;вход: lpBuff  -  указатель на буфер, dwSize  -  размер буфера
    ;выход: eax == число прочитанных байт
    ReadCOM     proc lpBuff, dwSize: DWORD
    	invoke  ReadFile, hCOM, lpBuff, dwSize , offset dwLength, offset o2     ; Читаем из порта асинхронно
    	test    eax, eax                                                        ; Ноль ? 
    	jne     @end                                                            ; Нет. Операция завершена
    	invoke  GetLastError                                                    ; Да ноль. 
    	cmp     eax, ERROR_IO_PENDING                                           ; Операция выполняется в фоне ?
    	jnz     @Err                                                            ; Нет ? Ну тогда ошибка !
    	invoke  GetOverlappedResult, hCOM, offset o2, offset dwLength, 1        ; Да. Ждем ее завершения
    	test    eax,eax                                                         ; Не выйдет пока не завершится операция чтения
    	jne     @end                                                            ; Все ок, валим отсюда.
    @Err:
        invoke  ClearCommError, hCOM, offset tmp1, offset ComStat
    	sub     eax, eax
    	ret
    @end:
        invoke  ResetEvent, o2.hEvent                                           ; Сбросили событие. Все прочитано
        mov     eax, dwLength                                                   ; Сколько прочитали байтов.
        ret
    ReadCOM endp
    
     
  20. Green[ek]

    Green[ek]

    Репутация:
    17.159
    Green[ek], 23 окт 2007
    кто-нить код упрощенного сабжа может привести??
    какой метод сортировки использовать для работы с записями в файле?
     
  21. Ner-Zul

    Ner-Zul

    Репутация:
    57
    Ner-Zul, 23 окт 2007
    Народ помогите, я в С++ шарю, но с сетями недружу...
    Надо написать 2 проги, первая: сервер посылает на клиент число, а вторая: клиент должен прибавить к этому числу другое число и отправить на сервер...
     
Загрузка...