Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: bomzzz
Дата сообщения: 20.11.2011 13:55
щас попробую

Добавлено:
ура спасипки!!!!!!!!!!

Добавлено:
invoke SendMessage ,hwnd,WM_SYSCOMMAND,SC_KEYMENU,' '

я пробел lParam не указал

Добавлено:
invoke DefWindowProc ,hwnd,WM_SYSCOMMAND,SC_KEYMENU,' '
так тоже работает есесвена
Автор: Molniev
Дата сообщения: 20.11.2011 14:51

Цитата:
это все что в голову пришло, но как то не очень, хуже только сэмулировать нажатие мыши в угол окна

Ну если вспомнить TranslateMessage главного цикла то не все так плохо. Но разумеется прямое решение более разумно.
Автор: bomzzz
Дата сообщения: 20.11.2011 20:33
некорректно работает зараза. что то не то. зависает вызов меню, что то должно сбрасываться от чего то.

Добавлено:
http://zalil.ru/32098776
если F10 нажать меню появится, если убрать его ESCAPE оно исчезнет, но чтоб оно опять появилось надо перед F10 нажать какую нибудь служебную клавишу ESC или ALT например, потому что окно залочено как бы - например курсор не мигает в едитконтроле в такие моменты

Добавлено:
а когда ALT+SPACE используешь то на самом деле сначала ALT нажимается и окно разлочивается
Автор: bomzzz
Дата сообщения: 21.11.2011 14:51
если зарыть системное меню клавишей ESCAPE то кнопка ALT остается зажатой, или ее надо каждый раз отжимать или это вообще дурацкая идея фльт+спейс заменять. наверно ошибка микрософта
Автор: kenny5705
Дата сообщения: 25.11.2011 19:54
можно ли с помощью с++ получить содержимое веб-страниц (исх.код)? если да, то как?
Автор: bomzzz
Дата сообщения: 25.11.2011 19:56
kenny5705
скачать и рассматривать как текстовый документ

wininet или winsocks - ключевые слова чтоб скачать. а скачанное ну просто текстовый файл

wininet - считается проще, это библиотека ИЕ, которая сама использует winsocks
winsocks считается сложнее но на самом деле ни че сложного запрос сформировать нетрудно
че лучше использовать зависит от сложности задачи.
urlmon еще есть такая библиотек, если просто надо скачать небольшую страничку то проще всего ее использовать

возьми любой URL (ссылку) на страницу засунь в менеджер закачек какой тама у тебя DownloadMaster NetTrasport любой, скачается htm или html файлик, открой его в блокноте вот так и получится

не думаю что ты тама затеял что то сложное (иначе бы не спрашивал про текстовый формат) вот пример но только на масме на Си не трудно переложить URLMON-а.
все в одну строку делается и если не нужен спесфиский юзерагент или кукиш, и ссылка не шибка мудреная - то самый подходячий спосоп


Цитата:

    .386
    .model flat,stdcall
    option casemap:none

    include \masm32\include\windows.inc

    include \masm32\include\user32.inc
    include \masm32\include\shell32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\urlmon.inc

    includelib \masm32\lib\urlmon.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\shell32.lib

.data
    msgOk        db "Готово ",0
    msgErr        db "Ошибка ",0
    mcap        db "Downloader",0
    fileUrl        db "http://bomz-co.narod.ru/ENHANCER.zip",0
    fileSave    db "ENHANCER.zip",0

.code
start:
    invoke URLDownloadToFile, 0, addr fileUrl, addr fileSave, 0, 0
.if eax == S_OK
    invoke MessageBox, NULL, addr msgOk , addr mcap, MB_OK + MB_ICONASTERISK
.else
    invoke MessageBox, NULL, addr msgErr, addr mcap, MB_OK + MB_ICONASTERISK
.endif
    invoke    ExitProcess,eax
end start
Автор: kenny5705
Дата сообщения: 26.11.2011 13:25
bomzzz
за wininet спасибо, нашел тут полезную инфу на rsdn.ru, хотя и она не понадобилась, использовал wget
другое не понадобилось на си и масме программировать не умею

в итоге получил желанные старницы...
теперь нужно отсортировать информацию из них... выделить нужное / убрать ненужное...
а для начала как прочитать и записать данные из одного в другой файл на с++?
Автор: bomzzz
Дата сообщения: 26.11.2011 13:40
ну просто открыть файл да читать. я не знаю синтаксиса на Си подожди кто нибудь напишет. или так же как ты нашел все про вининет погугли "C работа с фалами" типа такого

Добавлено:
на всех языках одинаково, на си наверняка так же - открываешь файл, получаешь ассоциированный с ним хендл, а потом читаешь по порядку от начала, смещаешь указатель в нужную сторону в случае необходимости - такая идея

Добавлено:
winapi то везде одинаковые. вот кусок кода на масме - открывается файл, определяется его размер, резервируется блок памяти (для скорости) и весь файл считывается туда, а потом уже работает в памятью, что быстрее. смотри какие вип апи используются

Цитата:

    invoke OpenFile, ebx, addr FSTRUC, OF_READ
    .IF eax==-1                ; HFILE_ERROR=-1
    jmp NOSID
    .ENDIF

    mov Handle_Mess, eax
    invoke GetFileSize,Handle_Mess,addr HighOrderWord    ; получим размер файла для чтения, сохраним старшее слово размера
    mov LowOrderWord, eax                ; сохраним младшее слово размера

    invoke LocalAlloc,LMEM_FIXED OR LMEM_ZEROINIT,LowOrderWord        ; зарезервируем блок памяти
    mov hMemory,eax
    invoke ReadFile,Handle_Mess,hMemory,LowOrderWord,addr bytesRead,NULL
    invoke CloseHandle, Handle_Mess


Добавлено:
более навороченная функция что файл открывать. но суть одна

Цитата:

    invoke CreateFile,File_Read,GENERIC_READ,0,0,OPEN_EXISTING,\
    FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_NO_BUFFERING OR FILE_FLAG_SEQUENTIAL_SCAN,0    ; открываем файл для чтения


Добавлено:
могу добавить - интернет штука ненадежная он может затупить, зависнуть, упасть - так что все запросы даже ассинхронные лучше отдельным тредом оформлять
Автор: kenny5705
Дата сообщения: 26.11.2011 14:43
bomzzz
да лан не парься ты так сам как нибудь найду...
точнее уже нашел

теперь ищу консольный преобразователь формул TeX'а в формулы но уже для отображения на экране
Автор: blaro
Дата сообщения: 26.11.2011 20:33
Привет всем.
Есть такая задача: дана серия чисел. Первое число х1=1. Каждый следующие элемент расчитывается по формуле xn+1=0.5*(xi+a/xi)
a - число которое вводится с клавиатуры.
Далее, программа должна вывести на экран значение i и xi, если |a-xi2|<epsilon.
epsilon - также вводится с клавиатуры. Он должен быть положительным и не меньше 10-6.
Я написал код и при прогоне программа выдает x3=2.454 (если а=6, epsilon=0.000001), хотя по идее программа должна совершить еще пару итераций, потому что |6-2.4542|<epsilon. Ниже код который я написал. Помогите разобраться где проблема. Спасибо.
#include <stdio.h>
#include<math.h>

int main()
{
    int i=1;
    float xi=1.0,a,epsilon,tmp;
    printf("Enter \"a\" value\n");
    scanf("%f",&a);
    printf("Enter an epsilon value\n");
    scanf("%f",&epsilon);
    tmp=abs(a-pow(xi,2));
    while(abs(a-pow(xi,2))>=epsilon)
    {
        i++;
        xi=0.5*(xi+a/xi);
    }
    printf("x%d=%f\n",i,xi);
    return 0;
}
Автор: akaGM
Дата сообщения: 26.11.2011 20:50
blaro
замени все abs() на fabs() и будет тебе счастье...
Автор: blaro
Дата сообщения: 26.11.2011 21:56
akaGM
Спасибо.
Еще скажите, у меня в условиях использовать переменные типа double. Когда я ввожу с клавиатуры или вывожу на экран я должен писать %lf, правильно?
Автор: akaGM
Дата сообщения: 26.11.2011 22:02
blaro

Цитата:
у меня в условиях использовать переменные типа double
правильное условие...

%lf

l == long
достаточно %e или %g или %f

почитай о форматах i/o...
Автор: Abs62
Дата сообщения: 26.11.2011 23:37
akaGM

Цитата:
%lf

l == long
достаточно %e или %g или %f

Для ввода недостаточно. Функция scanf требует чёткого соблюдения типа параметра. %e, %g, %f вводят float, переменную double ей с такими полями ввода подсовывать нельзя. Для ввода в double обязательно надо %le, %lg, %lf.
Автор: akaGM
Дата сообщения: 26.11.2011 23:48
Abs62
да?
всегда был в полной уверенности, что для double достаточно
%f, а %lf -- для long double
не поленюсь, освежу format specification...

да...
для scanf() надо, для printf() вроде нет...
Автор: bomzzz
Дата сообщения: 27.11.2011 02:14
никто случайно не знает, почему когда из буфера обмена вставляешь новое имя файла (переименовываешь файл) приходит сообщение какабудта в буфер было что то скопировано.

WM_DRAWCLIPBOARD



ну или можно его как то отличить от обычно изменения содержимого буфера?

Добавлено:
http://vsokovikov.narod.ru/New_MSDN_API/Clipboard/notify_wm_drawclipboard.htm

Цитата:
Параметры
wParam
Не используется; должно быть нуль.
lParam
Не используется; должно быть нуль.

lParam действительно ноль всегда, а вот wParam не фига не нуль, но всегда разное число, видимо как то с смещением в памяти связан. зависимости не вижу в его изменении, чтоб различить эти ситуации

Добавлено:
всосал что происходит - перед тем как "вставить" в поле изменения имени файла, система перезаписывает буфер обмена, чтоб исключить из него недопустимые символы в именах (причем символы бывают двух степеней несовместимости, несовместимые абсолютно и недопустимые виндой) возможно была дыра и так ее заткнули. поэтому чтоб это дело обойти надо отлавливать это меню системное экплорера.

то есть если поместить в буфер обмена например 1///////////////, потом попробовать это вставить в имя файла у вас в буфере останется 1
Автор: asi81
Дата сообщения: 28.11.2011 09:30
Никто не подскажет? Есть ли для стандартных потоков ввода вывода модификатор, заполняющий пустые места нулями, а не пробелами.

Тоесть есть следущее:

cout << setw(2) << 5 << setw(2) << 2;
Получаем
5 2
А хотелось бы получать
0502


Добавлено:
akaGM
Я конечно не берусь никого учить, но если использовать плюсы, а не Си, то лучше использовать std::cout и strstream вместо scanf() и sscanf(). На своем опыте знаю сколько ошибок типа "бой по памяти" сидят в этих 2х функциях.
Автор: akaGM
Дата сообщения: 28.11.2011 10:53
asi81
ну так и скажи об этом автору кода, а не мне, он их там использует, я-то тут причём?
кстати, твоя же проблема printf-ом решается с полтыка...
а так юзай setfill() :

cout << setfill('0');
cout << setw(2) << 5 << setw(2) << 2;
Автор: bomzzz
Дата сообщения: 28.11.2011 17:59
люди киньте идею как сделать. я хочу передавать данные командным параметром УЖЕ ЗАПУЩЕННОЙ ПРОГРАММЕ. то есть запускается вторая копия приложения, оно определяет, что одна его копия уже запущена - не запускается, но если ему передан командный параметр оно посылает запущенному экземпляру некое сообщение, где в одном из параметров смещение на переданные данные. вот как это сделать - выделить память в контексте первого процесса и записать данные туда, или как то можно проще сделать?
Автор: Abs62
Дата сообщения: 28.11.2011 18:23
bomzzz
Почитай Рихтера про memory-mapped files.
Автор: bomzzz
Дата сообщения: 28.11.2011 18:29
сенкс

Добавлено:
.NET framework 4.0 не особо, но я еще ниче не прочитал
Автор: bomzzz
Дата сообщения: 29.11.2011 03:10
вообщем ниче сложного в контексте (не знаю правильно ли так сказать) одного процесса смещение на переменные всегда одинаковые
узнать бы че где в чужих программах.
Автор: bomzzz
Дата сообщения: 29.11.2011 05:14
http://zalil.ru/32155546

если не трудно проверьте пожалуйста на семерке, покажет ли программка 4206592 - смещение на начало сегмента(блока) данных??

Автор: kenny5705
Дата сообщения: 29.11.2011 20:14
никто не подскажет, где собака зарыта..
на gcc отлично выполняется, а на VS2010 не хочет в условие if( found != string::npos ) заходить...
вот часть кода, где не правильно работает...

Код:
size_t found;
string lines;
while( !input_file.eof() )
    {        
        getline( input_file, lines ); //возвращает в lines строку из файла
        
        found = lines.find("<h2> <span class=\"mw-headline\"> Условие задачи </span></h2>"); //номер позиции содержащей данное выражение
        //output_file << found << endl;
        if( found != string::npos ) // если не равно значит есть такое выражение в строке есть
        {
            ident = 1;
            output_file << "<h2>Задача " << numbZad << "</h2>" << endl;
            lines = "<h2> <span class=\"mw-headline\"> Условие задачи </span></h2>";
            numbZad++;
        };
};
Автор: Abs62
Дата сообщения: 29.11.2011 21:02
kenny5705
А чисто английский текст нормально ищет? Может, текст в файле и в коде в разной кодировке?
Автор: bomzzz
Дата сообщения: 30.11.2011 03:36
никто не знает такую фигню, на примере - вот у меня в програмке есть "выбрать файл" вызывается меню выбора файла GetOpenFileName и для этого приложение подгружает дллку Comdlg32.dll которая жрет аж 3.5 мб памяти (при том что все приложение 2.5 мб), после того как файл выбран эта библиотека уже ни разу больше не нужна, но вот освободить память от нее как я только не пробовал не получается и FreeLibruary и EmptyWorkingSet пробовал. можно ли все таки как то выкинуть из памяти то что уже не будет использоваться?

Автор: bomzzz
Дата сообщения: 30.11.2011 06:08
http://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx
никто случайно не знает целочисленное значение констант привелегий?


нашел ответ. а методом тыка угадал с первого раза - 14 было значение
http://msdn.microsoft.com/en-us/library/windows/desktop/aa379180%28v=vs.85%29.aspx

чтоб получить размер занимаемый системным процессом памяти нужна привелегия 14h - SeDebugPrivilege
Автор: kenny5705
Дата сообщения: 30.11.2011 18:02

Цитата:
А чисто английский текст нормально ищет? Может, текст в файле и в коде в разной кодировке?

вообще да, английский текст ищет... а вот русский не хочет...
а ведь были такие подозрения, только я думал что нужно какую-нибудь локаль подключать, или как там это называется...
входной файл в кодировке UTF-8, а программа скомпилированная в VS2010 создает файл с кодировкой Win1251... и да если сменить входной файл в кодировку Win1251, то программа успешно выполняет поставленную роль...

Не подскажете как это можно попроще исправить, т.е чтоб программа читала и отправляла в кодировке UTF-8?
Автор: bomzzz
Дата сообщения: 30.11.2011 18:08
kenny5705

MultiByteToWideChar в этом направлении копай

Добавлено:
может пригодится код на масме
(ANSIOEM) to UTF8
[more]
.386
.model flat, stdcall
option casemap :none
;************************************************************
; 20060810 U.Neudecker
;************************************************************

include \masm32\include\masm32.inc
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\macros\macros.asm

; CharTypes:
; CP_ACP ANSI codepage = 0
; CP_OEMCP OEM (original equipment manufacturer) codepage = 1

CP_UTF8 equ 65001

.code
COMMENT * #######################################################################
Converts a String (ANSI/OEM) to UTF8
The buffer pointed to by pUTF8String must be sufficient to hold the UTF8-string.
Otherwise GetLastError is called.
If the function succeeds, the return value is the number of bytes written to the buffer
pointed to by pUTF8String. The number includes the byte for the null terminator
Otherwise GetLastError is called with neg(!) result.
####################################################################### COMMENT *

CharToUTF8 proc stdcall uses ecx,
pCharString:dword,
lenCharString:dword,
CharType:dword,
pUTF8String:dword,
lenUTF8String:dword

LOCAL pUNICODE:dword
LOCAL lenUNICODE:DWORD

mov ecx, lenCharString
shl ecx, 1
invoke ealloc, ecx
mov pUNICODE, eax
invoke MultiByteToWideChar, CharType, 1, pCharString, lenCharString, pUNICODE, ecx
.if eax == 0
invoke GetLastError
neg eax
invoke efree, pUNICODE
ret
.endif

invoke WideCharToMultiByte, CP_UTF8, 0, pUNICODE, lenCharString, pUTF8String, lenUTF8String, 0, 0
.if eax == 0
invoke GetLastError
neg eax
.endif
push eax
invoke efree, pUNICODE
pop eax
ret
CharToUTF8 endp

;#######################################################################

UTF8ToChar proc stdcall uses ecx,
pUTF8String:dword,
lenUTF8String:dword,
pCharString:dword,
lenCharString:dword,
CharType:dword

LOCAL pUNICODE:dword
LOCAL lenUNICODE:DWORD

invoke MultiByteToWideChar, CP_UTF8, 0, pUTF8String, lenUTF8String, pUNICODE, 0
mov lenUNICODE, eax
shl eax, 1
invoke ealloc, eax
mov pUNICODE, eax
invoke MultiByteToWideChar, CP_UTF8, 0, pUTF8String, lenUTF8String, pUNICODE, lenUNICODE

invoke WideCharToMultiByte, CharType, 0, pUNICODE, lenUNICODE, pCharString, lenCharString, 0, 0
.if eax == 0
invoke GetLastError
neg eax
.endif
push eax
invoke efree, pUNICODE
pop eax
ret

UTF8ToChar endp

;#######################################################################

END
[/more]
UTFTOANSI
[more]
; ===============================================================
; ===============================================================
    .386                    ; процессор
    .model flat,stdcall            ; память плоская, stdcall определяет порядок передачи параметров слева-направо, а также что будет балансировать стек после вызова функции
    option casemap:none            ; в этой программе важны регистры букв
; ===============================================================
    include \masm32\include\windows.inc    ; библиотеки используемые программой

    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\shell32.inc
    include \MASM32\include\wininet.inc
    include \MASM32\INCLUDE\shlwapi.inc

    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\shell32.lib
    includelib \MASM32\lib\wininet.lib    ; точка с запятой отделяют ремарки от основного кода программы
    includelib \MASM32\LIB\shlwapi.lib
; ===============================================================
.data                        ; секция данных
String db 'Текстовый документ Текстовый документ Текстовый документ.txt',0
;String db '[RuTor.Org]Карьера_охранника_Де.torrent',0
;String db '',0
;String db '[RuTor.Org]Insadong_Scandal.torrent[RuTor.Org]Insadong_Scandal.torrent',0

;String    db 'Текстовый документ Текстовый документ Текстовый документ.txt',0
;String db 'АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЭэЮюЯяЫыЪъЬь',0
;String db 'АаБбВвГгДдЕеЁёЖжЗзР&#152;иЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщР-эЮюЯяЫыЪъ',0

; ===============================================================
.data?                        ; секция с неинициализированными данными, они не включается в исполняемый файл и появляется только тогда, когда программа загружается в память

    PointToString    dd ?
    COnvertBuffer    db INTERNET_MAX_URL_LENGTH dup (?)
            db INTERNET_MAX_URL_LENGTH dup (?)
    COnvertBufSize    dd ?
    COnvertStrSize    dd ?

; ===============================================================
.code                        ; начало кода
start:                        ; старт

mov PointToString, offset String

invoke lstrlen,PointToString
mov COnvertStrSize, eax
invoke MultiByteToWideChar, CP_UTF8, 0, PointToString, COnvertStrSize, COnvertBufSize, 0
mov COnvertBufSize, eax
invoke MultiByteToWideChar, CP_UTF8, 0, PointToString, COnvertStrSize, addr COnvertBuffer, COnvertBufSize
invoke WideCharToMultiByte,CP_ACP,0,addr COnvertBuffer,COnvertBufSize,PointToString,COnvertStrSize,0,0
mov eax, COnvertBufSize
lea ebx,String
add eax, ebx
mov byte ptr [eax], 0

invoke MessageBox,0,addr String,0,0

    invoke    ExitProcess,0            ; выходим из программы, eax - код возврата

end start                    ; конец ассемблирования


[/more]

Добавлено:
http://wiki.shelek.ru/index.php/FAQ:WinAPI_VCPP:%D0%BF%D0%B5%D1%80%D0%B5%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_windows-1251_%D0%B8_UTF-8
вот чета про Си есть
Автор: kenny5705
Дата сообщения: 30.11.2011 18:58
bomzzz
ок.. спс.. покопаем-с

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.