Просмотр полной версии : [c/c++] Новичкам: задаем вопросы
Страницы :
1
2
3
4
5
6
[
7]
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
UnPazz http://msdn.microsoft.com/en-us/library/hf9x9wb4.aspx ищи нужное
Такая же быль трабл, просто открой стдафкс (лень язык переключать-контрл отлетел) и вбей туда #include <iostream.h> вродь должно пахать, не поможет, стукни в ЛС
А можно поинтересоваться разницей между подключением iostream.h в stdafx.h и в непосредственно исходнике?
Давайте разбираться
При создании нового проекта (C++, далее любой из подпроектов, типа Console App, MFC App, или ATL Service) Visual Studio генерит кучку файлов, которые составляют костяк приложения. Среди этих файлов имеются два, которые служать для генерации файла предкомпилированных заголовков (precompiled headers). Первый -- stdafx.h, в нем хранятся все "основные" include-ы проекта, но, как правило, не входящие в сам проект, т.е. файлы типа windows.h, stdio.h, afxwin.h включаются, а CSomeSuperPuperProjectClass.h -- нет.
Второй -- stdafx.cpp, служит как "затравка" компилятору для компиляции этого самого .pch-файла (precompiled headers file)
В свойствах проекта для всех файлов ставиться опция "use this precompiled header" и указывается stdafx.h
Исключение -- stfafx.cpp, для него указывается "create precompiled header file" и, опять таки, указывается stdafx.h
Q: Для чего это сделано.
A: Все это сделано для ускорения компиляции проектов и не более того. Из-за того, что объем части общих .h-файлов превосходит все разумные пределы (например windows.h, цепляющий ещё десяток win*.h), и компилировать все эти заголовочники для каждого source-файлы просто накладно. Поэтому один раз генерится PCH-файл, а потом он (PCH) используется. Ускорение, кстати, в десятки раз, особенно заметное при работе с ATL/MFC проектами.
Q: Почему возникает ошибка "error looking precompiled header directive".
A: В каждом source-файле, для которого стоит опция "use this precompiled header" #include "stdafx.h" должно идти первым include
Q: Как избавится от генерации PCH-файлов
A: В свойствах проекта для файлов выставить "Not Using Precompiled Headers" или "Automatically Generate"
Q: Где находятся эти опции
A: VS6: Project settings -> C/C++ -> Precompiled Headers
VS.NET: Configuration Properties -> C/C++ -> Precompiled Headers
Q: Я настроил компиляцию DEBUG-версии на отказ использования PCH, но при компиляции RELEASE ошибка опять возникла.
A: Project setting для DEBUG/RELEASE представляю разные сущности. См. пред. пункт Q/A и настрой все для RELEASE-конфигурации.
источник http://www.securitylab.ru/forum/forum25/topic12300/messages/
ForNeVeR
04.09.2008, 07:31
Если при создании проекта указывать, что хочешь пустой проект - прекомпиленные хедеры не добавляются и львиной доли проблем, связанных с "несовместимостью" 2008 студии, удаётся избежать.
Если при создании проекта указывать, что хочешь пустой проект - прекомпиленные хедеры не добавляются и львиной доли проблем, связанных с "несовместимостью" 2008 студии, удаётся избежать.
Совершенно верно... но иногда так ломает ввводить
int _tmain(inc argc, _TCHAR *argv[]) :)
есть у кого нибудь исходник ftp-клиента на C/C++, чтобы можно было отправить файл на сервер??
очень, нужно ((
ForNeVeR
04.09.2008, 12:57
Совершенно верно... но иногда так ломает ввводить
int _tmain(inc argc, _TCHAR *argv[]) :)
Я в основном пишу консольные программы и часто ограничиваюсь
void main()
:)
есть у кого нибудь исходник ftp-клиента на C/C++, чтобы можно было отправить файл на сервер??
очень, нужно (( FileZilla
agrofyl2
04.09.2008, 15:04
Пожалуйста помогите с кодом, сообщение #1500(в самом внизу на 150 странице)
я не в курсе, чем отличается, но работает))
такшто разбирайтесь
1. юзать ком-объект ворда и описалово к нему
2. поискать в гугле описание формата doc (благо его открыли) и построить свой ворд (или может уже даже есть готовые алгоритмы - тоже в гугл).
Как юзать ком-объект ворда, у мну есть пример. Тока на делфи =(. Если надо, то стучи в ПМ.
+1,
инфа найдена : http://ivr.webzone.ru/articles/doc2txt/index.htm
Anderson55
05.09.2008, 20:59
есть на машине visual studio 2005 c информацией проблем нет так же как и со скачкой из инета- ПОМОГИТЕ НАУЧИТСЯ КОДИТЬ НА С++ !!!что надо делать-подскажите пожалуйста??
сть на машине visual studio 2005 c информацией проблем нет так же как и со скачкой из инета- ПОМОГИТЕ НАУЧИТСЯ КОДИТЬ НА С++ !!!что надо делать-подскажите пожалуйста?? Научиться читать. Сверху в разделе закреплена тема.
Anderson55
05.09.2008, 22:40
ок,спасибо,извини-сразу не увидел))
#include "stdafx.h"
#include <iostream.h>
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello world!!!" << endl;
char szText[256];
cin >> szText;
return 0;
}
Скачал у чебник по VC++. Компилирую выше приведенную программу
iostream.h - отсутствует в папке include.
Как быть?
Upd:
Вкурил:
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout<< "Hello world!!!";
char szText[256];
cin>>szText;
return 0;
}
гугл рулит))
Да, все старые либы с расширение .h не рулят. Лучше использовать новые без расширения, и использовать using объявление, чтобы не утомляться квалификаторами. А вот using директивами лучше не злоупотреблять, так как это может привести к конфликтам имен.
К чему я это говорю? Просто я недавно писал класс CharToHex. Реальный быдлокод на 100 строк максимум. Каково же было мое удивление, что он не смог скомпилиться, хотя был абсолютно синтаксически верен. Компилятор выдавал невнятно сообщение, что его не устраивает прототип конструктора.
А все почему?
using namespace std;
Эта директива открыла для меня пространство имен и создало конфликт имен. Оказывается уже был CharToHex, и я изобрел велосипед. Для себя я взял правило, никогда не использовать его. Достаточно объявить
using cout;
using cin;
и этого можно избежать. Зачем нам лишние методы?
Зачем нам лишние методы? Ты если бы сразу включил using namespace std, то заметил бы эту ф-ию сразу)
Ты если бы сразу включил using namespace std, то заметил бы эту ф-ию сразу)
да, я делал using namespace std; и вот что я получил
[C++ Error] Unit2.h(14): E2040 Declaration terminated incorrectly
[C++ Error] Unit2.h(15): E2272 Identifier expected
Это для Builder.
Для gcc
maniac@darkstar:~$ g++ main.cppmain.cpp:29:79: warning: no newline at end of filemain.cpp:12: ошибка: анонимное объединение не может иметь элементов-функцийmain.cpp:24: ошибка: member 'std::string <anonymous class>::strOriginal' with constructor not allowed in anonymous aggregatemain.cpp:24: ошибка: member 'std::string <anonymous class>::strOriginal' with destructor not allowed in anonymous aggregatemain.cpp:24: ошибка: member 'std::string <anonymous class>::strOriginal' with copy assignment operator not allowed in anonymous aggregatemain.cpp:26: ошибка: абстрактный декларатор '<anonymous class>' использован в качестве декларатора
Довольно расплывчато понятно что же на самом деле имеется в виду.
Да, все старые либы с расширение .h не рулят.
Либ с расширением .h я ещё не видел..
Либ с расширением .h я ещё не видел..
имелась в виду стандартная библиотека или std. а не *.lib, *.dll. Прощу прощения за несуразность.
ToniKapuchon
06.09.2008, 16:16
ostream& operator << (ostream& stream, char* rout)
{
char* tmp;
tmp = new char[strlen(rout) + 1];
CharToOem(rout, tmp);
stream.write(tmp, strlen(tmp));
delete [] tmp;
return stream;
}
void main()
{
cout << "Русский текст" << endl;
}
http://www.makak.ru/2008/02/19/vyvod-russkix-bukv-v-konsolnyx-prilozheniyax-na-c/
VOID Sleep(DWORD dwMilliseconds); - поисчи в файлах *.h //возможн. она в windows.h но не уверен... компилятора по рукойне((
ToniKapuchon а не легче setlocale(LC_ALL,"Russian");
Как установить boost в Visual Studio C++ 2008 ??
Скачал архив с файлами boost_1_36_0.zip с www.boost.org
сделал все как написано в FAQ
то есть прописал путь к boost в свойствах проекта
и изменил use на not use
In Configuration Properties > C/C++ > General > Additional Include Directories, enter the path to the Boost root directory, for example
C:\Program Files\boost\boost_1_36_0
In Configuration Properties > C/C++ > Precompiled Headers, change Use Precompiled Header (/Yu) to Not Using Precompiled Headers.3
только у меня папка на рабочем столе и путь такой
C:\Documents and Settings\dd\Рабочий стол\boost_1_36_0\boost
В результате компиляции программы которая испльзует boost выдает ошибки для каждого файла .ссp
вот пример
c:\documents and settings\dd\рабочий стол\boost_1_36_0\boost\regex.hpp(28) : fatal error C1083: Cannot open include file: 'boost/regex/config.hpp': No such file or directory Window.cpp
Хотя файл config.hpp у меня есть
в чем проблема ?
До установки boost прога не могла найти regex.hpp после установки на это не ругается но почему то config.hpp' невидет
Как ускорить цикл while? Он медленно работает.
Писать оптимальный код
ToniKapuchon
07.09.2008, 02:22
Как ускорить цикл while? Он медленно работает.
конечно есть там решения типа уменьшения времени выполнения цикла путём добавление if-ов (выйгрыш составляет доли секунды), но я думаю тебе пока рано об етом думать!
конечно есть там решения типа уменьшения времени выполнения цикла путём добавление if-ов (выйгрыш составляет доли секунды), но я думаю тебе пока рано об етом думать!
if'ы ускоряют?! Вообще-то условные операторы очень медленные и надо писать линейный код.
выйгрыш составляет доли секунды
Подобный выигрыш находится примерно на уровне погрешностей и не является существенным
jawbreaker
07.09.2008, 10:13
Как ускорить цикл while? Он медленно работает.
Использовать оптимизацию компилятора. ИМХО для современных компиляторов нет разницы for или while. Ты бы хоть цикл свой написал, с какими числами работаешь?
Ну или можно так:
for (int x = 0; x < 100; x++)
{
delete(x);
}
обычный цикл
for (int x = 0; x < 100; x += 5)
{
delete(x);
delete(x+1);
delete(x+2);
delete(x+3);
delete(x+4);
}
оптимизированный. Не думаю что разница будет очень уж заметна.
jawbreaker
07.09.2008, 13:14
iostream медленный. Используй сишные библиотеки, <cstdio>
#include <cstdio>
using namespace std;
void main(){
signed short i=0;
while(i < 5000){
printf("%d\n", i);
i++
}
}
используй апи :)
#include <windows.h>
#pragma comment(linker,"/ENTRY:Mymain")
void Mymain(){
signed short i=0;
HANDLE std=GetStdHandle(STD_OUTPUT_HANDLE);
char buf[10];
while(i < 5000){
_ultoa(i++,(char*)buf,10);
lstrcat((LPSTR)buf,"\n");
int len=lstrlen((LPCSTR)buf);
WriteFile(std,(LPCVOID)buf,len,(LPDWORD)&len,0);
}
}
Какой аналог explode(php(разбивает строку на массив, через разделитель)) в С++?
strtok()
http://msdn.microsoft.com/en-us/library/ms737591(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms737593(VS.85).aspx
как зделать чтобы программа печатала квадрат звёздочками заданого размера? типа если размер = 5 то квадрат (С++)
* * * * *
* *
* *
* *
* * * * *
ну типа тут квадрат ))
M@X Dr.Akyla
08.09.2008, 17:27
for (int i = 0; i < qwerty; i++)
{
for (int j = 0; j < qwerty; j++)
{cout << "*";}
cout << "\n";
}
// где qwerty сторона квадрата
Пример программы: :)
#include <iostream.h>
int main()
{
int qwerty;
cin >> qwerty;
for (int i = 0; i < qwerty; i++)
{
for (int j = 0; j < qwerty; j++)
{cout << "*";}
cout << "\n";
}
int r; // что бы консоль не "убегала" :)
cin >> r;
}
лучше
#include <conio.h>
getch() //в конце проги
ЗЫ: йа такой вопрос, чтобы консол не убегала задавал)
ChaaK, покури "Крис Касперски. Самоучитель игры на WinSock" _http://kpnc.opennet.ru/sock.pdf там на русском очень подробно описан алгоритм работы сокетов.
пробую перехватить MessageBoxA. Код библиотеки:
#include <stdafx.h>
struct jmp_far {
BYTE op_push;
DWORD arg;
BYTE op_ret;
};
BYTE buf[6];
DWORD adrmesbox;
DWORD written;
jmp_far jump;
BOOL WINAPI intMesbox(HWND hwnd, char *text, char *hdr, UINT utype)
{
WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)&buf, 6, &written);
char *str = "перехвачено111";
((BOOL (__stdcall*)(HWND, char*, char*, UINT))adrmesbox)(hwnd,
str, hdr, utype);
WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox,(void*)&jump, 6,&written);
return 1;
}
void intercept(void) {
adrmesbox = (DWORD)GetProcAddress(GetModuleHandleA("user32.dll"),"MessageBoxA");
if(adrmesbox == 0)
{
MessageBoxA(NULL, "MessageBoxA не найден", "ошибка", 0);
return;
}
jump.op_push = 0x68;
jump.arg = (DWORD)&intMesbox;
jump.op_push = 0xC3;
ReadProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)buf, 6, &written);
WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)&jump, 6, &written);
}
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call,
LPVOID lpReserved )
{
if(ul_reason_for_call == DLL_PROCESS_ATTACH )
{
intercept();
}
return 1;
}
void main(void) {
}
После того как я вставляю эту dll в процесс, запускаю MessageBoxA. Ничего не происходит, а должен появиться бокс с сообдением "перехвачено".
Visual Studio 2008
сама статья - http://www.rsdn.ru/article/baseserv/IntercetionAPI.xml
возможно проблемы с выравниванием элементов структуры jmp_far
procedure
11.09.2008, 14:10
Чуваки немного не могу разобраться в Visual Studio
Вобщем как я прочитал есть несколько видов точек останова "переходить в режим останова немедленно" "переходить в режим останова в зависимости от условия" "переходить заданное число раз"
Вот по условию есть там такая тема он переходит в режим останова в случае если условие true или если условие было изменено.
Это как понять? В режиме вычисления условия или еще до вычисления или после вычисление если условие изменилось?))
Вот по условию есть там такая тема он переходит в режим останова в случае если условие true или если условие было изменено.
Это как понять? В режиме вычисления условия или еще до вычисления или после вычисление если условие изменилось?))
Ну, пишешь условие, например, a == 5, если ты поставил "is true" и на этом месте действительно будет a == 5, то бряк сработает. Как-то так. Соответственно, условие "has changed" инвертирует поведение брейкпоинта.
возможно проблемы с выравниванием элементов структуры jmp_far
это как?
>>это как?
это так )
#pragma pack (push, 1)
//... any struct
#pragma pack (pop)
выравнивание по одному байту поставь
поставил выравнивание по 1 байту в настройках проекта. Проблема не решилась
поробуйте не в настройках, а явно, как у 0xc0de.
p.s. ваш перехват не годится для многопоточных приложений. также перехватчик intMessage или как он там, должен возвращать не 1, а то, что возвратит оригинальный MessageBox
2ntldr
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call,
LPVOID lpReserved )
{
if(ul_reason_for_call == DLL_PROCESS_ATTACH )
{
intercept();
}
return 1;
}
void main(void) { //<<- хммм
}
; *А зачем еще одна main?
Как отоброзить файлы в текущем каталоге?Пытаюсь делать так
TSearchRec sr;
char path[1024];
strcpy(path,GetCurrentDir().c_str());
strcat(path,"\\*.*");
for(;;)
{
if(FindFirst(AnsiString(path),faAnyFile, sr) == 0)
{ShowMessage(sr.Name);}
else{FindClose(sr);break;}
}
но оно мне только точки бесконечно выплевывает :( Как правильно надо?
___________________________________________
Упс.Извиняюсь затупил :p .Надобыло так
TSearchRec sr;
char path[1024];
strcpy(path,GetCurrentDir().c_str());
strcat(path,"\\*.*");
FindFirst(AnsiString(path),faAnyFile, sr);
for(;;)
{
if(FindNext(sr) == 0)
{ShowMessage(sr.Name);}
else{FindClose(sr);break;}
}
разве в этом случае ты первый файл не пропускаешь?
разве в этом случае ты первый файл не пропускаешь?
Это тот который "." ? Мне это не критично :)
поробуйте не в настройках, а явно, как у 0xc0de.
p.s. ваш перехват не годится для многопоточных приложений. также перехватчик intMessage или как он там, должен возвращать не 1, а то, что возвратит оригинальный MessageBox
Сделал, чтобы возвращал то что и оригинальный messageboxa;
явно, я так понял это так?
#pragma pack (push, 1);
struct jmp_far {
BYTE op_push;
DWORD arg;
BYTE op_ret;
};
#pragma pack (pop, 1);
лишнюю main() убрал.
Ничего не изменилось
2ntldr. Перед тем, как переписывать начало функции надо разрешить запись по адресу месадбокса с помощью функции VirtualProtect
http://msdn.microsoft.com/en-us/library/aa366898(VS.85).aspx
Установи защиту в PAGE_EXECUTE_READWRITE
не увидела с начала, что функи нет
И еще при выгрузке либы неплохо было бы байты восстанавливать в начале функции.
if (ul_reason_for_call == DLL_PROCESS_DETACH){
// код снятия перехвата
}
Добавил:
if(ul_reason_for_call == DLL_PROCESS_DETACH )
{
hookoff();
}
...
void hookoff(void) {
WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)&buf, 6, &written);
}
Изменил:
void intercept(void) {
DWORD oldf;
int prot;
adrmesbox = (DWORD)GetProcAddress(GetModuleHandleA("user32.dll"),"MessageBoxA");
if(adrmesbox == 0)
{
MessageBoxA(NULL, "MessageBoxA не найден", "ошибка", 0);
return;
}
prot = VirtualProtect((void*)adrmesbox,6,PAGE_EXECUTE_REA DWRITE,&oldf);
if (!prot) {
ExitProcess(0);
}
jump.op_push = 0x68;
jump.arg = (DWORD)&intMesbox;
jump.op_push = 0xC3;
ReadProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)buf, 6, &written);
WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)&jump, 6, &written);
}
проверь что возвращают Read(Write)ProcessMemory, можт исчо привилегею потипу SeDebugPrivilege получить?
2ntldr
Ненене. мего глючный код.
Надо так
jump.op_push = 0x68;
jump.arg = (DWORD)&intMesbox;
jump.op_ret = 0xC3;
А вы сначала написали
jump.op_push = 0x68;
jump.arg = (DWORD)&intMesbox;
jump.op_push = 0xC3;
Разница налицо. Теперь все пашет, проверила под отладчиком
Спасибо большое) ошибка оказалась глупее чем все думали. пока что проверить возможности нет, тк свет вырубили, но уверен, чтоьпроблема решена.
Есть обычное простенькое серверное приложение принимающее через сокет и выводящее в бесконечном цикле с определенным условием выхода текст.Со всеми пложенными bind,listen,accept.Оно расчитано на подключение одного клиента.Допустим если я захочу добавить в цикл условие выхода с возвратом ожидания на listen,допустим я туда буду возвращатся с помощью goto .Собственно вопрос куда ставить метку на listen?И что при этом надо в памяти очистить что бы можно было повторно подключится?
если я правильно понял, то алгоритм таков тебе нужен:
accept - возвращает тебе сокет для работы с присоединившимся человеком.
затем ты запускаешь потом через CreateThread и передешь функции обработки этот самый дискриптор. И далее заново циклом на accept.
А функция которая работает в потоке - там делаешь свои дела юзая переданный в параметрах дискриптор.
эээ...вообще для первоклассников вопрос:)
есть int x,y поменять местами значение x,y. если возможно без ввода дополнительных переменных, если нельзя, то ввести новые переменные.
тут два слова ответ..но какой?:)
есть int x,y поменять местами значение x,y. если возможно без ввода дополнительных переменных, если нельзя, то ввести новые переменные.
x = x + y;
y = x - y;
x = y - x;
как-то так =\
__________
как-то не так =\
SpangeBoB
15.09.2008, 14:42
Только последнее действие x-y
agrofyl2
15.09.2008, 15:38
Помогите плиз!
Как считывать данные из сокета построчно??
На ум приходит
1. Записать в файл и считывать fgets() (явно извращение)
2. Писать свою функцию(слишком геморно)
с дополнительным интегером придумал
z=y-x;
x=x+z;
y=y-z;
а как без него?:)
есть int x,y поменять местами значение x,y. если возможно без ввода дополнительных переменных
Ещё можно используя оператор xor (исключающая дизъюнцция).
a:=a xor b;
b:=a xor b;
a:=a xor b;
То же на асме:
int x=12;
int y=7;
__asm
{
mov eax,x
xchg eax,y
mov x,eax
}
если я правильно понял, то алгоритм таков тебе нужен:
accept - возвращает тебе сокет для работы с присоединившимся человеком.
затем ты запускаешь потом через CreateThread и передешь функции обработки этот самый дискриптор. И далее заново циклом на accept.
А функция которая работает в потоке - там делаешь свои дела юзая переданный в параметрах дискриптор.
Я немного непонял.Каким образом передавать сокет для работы с клиентом в поток?Путем обьявления промежуточной переменной типа SOCKET и передачи уже её в поток?А что с ней тогда делать после завершения потока,через ZeroMemory очищять?А смысл тогда создавать поток ,если серверное преложение не имеет гуи?
agrofyl2
15.09.2008, 19:03
_nic: вот код из Фленова
// TCPServer.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <winsock2.h>
#include "TCPServer.h"
#define MAX_LOADSTRING 100
#pragma comment( lib, "ws2_32.lib" )
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET sock=(SOCKET)lpParam;
char szRecvBuff[1024],
szSendBuff[1024];
int ret;
while(1)
{
ret = recv(sock, szRecvBuff, 1024, 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
MessageBox(0, "Recive data filed", "Error", 0);
break;
}
szRecvBuff[ret] = '\0';
strcpy(szSendBuff, "Command get OK");
ret = send(sock, szSendBuff, sizeof(szSendBuff), 0);
if (ret == SOCKET_ERROR)
{
break;
}
}
return 0;
}
DWORD WINAPI NetThread(LPVOID lpParam)
{
SOCKET sServerListen,
sClient;
struct sockaddr_in localaddr,
clientaddr;
HANDLE hThread;
DWORD dwThreadId;
int iSize;
sServerListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sServerListen == SOCKET_ERROR)
{
MessageBox(0, "Can't load WinSock", "Error", 0);
return 0;
}
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(5050);
if (bind(sServerListen, (struct sockaddr *)&localaddr,
sizeof(localaddr)) == SOCKET_ERROR)
{
MessageBox(0, "Can't bind", "Error", 0);
return 1;
}
MessageBox(0, "Bind OK", "Error", 0);
listen(sServerListen, 4);
MessageBox(0, "Listen OK", "Error", 0);
while (1)
{
iSize = sizeof(clientaddr);
sClient = accept(sServerListen, (struct sockaddr *)&clientaddr,
&iSize);
if (sClient == INVALID_SOCKET)
{
MessageBox(0, "Accept filed", "Error", 0);
break;
}
hThread = CreateThread(NULL, 0, ClientThread,
(LPVOID)sClient, 0, &dwThreadId);
if (hThread == NULL)
{
MessageBox(0, "Create thread filed", "Error", 0);
break;
}
CloseHandle(hThread);
}
closesocket(sServerListen);
return 0;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_TCPSERVER, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TCPSERVER);
WSADATA wsd;
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
MessageBox(0, "Can't load WinSock", "Error", 0);
return 0;
}
HANDLE hNetThread;
DWORD dwNetThreadId;
hNetThread = CreateThread(NULL, 0, NetThread,
0, 0, &dwNetThreadId);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
WSACleanup();
return (int) msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TCPSERVER);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCTSTR)IDC_TCPSERVER;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
И все равно я непонимаю как освободить Sockaddr_in остающиюся после инициализации клиентского сокета.
подскажите, plz, как получить список названий всех файлов папке.
Ещё мелочи:
1. скопировать значение int firstnum в int tempnum
2. Как скопировать значение double z в ближайший integer в int x
спасибо:)
ToniKapuchon
16.09.2008, 03:20
подскажите, plz, как получить список названий всех файлов папке.
FindFirst() FindNext() в цикле!!
посмотри тут http://forum.vingrad.ru/faq/topic-157851.html
double d;
int x = static_cast<int>(d);
Делать это можно только на свой страх и риск. При больших значениях d возникает потеря значимости.
подскажите, plz, как получить список названий всех файлов папке.
#include <vector>
#include <string>
#include <windows.h>
using namespace std;
vector<string> glob(const char* path) {
vector<string> v;
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
string s;
hFind = FindFirstFile(path, &FindFileData);
do {
s = string(FindFileData.cFileName);
if (s != "." && s != "..") {
v.push_back(s);
}
} while (FindNextFile(hFind, &FindFileData));
return v;
}
хачу научиться хоть немног писать интерфесы для програм, тобишь окна кнопки и т.д. т.п.
как создать окно уже прочитал, как кнопку тоже, но негде немогу найти чтоб описявалось подробно как обрабатывать нажатия кнопок (созданых мною) немоглибы направить меня на путь истиный...
http://www.rsdn.ru/article/baseserv/api32.xml
procedure
17.09.2008, 01:18
Вопрос по C#. Должны ли мы вызывать деструкторы объектов вручную чтоб это не приводило к ненужным тратам памяти? Или можно довериться выполнению деструкторов по умолчанию?
ForNeVeR
17.09.2008, 08:12
procedure, если твои классы занимают много памяти и она вся нужна тебе прямо сейчас - вызывай деструктор. В остальных случаях, я думаю, можно положиться на CLR'овский сборщик мусора.
Должны ли мы вызывать деструкторы объектов вручную чтоб это не приводило к ненужным тратам памяти? Нет.
Существует сборщик мусора. При удалении объекта он САМ вызовет деструктор.
Деструктор вызывать нельзя ни в каком случае.
Если хочешь освободить объекты - то просто сделай так. чтобы они не нужны были твоей программе - и Gc удалит их сам.
И вообще по Java и C# лучше отдельную тему завели бы.
как создать окно уже прочитал, как кнопку тоже, но негде немогу найти чтоб описявалось подробно как обрабатывать нажатия кнопок (созданых мною) немоглибы направить меня на путь истиный... Закреплена тема. Читать про Qt.
http://www.rsdn.ru/article/baseserv/api32.xml
спс, тут хоть было написано как нажатие левой кнопки мыши обработать ))
ЗЫ. но все же вопрос в силе.
ForNeVeR
17.09.2008, 15:22
Деструктор вызывать нельзя ни в каком случае.
Если хочешь освободить объекты - то просто сделай так. чтобы они не нужны были твоей программе - и Gc удалит их сам.
Верно, извиняюсь, глупость сморозил. Не имел под рукой компилятора. Действительно, студийный компилер даже слова delete не знает. А раз его нет - значит, оно не нужно.
#include <vector>
#include <string>
#include <windows.h>
using namespace std;
vector<string> glob(const char* path) {
vector<string> v;
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
string s;
hFind = FindFirstFile(path, &FindFileData);
do {
s = string(FindFileData.cFileName);
if (s != "." && s != "..") {
v.push_back(s);
}
} while (FindNextFile(hFind, &FindFileData));
return v;
}
Крайне медленная функция. я бы брал ссылку на вектор, все равно его объявит вышестоящая функция. А так еще и конструктор копирования вызывается.
Крайне медленная функция Как по мне - то разница в пару процентов несущественна, ведь все равно нагрузка на ФС будет основная.
Возникла проблема. Пишу на С++ Builder'e. Хотел сделать свою прогу более удобной, добавил объект MainMenu и перенес функции нажатия соотв. клавишь туда. Однако после переноса (если просто через Button'ы меню программы делать, все работает на Ура) одна кнопка после нажатия стала перекрашивать окно, т.е. оно становится каким-то нетаким, заголовок программы пропадает, кнопки (свернуть,развернуть и закрыть в заголовке) тоже, поле ввода текста на половину окрашивается черным(до того места до которого есть текст). Если нажать на заголовок программы то она закрывается. Ошибок не выдает. Повторюсь что если через Button обычый без MainMenu то все нормально (даже через маинменю код выполняет, но окно программы портит и нечего не видно толком)
Exile1985
18.09.2008, 10:22
Возникла проблема. Пишу на С++ Builder'e. Хотел сделать свою прогу более удобной, добавил объект MainMenu и перенес функции нажатия соотв. клавишь туда. Однако после переноса (если просто через Button'ы меню программы делать, все работает на Ура) одна кнопка после нажатия стала перекрашивать окно, т.е. оно становится каким-то нетаким, заголовок программы пропадает, кнопки (свернуть,развернуть и закрыть в заголовке) тоже, поле ввода текста на половину окрашивается черным(до того места до которого есть текст). Если нажать на заголовок программы то она закрывается. Ошибок не выдает. Повторюсь что если через Button обычый без MainMenu то все нормально (даже через маинменю код выполняет, но окно программы портит и нечего не видно толком)
было бы замечательно если бы ты код выложил, а лучше весь проект через файло обменник.
з.ы. да и бросай ты это гнилое дело писать в билдере на с++
з.ы. да и бросай ты это гнилое дело писать в билдере на с++ А ты подскажешь, как в Vc юзать Vcl? ))))
ак по мне - то разница в пару процентов несущественна, ведь все равно нагрузка на ФС будет основная. Но все равно по указателю получше будет, тут ты прав, но причина твоя явно надумана)
Но все равно по указателю получше будет, тут ты прав, но причина твоя явно надумана)
Ты сам себе ответил? :D
Ладно, ближе к делу. Просто возвращение целого вектора из функции довольно редкий стиль. Реально юзер не заметит этого, так как даже при худшем случае в 10к файлов мы лишний раз скопируем килобайт 100(10 символов на все про все). Для сегодняшнего дня это пустяки.
Хотя эту функцию можно еще ускорить, если использовать уникод-вариант.
Оптимизация - корень всех зол, но не стоит о ней забывать.
Хотя эту функцию можно еще ускорить, если использовать уникод-вариант. Я ее просто с AnsiString перевел, в билдере вообще с уникодом жопа )
Оптимизация - корень всех зол, но не стоит о ней забывать.
Почитай, тебе полезно будет: http://rsdn.ru/article/philosophy/Optimization.xml
Краткий смысл: оптимизировать нужно только критические места.
было бы замечательно если бы ты код выложил, а лучше весь проект через файло обменник.
Ок. Надеюсь на народе пойдет (http://narod.ru/disk/2665777000/prog_src.rar.html)? Ну если надо еще залью, только скажи сам куда. В архиве Исходники и готовый билд. Сам посмотришь, на кнопке и на др. кнопке в Меню одно и тоже действие на OnClick. Не суди строго за код, учился билдеру сам, писал сам не чего не принемая за базу. В уневерситете, вот в этом году поступил, будем изучать Delphi уже профессионально, но хотелось бы конечно MVS освоить, ну да ладно...не судьба.
Так же в архиве тестовый файл примерMTADMвSAMP.map . Загружешь его через программу (Файл->Открыть...) далее Конвертировать в...->MTA DM в SAMP или просто окне программы кнопка "Через простую кнопку все ОК".
O.mnenie
18.09.2008, 18:17
Я ее просто с AnsiString перевел, в билдере вообще с уникодом жопа )
Почитай, тебе полезно будет: http://rsdn.ru/article/philosophy/Optimization.xml
Краткий смысл: оптимизировать нужно только критические места.
да ! полезна
++Norton++
19.09.2008, 00:27
Постараюсь объяснить суть. Нужно написать функцию, которая принимала бы в качестве аргумента массив из нескольких слов (через пробел) которые бы находились в argv[0], argv[1] и тд. Что-то типа как в функции main(int argc, char *argv[]). Здесь запуская программу мы можем указать параметры, например:
./a.out hello world
Тогда argv[1]=hello argv[2]=world. Нужна примерно аналогичная функция, только чтобы принимала массив. Например:
...
int XFunction(char *x[]) {
printf("%s", x[1]);
printf("%s", x[2]);
return 0; }
int main() {
char buff[512];
gets(buff);
XFunction(buff);
return 0; }
Здесь запускаем программу, вводим, к примеру hello world, и XFunction нам выводит в качестве x[1] - hello, в качестве x[2] - world. Это как нибудь реально осуществить? Сколько не пытался, все время Segmentation Fault :(
Заранее спасибо!
Дорогой ++Norton++, очень хочу узнать твое мнение. Каким макаром компилятор так ловко преобразовал из char* в char**. Вот просто интересно... :confused:
Добавлено позже...
А вот еще очень интересный момент. x[2] бескомпромисно вылезло за размеры массива и так упорно пытается что-то вырвать с памяти. :eek:
PS: просто хорошее настроение. :)
идёшь циклом по содержанию файла,если пробел к примеру ставишь флаг и считаешь количество букв в слове(до след. пробела).Ну и если оно равно тому которое тебе нужно - сохраняешь.
UnPazz,
берем fstream. Определяем разделитель текстового файла. Объявляем один объект типа string и используем getline. Первый аргумент - объект fstream, второй объект string, третий - char разделитель. Организуем цикл. Проверочным условием будет метод eof() , угадайте какого объекта. Для определения длины используется функция-член класса string size().
Успехов.
каким образом можно найти слова определенной длины????
не имеет значения pascal/c/c++
пожалуйста. Регулярными выражениями: (\b[\w]{длина}\b)
De-visible
19.09.2008, 11:06
есть текстовый файл.
в нем, например, записан текст. текст состоит из слов разной длины.
каким образом можно найти слова определенной длины????
не имеет значения pascal/c/c++
пожалуйста.
---------
Регулярными выражениями: (\b[\w]{длина}\b)
---------
UnPazz, Если нужна инфа по регуляркам то вот:
Регулярные выражения (https://forum.antichat.ru/thread77603.html)
jawbreaker
19.09.2008, 11:39
UnPazz
Вот на С++ http://paste.pocoo.org/show/85661/
++Norton++
19.09.2008, 14:52
4p3
Да нет, компилятор ничего не преобразовывал :). То что я привел, я согласен бред полнейший. Это я привел просто для примера, т.к. правильно сделать не знаю пока как. Вот и обращаюсь за помощью
int rand;
srand((int)time(NULL));
rand = rand()%10;
Переменную переименуй из rand в rand_ и скомпилится.
int rand_;
4p3
Да нет, компилятор ничего не преобразовывал :). То что я привел, я согласен бред полнейший. Это я привел просто для примера, т.к. правильно сделать не знаю пока как. Вот и обращаюсь за помощью
вот выдалось время свободное
//---------------------------------------------------------------------------
#include <iostream>
#include <cstdlib>
#pragma hdrstop
using namespace std;
//---------------------------------------------------------------------------
void PrintVarArg(char** args, int nArgsCount)
{
for (int i = 0;i < nArgsCount;++i)
cout << args[i];
}
#pragma argsused
int main(int argc, char* argv[])
{
char *szArgs[] = {"dalek", "kaled"};
PrintVarArg(szArgs, 2);
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Есть такой вопросик: почему не работает ф-я CharToOem() в Visual Studio2008(C++9), тоесть ругается с ошибкой
error C2664: 'CharToOemW' : cannot convert parameter 1 from 'char [7]' to 'LPCWSTR'
В С++ 6 все отлично работало, а тут не хочет, может кто знает в чем тут проблема?
char z[] = "ПревеД";
CharToOem(z,z);
Юзай уникод, ВС9 заточена под уникод
wchar_t *wcString = L"Preved";
а немного по подробнее можно? как к примеру вывести на консольный экран:
char z[] = "ПревеД";
puts(z);
чтобы на консоле отображало ПревеД а не хз что. А то я попробовал то что ты написал, так там цифры одни.
И еще, можно както глобально делать перекодировку в ср1251 без CharToOem()? а то немного напряжно постоянно использовать эту ф-ю для каждой переменной.
И все же, как тут правильно использовать CharToOem()? интересно всетаки что они изменили.
horlyk, первый параметр CharToOem - источник, второй - приемник. Просто IMHO, я бы не совмещал их. Хз что может произойти, это, конечно, зависит от реализации.
Тем более NecroSoft MSDN вот что выдает
Return Value
The return value is always nonzero except when you pass the same address to lpszSrc and lpszDst in the wide-character version of the function. In this case the function returns zero and GetLastError returns ERROR_INVALID_ADDRESS.
Так... теперь немножко теории.
wchar_t это по сути дело тот же short. Потому, используя, cout ты получаешь на выходе цифры.
Теперь перейдет в "раздел как это решить".
использовать wcout. Он нормально вывод уникод. Можешь написать свою функцию, которая будет вызывать CharToOem и выводить. Можешь вызывать
setlocale(LC_ALL, "Russian");
она тоже ничего ;)
а лутше просто поставь в настройках проекта мульти байт код и должно работать.
чет я немного не догоняю, wcout тож не хочет русские букви выводить.
wchar_t z[7] = L"ПревеД";
wcout << z << endl;
пробовал и просто чар. Плз, напишите ктото маленький примерчик.
#include <iostream>
#include "stdafx.h"
using std::wcout;
int _tmain()
{
wchar_t *wcString = L"ненене";
setlocale(LC_ALL, "Russian");
wcout << L"дадада!" << L" " << wcString << std::endl;
_wsystem(L"pause");
return 0;
}
как прописать свою софтинку в автозагрузку? (нужен пример кода)
2bxN5
http://www.softholm.com/articles/register.html
тэк-с, вроде где-то пробегала пред моими глазами инфа о том, что это может сама консоль не поддерживать (русский язык имею ввиду)
:)
подключаем
#include <windows.h>
int main()
{
SetConsoleOutputCP(1251);
cout<<"Вот вам жырный пример "<<endl;
return 0;
}
как вывести число с ведущим нулем и степень десяти?
т.е. я юзаю модификатор %e, могут быть такие числа:
0.123E+001
5.123E+001
а мне нужно чтобы слева от точки был ноль всегда. Если это можно сделать модификатором вывода, подскажите:)
ronald, ты о 08 студио?
Кстати, 4p3, у меня всеравно код не заработал - ругался ошибкой...
zindi, после ввода твоего кода, вообще перестает существовать какая поддердка русского языка)
Даже стандартная надпись типа "Для продолжения нажмите любую клавишу" тоже абра кадаброй стала)
Larionich
23.09.2008, 01:24
как вывести число с ведущим нулем и степень десяти?
Насколько мне известно, printf не может выводить с ключом e или E дробное число не в стандартной форме ( не в a+q^t, 1<=a<10), ответ "нет", нельзя модификатором вывода сделать то, что ты захотел. А у тебя компилятор и выводит не в стандартной форме, ерунда получается. Если же обойтись без степени десятки, то функция (то же с флагом "e" можно написать)
printf("%13.3f", a); //минимальная ширина поля 13 символов, точность 3
Можно же, заняться математикой, побитово считывать переменную (типа float например, Си), 4 байта, 32 бита на всю; 1 бит под знак, 8 под порядок, 23 на мантиссу:
например 12345.67=(2^13)*1.507... 13 это порядок (он не представляется в самой переменной), (127+13) это смещенный порядок (так он представляется в самой переменной [ 127+порядок]) , мантиса это представление 0.507... в двоичном коде.
Если не ошибаюсь так : знак числа(1 бит) | порядок(8) | мантисса(23).
Информация интересная, то тебе она скорее всего не нужна.
ronald, ты о 08 студио?
Кстати, 4p3, у меня всеравно код не заработал - ругался ошибкой...
Тут нет телепатов. Код ошибки в студию
Все что я пишу, я обязательно прогоняю на компиляторе, так что вероятность ошибки исключена
08 не доверяю, хотя бы из-за std::cout ))) такшто не знаю насчёт 08
08 не доверяю, хотя бы из-за std::cout ))) такшто не знаю насчёт 08
а что с ним? у меня отлично работает
system("@chcp 1251 > nul"); для кодировки юзаю.
++Norton++
24.09.2008, 11:16
Задача в следующем, нужно написать функцию на C, которая бы считывала указанный текстовый файл и печатала его содержимое на экран. Как это можно сделать? Пытался так:
void catFile(char *s0, char *s1, char *s2) {
FILE *cfPtr;
char *rwfile;
if(strcmp(s0, "") && !strcmp(s1, "") && !strcmp(s2, "")) { /*cat file.name*/
if((cfPtr = fopen(s0, "r")) == NULL) puts("File could not be opened"); else {
while(!feof(cfPtr)) {
fread(rwfile, sizeof(char), 1, cfPtr);
}
if(!strcmp(rwfile,"")) { puts(rwfile); }
fclose(cfPtr);
}
}
но в ответ получал только Segmentation Fault :( Помогите пожалуйста разобраться!
Заранее спасибо!
Несколько вопросов
Как вытащить ip адрес приконектившегося клиента из SOCKADDR_IN после accept ?
Если CreateFile вызывается внутри потока и все дальнейший операции с файлом проходят внутри того же потока,то надо заполнять lpSecurityAttributes?Если оставить NULL будет работать или нет?
Если уже работает один поток в котором вызывалось WSAStartup ,то надо повторно вызывать ещё раз WSAStartup во 2м потоке если он запущен чуть позже 1го потока который ещё неокончил свою работу ?
Если CreateFile вызывается внутри потока и все дальнейший операции с файлом проходят внутри того же потока,то надо заполнять lpSecurityAttributes?Если оставить NULL будет работать или нет?
Он в 90% случаев равен NULL. Этот параметр определяет возможность наследования дескриптора другим процессом.
если оперируем еще и с параметром lpSecurityDescriptor, то можно настроить еще и права доступа.
++Norton++
24.09.2008, 15:43
Еще вопрос по С. Можно ли как нибудь сделать так, чтобы цикл while выполнялся до тех пор, пока пользователь не нажмет ctrl+c? Если да, то как?
Еще вопрос по С. Можно ли как нибудь сделать так, чтобы цикл while выполнялся до тех пор, пока пользователь не нажмет ctrl+c? Если да, то как?
если это консольное приложение под windows то при нажатии Ctrl-C оно автоматически завершит свою работу. Перехватить нажатие Ctrl-C можно с помощью функции API SetConsoleCtrlHandler.
не помню можно ли для консольного а для оконного:
user32.dll --> RegisterHotKey()
Пример на C# , ...там ВинАпи , такчто понять не трудно ...
http://forum.antichat.ru/showpost.php?p=588830&postcount=9
Данные с помощью ReadFile из бинарного файла,в цикле читаются в массив размером в 10мбайт.Вопрос вот в чем почему число которое возвращает sizeof(массив) не совпадаtn со значением которое возвращает ReadFile в lpNumberOfBytesRead ??
Данные с помощью ReadFile из бинарного файла,в цикле читаются в массив размером в 10мбайт.Вопрос вот в чем почему число которое возвращает sizeof(массив) не совпадаtn со значением которое возвращает ReadFile в lpNumberOfBytesRead ??
Т.е. ReadFile прочла меньше, чем должна была? Значит произошла к-либо ошибка. А сама функция что вернула (true/false)? Проверь с GetLastError что за ошибка возникла.
Т.е. ReadFile прочла меньше, чем должна была? Значит произошла к-либо ошибка. А сама функция что вернула (true/false)? Проверь с GetLastError что за ошибка возникла.
nNumberOfBytesToRead совпадает с возвращаемым значением в lpNumberOfBytesRead.А вот sizeof от буфера куда оно прочиталось возвращяет погоду на Марсе :mad: И
GetLastError 0 возвращяет.
nNumberOfBytesToRead совпадает с возвращаемым значением в lpNumberOfBytesRead.А вот sizeof от буфера куда оно прочиталось возвращяет погоду на Марсе :mad: И
GetLastError 0 возвращяет.
код в студию.
neprovad
24.09.2008, 21:34
возвращяет погоду на Марсе
Это Дэнвер, погода летная, даю добро на старт.
Вообще приводить надо бы весь код, от выделения памяти до GetLastError. А то мы тут все будем до второго пришествия гадать что это - нехватка озу, сбой в ос, неверное выделение памяти, кривая передача указателя функции чтения.
код в студию.
char *fnam=new char[1024*10];
char *ip=new char[1024];
CRITICAL_SECTION cs;
void thr(void *Pvoid)
{
SOCKET s;SOCKADDR_IN adr;DWORD rb;unsigned long ss,sz;int p=1;
//WSADATA wsd;WSAStartup(MAKEWORD(1,1),&wsd);
adr.sin_family=AF_INET;
adr.sin_port=htons(3060);
InitializeCriticalSection(&cs);
EnterCriticalSection(&cs);
adr.sin_addr.s_addr=inet_addr(ip);
LeaveCriticalSection(&cs);
s=socket(AF_INET,SOCK_STREAM,0);
connect(s,(sockaddr*)&adr,sizeof(adr));SetLastError(0);
HANDLE f=CreateFile(fnam,GENERIC_READ,0,NULL,OPEN_EXISTIN G,FILE_FLAG_RANDOM_ACCESS,0);
char *buf=new char[(1024*1024)*10];
DWORD e=GetFileSize(f,&ss);
if(e>0){sz=e;}if(e<1){sz=ss;}
if(sz<(1024*1024)*10)
{ReadFile(f,buf,sz,&rb,0);send(s,buf,strlen(buf),0);}
if(sz>(1024*1024)*10)
{
for(;;)
{
ReadFile(f,buf,(1024*1024)*10,&rb,0);
MessageBox(0,CurrToStr((int)rb).c_str(),"!!!",MB_OK);
MessageBox(0,CurrToStr((int)sizeof(buf)).c_str(),"!!!",MB_OK);
MessageBox(0,CurrToStr((int)GetLastError()).c_str( ),"!!!",MB_OK);
sz=sz-(1024*1024)*10;send(s,buf,rb,0);
memset(buf,NULL,(1024*1024)*10);
SetFilePointer(f,((1024*1024)*10)*p,NULL,FILE_BEGI N);p++;
if(sz<(1024*1024)*10){ReadFile(f,buf,sz,&rb,0);send(s,buf,strlen(buf),0);break;}
}
}
}
дык buf - это указатель. он занимает 4(8) байтов. подробней - читай МСДН по поводу sizeof(). вот исчо исходник там есть в качестве примера
Example
// expre_sizeof_Operator.cpp
// compile with: /EHsc
#include <iostream>
size_t getPtrSize( char *ptr )
{
return sizeof( ptr );
}
using namespace std;
int main()
{
char szHello[] = "Hello, world!";
cout << "The size of a char is: "
<< sizeof( char )
<< "\nThe length of " << szHello << " is: "
<< sizeof szHello
<< "\nThe size of the pointer is "
<< getPtrSize( szHello ) << endl;
}
Output
The size of a char is: 1
The length of Hello, world! is: 14
The size of the pointer is 4
#include <iostream>
#include "stdafx.h"
using std::wcout;
int _tmain()
{
wchar_t *wcString = L"ненене";
setlocale(LC_ALL, "Russian");
wcout << L"дадада!" << L" " << wcString << std::endl;
_wsystem(L"pause");
return 0;
}
В общем ошибка такая:
error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
когда убрал _t и оставил просто main, то ошибка исчезла.
При компиляции ошибок небыло, а вот при дебаге или запуске...
спс за помощь :)
дык buf - это указатель. он занимает 4(8) байтов. подробней - читай МСДН по поводу sizeof(). вот исчо исходник там есть в качестве примера
ну если sizeof() неподходит ,то что вместо него использовать?
horlyk
#include "stdafx.h" убери и в настройках отключи.
Вот невезет ведь :( пытаюсь использовать вместо sizeof _msize и получаю
[Linker Error] Error: Unresolved external '__msize' referenced from C:\COD\CD\APP\UNIT1.OBJ
отключил еще при первой компиляции :) меня сразу выругало за stdafx.
спс :)
ну если sizeof() неподходит ,то что вместо него использовать?
char *buf=new char[(1024*1024)*10];
....
ReadFile(f,buf,sz,&rb,0)
....
MessageBox(0,CurrToStr((int)sizeof(buf)).c_str(),"!!!",MB_OK);
Зачем вообще тут sizeof? Я чего-то недопонимаю? Точное количество записанных в buf байт в переменной rb. Зачем извращать-то там, где не надо? Что мешает это значение использовать?
if(sz<(1024*1024)*10){ReadFile(f,buf,sz,&rb,0);send(s,buf,strlen(buf),0);break;}
}
strlen(buf) - тоже самое. Зачем, когда rb уже содержит нужное значение?
if(sz<(1024*1024)*10){ReadFile(f,buf,sz,&rb,0);send(s,buf,rb,0);break;}
}
Да и потом strlen может херню вернуть ибо вы пишите
Данные с помощью ReadFile из бинарного файла
http://www.cplusplus.com/reference/clibrary/cstring/strlen.html
The length of a C string is determined by the terminating null-character
....
У тебя ноль где-нибудь в середине буфера будет и будет не айс ведь. половину только отошлешь
Да с отправкой я уже давно разобрался.Просто проблема с приемом ведь в последнем куске по любому прийдет не (1024*1024)*10 байт а меньше.Вот и надо как то определить сколько при приеме последнего куска в буфере оказывается. :(
2_nic
recv Function
...
If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.
http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx
У тебя recv вернет количесво принятых байт.
Почему не компилируется?
# include <studio.h>
int main(){
float x;
float a = 1-2*x+3*x*x-4*x*x*x;
printf ("x=?\n");
scanf ('%s', &a);
printf('x = %d', a);
return 0;
}
# include <stdio.h>
И кавычки двойные везде, не одинарные
Да даже если и скомпилить, то бред какой-то..
float x;
float a = 1-2*x+3*x*x-4*x*x*x;
2008-ая студия такое не скомпилит) Проверено сегодня лично!
# include <stdio.h>
И кавычки двойные везде, не одинарные
Спасибо! Глупая ошибка вышла.
А почему вот в этом коде получается всегда единица?
#include <stdio.h>
int main(){
float x;
float a=1-2*x+3*x*x-4*x*x*x;
printf ("Enter x, please:");
scanf ("%f",&x);
printf ("%f", a);
return 0;
}
Извините за глупый вопрос. Уже разобрался.
Larionich
28.09.2008, 20:06
Я понимаю так, что тебе по x нужно вычислить зн-ние функции a(x):
#include <stdio.h>
int main(){
float x,a;
printf("x=?\n");
scanf ("%f", &x);
a=1-2*x+3*x*x-4*x*x*x;
printf("a = %f\n", a);
return 0;
}
А почему вот в этом коде получается всегда единица?
float x;
float a=1-2*x+3*x*x-4*x*x*x;
Не инициализировал X (ввод из консоли например), а считаешь зн-ние a(x), неправильно.
upd. вводим (x); float a=1-2*x+3*x*x-4*x*x*x; выводим(a). А в gcc4.3 все хорошо компилиться.
У меня следующий вопрос:
Когда выдаёшь на экран число float, то он пишет например: 5.0000000
А как сделать, чтобы он писал 5, если после запятой нет цифр???
В питоне я знаю это делается приведнием переменной к сторке. А вот в С не знаю.
Помогите!
Заренее благодарен.
И ещё один вопрос:
Как обозначается в С возведение в степень?
printf("%.0f",float_var);2. pow(x,y); из math.h
Larionich
28.09.2008, 21:11
Когда выдаёшь на экран число float, то он пишет например: 5.0000000. А как сделать, чтобы он писал 5, если после запятой нет цифр???
Можно применить со4ный модификатор то4ности. 10 симнолов- на всё число, 3- на дробную часть:
printf("%10.3f", x);
Можно использовать операторы приведение типов(c ,c++):
float x=5.25626;
int a;
a=int(x);
В C++ существуют операторы const_cast и static_cast. Static_cast- это неполиморфное приведение:
float x=5.25626;
int a;
a=static_cast<int> (x);
updКак обозначается в С возведение в степень?
Можно так как написал FrMn, а можно так же result = exp(power*ln(base));
Здраствуйте. Подскажите пожалуйста:
Делаю программу в Borland Turbo C++, пытаюсь сохранить файл с именем, которое уже изспользуеться, через SaveDialog. При сохранении прога просто затирает старый файл. А как сделать, что бы после того, как нажал "Сохранить", прога проверяла есть ли уже файл с таким именем и, если есть, выводила диалоговое окно типа "Заменить", "отменить" и т.д.?
Ну проверь, существует ли файл. Диалог то тебе имя файла возвращает.
программа закрывается сильно быстро, что я неуспеваю посмотреть хелоу ворлд.
вот код:
#include <iostream.h>
int main()
{
cout << "Hello World!\n";
char response;
std::cin >> response;
return 0;
}
компилятор VS2008 (С++)
это так и должно быть? или я туплю где то?
getchar(); поставь и смотри на здоровье :)
ToniKapuchon
30.09.2008, 00:46
#include <conio.h>
и getch(); добавь в конец кода!!
Не надо использовать <conio.h>. Это зло.
Сколько советов. =)
Господа, зачем лишние функции? Нажимайте Ctrl+F5 вместо F5 и прибудет с вами сила.
буду дома попробую, вот только почему в книге тогда дают неверный пример.
ппц... хелоуворлда всеравно нет, что теперь не так?
http://s59.radikal.ru/i166/0809/ab/90ecf42d195c.jpg
M@X Dr.Akyla
30.09.2008, 19:27
если ты пока не разбираешься в языке пиши так:
#include <iostream.h>
int main()
{
cout << "Hello\n";
int r; // обьявили переменную r типа int
cin >> r; // ждет вводы переменной, после ввода выполняется оператор return
return 0;
}
а уже потом будешь с getch(); разбираться.
С ним это будет выглядеть так:
#include <iostream.h>
#include <conio.h>
int main()
{
cout << "Hello\n";
getch();
return 0;
}
Да, а потом уже и asm вставками можно ожидание нажатия начать делать =\
jawbreaker
30.09.2008, 19:34
Зачем вам getch, одумайтесь, люди! Есть же cin.get() который делает то же самое!!!
#include <iostream>
using namespace std;
int main()
{
cout << "Hello\n";
cin.get();
return 0;
}
И всё!
жжете)
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
cout << "PreweDD\n";
system("PAUSE");
return 0;
}
дайте кто-нибудь простой исходник на C++
для перехвата консоли, обыскал весь инет, ничего не нашел
а как в ВС2008 сделать что бы нумерация строк была?
а как в ВС2008 сделать что бы нумерация строк была?
Положение курсора показывается в статусбаре внизу, там можно узнать номер строки.
А так чтобы прямо нумерация - не знаю, скорее всего нельзя.
jawbreaker
02.10.2008, 13:47
[D1mka]
Tools -> Options -> Text Editor -> C/C++ -> General -> на вкладке Display поставь галочку у Line Numbers.
дайте кто-нибудь простой исходник на C++
для перехвата консоли, обыскал весь инет, ничего не нашел
плохо искал
#include "proc.h"
CIORedirection::CIORedirection()
{
ZeroFields();
wait = 60000;
}
CIORedirection::~CIORedirection()
{
Close();
}
CIORedirection::CIORedirection(const CIORedirection&)
{
}
void CIORedirection::operator = (const CIORedirection&)
{
}
void CIORedirection::ZeroFields()
{
m_hNewStdIn = m_hNewStdOut = m_hReadStdOut = m_hWriteStdIn = NULL;
::ZeroMemory((void*)&m_processInfo, sizeof(PROCESS_INFORMATION));
::ZeroMemory((void*)&m_startupInfo, sizeof(STARTUPINFO));
::ZeroMemory((void*)&m_secAttributes, sizeof(SECURITY_ATTRIBUTES));
::ZeroMemory((void*)&m_secDescriptor, sizeof(SECURITY_DESCRIPTOR));
}
BOOL CIORedirection::IsWinNT()
{
OSVERSIONINFO osverinfo;
osverinfo.dwOSVersionInfoSize = sizeof(osverinfo);
::GetVersionEx(&osverinfo);
return (osverinfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
void CIORedirection::InitSecurity()
{
if (IsWinNT())
{
::InitializeSecurityDescriptor(&m_secDescriptor,
SECURITY_DESCRIPTOR_REVISION);
::SetSecurityDescriptorDacl(&m_secDescriptor, TRUE, NULL, FALSE);
m_secAttributes.lpSecurityDescriptor = &m_secDescriptor;
}
else m_secAttributes.lpSecurityDescriptor = NULL;
m_secAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
m_secAttributes.bInheritHandle = TRUE;
}
void CIORedirection::Create(const char *pAppName, char *pCmdLine, char *CurrentDirectory)
{
if (m_processInfo.hProcess)
return;
InitSecurity();
if (!::CreatePipe(&m_hNewStdIn, &m_hWriteStdIn, &m_secAttributes, 0))
return;
if (!::CreatePipe(&m_hReadStdOut, &m_hNewStdOut, &m_secAttributes, 0))
{
CloseHandle(m_hNewStdIn);
CloseHandle(m_hWriteStdIn);
return;
}
::GetStartupInfo(&m_startupInfo);
m_startupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
m_startupInfo.wShowWindow = SW_HIDE;
m_startupInfo.hStdOutput = m_hNewStdOut;
m_startupInfo.hStdError = m_hNewStdOut;
m_startupInfo.hStdInput = m_hNewStdIn;
if (!::CreateProcess(pAppName, pCmdLine, NULL, NULL, TRUE,
CREATE_NEW_CONSOLE, NULL, CurrentDirectory, &m_startupInfo, &m_processInfo))
{
Close();
return;
}
WaitForSingleObject(m_processInfo.hProcess, wait);
}
DWORD CIORedirection::GetExitCode() const
{
DWORD dwExitCode = 0;
GetExitCodeProcess(m_processInfo.hProcess, &dwExitCode);
return dwExitCode;
}
void CIORedirection::Terminate()
{
DWORD dwExitCode = GetExitCode();
TerminateProcess(m_processInfo.hProcess, dwExitCode);
}
void CIORedirection::Close()
{
if (GetExitCode() == STILL_ACTIVE) Terminate();
if (m_processInfo.hProcess)
{
::CloseHandle(m_processInfo.hThread);
::CloseHandle(m_processInfo.hProcess);
}
if (m_hNewStdIn) ::CloseHandle(m_hNewStdIn);
if (m_hNewStdOut) ::CloseHandle(m_hNewStdOut);
if (m_hReadStdOut) ::CloseHandle(m_hReadStdOut);
if (m_hWriteStdIn) ::CloseHandle(m_hWriteStdIn);
ZeroFields();
}
BOOL CIORedirection::Read(char *lpBuf,
DWORD dwBufSize,
DWORD *pBytesRead)
{
unsigned long avail;
BOOL bRes = ::PeekNamedPipe(m_hReadStdOut,lpBuf,dwBufSize,pByt esRead,&avail,NULL);
if (!bRes)
return FALSE;
if (*pBytesRead != 0)
{
bRes = ::ReadFile(m_hReadStdOut,lpBuf,dwBufSize,pBytesRea d,NULL);
}
return bRes;
}
BOOL CIORedirection::Write(const char *lpBuf,
DWORD dwBufSize,
DWORD *pBytesRead)
{
WriteFile(m_hWriteStdIn, lpBuf, dwBufSize, pBytesRead, NULL);
Read((char *)lpBuf, dwBufSize, pBytesRead);
return (::WriteFile(m_hWriteStdIn, "\n", dwBufSize, pBytesRead, NULL));
}
void CIORedirection::SetWait(int milliseconds)
{
wait = milliseconds;
}
int FileExists(char *directory, char *filename)
{
WIN32_FIND_DATAA dataFind;
HANDLE hFind;
hFind = FindFirstFileA(filename, &dataFind);
if(hFind == INVALID_HANDLE_VALUE)
{
char abs_path[MAX_PATH];
if(directory[strlen(directory)-1] == '\\')
sprintf(abs_path, "%s%s", directory, filename);
else
sprintf(abs_path, "%s\\%s", directory, filename);
hFind = FindFirstFileA(abs_path, &dataFind);
if(hFind == INVALID_HANDLE_VALUE)
{
if(strlen(filename) == 3 && filename[1] == ':')
{
DWORD uDrive = toupper(filename[0]) - 'A';
uDrive = 1 << uDrive;
if(GetLogicalDrives() & uDrive)
return 1;
else
return 0;
}
else
return 0;
}
FindClose(hFind);
return 2;
}
FindClose(hFind);
return 1;
}
CMD::CMD()
{
GetCurrentDirectoryA(MAX_PATH, cur_dir);
sys_env = (char *)malloc(2000);
memset(sys_env, 0, 2000);
GetEnvironmentVariableA("Path", sys_env, 2000);
env_pos = strlen(sys_env);
sys_env[env_pos] = ';';
memcpy(sys_env+env_pos+1, cur_dir, strlen(cur_dir));
SetEnvironmentVariableA("Path", sys_env);
}
void CMD::SetWait(int milliseconds)
{
console.SetWait(milliseconds);
}
void CMD::Exec(char *command, char *outbuf, int bufsize)
{
if(!memcmp(command, "cd ", 3))
{
char buffer[MAX_PATH+3];
int offset = 0, len, res;
strcpy(buffer, command);
offset = 3;
if(buffer[offset] == '"')
offset++;
len = strlen(buffer)-1;
if(buffer[len] == '"')
{
buffer[len] = 0;
len--;
}
if(buffer[len] == '\\' && buffer[len-1] != ':')
buffer[len] = 0;
res = FileExists(cur_dir, &buffer[offset]);
if(!res)
goto m1;
if(res == 1)
strcpy(cur_dir, &buffer[offset]);
else if(res == 2)
{
strcat(cur_dir, "\\");
strcat(cur_dir, &buffer[offset]);
}
sys_env[env_pos+1] = 0;
strcat(sys_env, cur_dir);
SetEnvironmentVariableA("Path", sys_env);
goto m1;
}
char filename[MAX_PATH];
GetSystemDirectory(filename, MAX_PATH);
sprintf(filename, "%s\\cmd.exe /c %s", filename, command);
console.Create(0, filename, cur_dir);
console.Read(outbuf, bufsize, (DWORD *)&bufsize);
console.Close();
outbuf += bufsize;
m1:
sprintf(outbuf, "%s>", cur_dir);
}
юзать примерно так:
char buffer[10000];
memset(buffer, 0, sizeof(buffer);
cmd.Exec("dir", buffer, sizeof(buffer));
в buffer будет результат выполнения команды. собсна вставляешь вместо "dir" путь к консольной проге и в путь
Имеется символьный массив содержащий сточку "Иванов Иван Иванович"
Пользователь вводит "Иван" и выполняется поиск этого слова в исходной фразе, и если слово там найдено об этом сообщается пользователю.
Собственно как этот поиск реализовать? Может есть какая-нибудь функция для работы со строками подходящая под этот пример?
Сделал на лабе все проверки в циклах - препод сказал мол сильно громоздко =(
jawbreaker
02.10.2008, 16:48
Для символов есть стандартный контейнер - string, надо написать #include <string>. Потом просто используешь стандартный метод find для поиска подстроки. Подробности смотри тут (http://www.cplusplus.com/reference/string/string/find.html)
вот по быстрому набросал.
#include<stdio.h>
#include<string.h>
int main(int argc , char *argv[])
{
char src[] = "Jack Test Ivanov Mihail";
char *pch;
pch = strtok(src ," ");
while(1)
{
pch = strtok( NULL , " " );
if(pch == NULL)
{
break;
}
if( !strcmp(pch , "Test") )
{
printf("Found!\n");
break;
}
}
return 0;
}
Почему он не правильно вычисляет t1 и t2?
# include <stdio.h>
# include <math.h>
int main() {
float a;
float b;
float c;
float d;
float t;
float t1;
float t2;
float x1;
float x2;
float x1t1;
float x2t1;
float x1t2;
float x2t2;
printf("Enter a, please: ");
scanf("%f", &a);
printf("Enter b, please: ");
scanf("%f", &b);
printf("Enter c, please: ");
scanf("%f", &c);
d=pow(b,2)+4*a*c;
if (d<0) {
printf("D<0 => this equation has not radicals");
} else if (d=0) {
t=-b/2*a;
if (t<0) {
printf("X^2 < 0 => this equation has not radicals");
} else {
x1=pow(t,0.5);
x2=-pow(t,0.5);
printf("X1 = %f", x1);
printf("X2 = %f", x2);
}
} else {
t1=(-b+pow(d,0.5))/2*a;
t2=(-b-pow(d,0.5))/2*a;
if (t1>=0 and t2>=0) {
x1t1=pow(t1,0.5);
x2t1=-pow(t1,0.5);
x1t2=pow(t2,0.5);
x2t2=-pow(t2,0.5);
printf("X1 = %f", x1t1);
printf("X2 = %f", x2t1);
printf("X3 = %f", x1t2);
printf("X4 = %f", x2t2);
} else if (t1>=0 and t2<0) {
x1t1=pow(t1,0.5);
x2t1=-pow(t1,0.5);
printf("X1 = %f", x1t1);
printf("X2 = %f", x2t1);
} else if (t1<0 and t2>=0) {
x1t2=pow(t2,0.5);
x2t2=-pow(t2,0.5);
printf("X1 = %f", x1t2);
printf("X2 = %f", x2t2);
} else if (t1<0 and t2<0)
printf("This equation has not radicals");
}
}
Larionich
03.10.2008, 00:47
Vip1.Инициализируй переменные так
float a,b,c,d,t,t1,t2,x1,x2,x1t1,x2t1,x1t2,x2t2;
2.Надо условие задавать не так
else if (d=0) А так
else if (d==0)
3.Пишешь and в сях. Забудь про него. Есть оператор && (and) и || (or) и ^ (xor), а оператора ^^ нет, это смайлик.
else if (t1>=0 and t2<0) Замени на
else if ((t1>=0) && (t2<0))
4.Ты не поверишь, но вместо
printf("X1 = %f", x1); printf("X2 = %f", x2); Можно написать
printf("X1 = %fX2 = %f", x1, x2);
5.И вообще, t=-b/(2*a) и t=-b/2*a это не одно и тоже. Когда ты пишешь t=-b/2*a это значит t=(-b/2)*a.
Почему он не правильно вычисляет t1 и t2?
Плюс не написал, что должна считать программа. Если это корни 4ст, метод Феррари тебе в руки.
не получается скомпилить
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Hello, World!", "Example", MB_OK);
return 1;
}
в результате я получаю 2 ошибки
error C2872: 'MessageBoxA' : ambiguous symbol
De-visible
03.10.2008, 15:17
http://en.allexperts.com/q/C-1040/message-box.htm
http://www.makak.ru/2008/03/10/messagebox-%E2%80%94-kak-vyvesti-okoshko-s-soobshheniem-na-c/
http://msdn.microsoft.com/en-us/library/aa381915(VS.85).aspx
De-visible
03.10.2008, 15:17
перенес тему сюда...
Можно как то узнать какие существуют корневые разделы реестра в системе(hkey_users,hkey_current_user и т.д.)?Или можно только методом тыка перебрать все возможные названия на предмет их существования в реестре?
Хм, ульи всегда стандартны.( Конечно же если ты имеешь в виду именно ульи. типо HKLM, HKCU,HKCC,HKCR, HKU)
Задача следующая: При вводе четырёхзначного числа, нужно выяснить есть ли там одинаковые цифры. В питоне я это сделал следующим образом: превратил вводимое число в список, а затем сравнил все элементы списка. А вот как разбить число по цифрам в С?
чото типа того
DWORD n=123456,i=0;
char asd[100500];
while (n!=0)
{
asd[i]=n%10;
n/=10;
i++;
}
чото типа того
DWORD n=123456,i=0;
char asd[100500];
while (n!=0)
{
asd[i]=n%10;
n/=10;
i++;
}
Честно говоря ВООБЩЕ не понимаю, что тут делается. Если не трудно опишите хотя бы кратко, что делеют эти строки (особенно первые две)?
возьми любую книжку по си, где объясняются основы синтаксиса, и почитай.
Погуглил и нашёл вот такую функцию:
# include <stdio.h>
# include <stdlib.h>
int main() {
int n;
char n0;
printf("Enter n, please:");
scanf("%f", n);
itoa(n, n0, 10);
printf("%s", n0);
}
Но вот только не пойму почему скомпиленная программа зависает.
И ещё не могу понять, как может строка быть в какой-то системе исчисления (у меня в десятичной)? Ведь это же не число?
Погуглил и нашёл вот такую функцию:
# include <stdio.h>
# include <stdlib.h>
int main() {
int n;
char n0;
printf("Enter n, please:");
scanf("%f", n);
itoa(n, n0, 10);
printf("%s", n0);
}
Но вот только не пойму почему скомпиленная программа зависает.
И ещё не могу понять, как может строка быть в какой-то системе исчисления (у меня в десятичной)? Ведь это же не число?
И для чего интересно такой код может понадобиться?
А что по-твоему делает вот эта строчка:
scanf("%f", n);
?
vikseriq
04.10.2008, 16:08
Делай так:
1 читаешь строку функцией cin либы iostream
2 делаешь цикл:
2.1 для i=1 до длины строки
2.2 для j=i до конца строки.
3 в цикле проверка, если str[i]=str[j], то есть одинаковые символы.
Вот и все.
И для чего интересно такой код может понадобиться?
Это часть кода. Программа должна определить, есть ли в четырёхзначном числе одинаковые цифры.
Делай так:
1 читаешь строку функцией cin либы iostream
2 делаешь цикл:
2.1 для i=1 до длины строки
2.2 для j=i до конца строки.
3 в цикле проверка, если str[i]=str[j], то есть одинаковые символы.
Вот и все.
А эта библиотека и в С есть? а то в Wikipedia написано, что это библиотека из С++.
vikseriq
04.10.2008, 16:20
var a:string; i,j:byte;
begin
readln(a);
for i:=1 to length(a) do
for j:=i to length(a) do begin
if a[i]=a[j] then begin
writeln('Odinakovo');
halt;
end;
end;
writeln('neodinakovo');
end .
Это на паскале, ибо си я не знаю на 10, а компилятора под рукой нет. суть уловил, надеюсь.
jawbreaker
04.10.2008, 17:38
Как определить есть ли в четырехзначном числе одинаковые цифры???
#include <stdio.h>
int main()
{
int a;
scanf("%d\n", &a);
int a3 = (a/1000)%10;
int a2 = (a/100)%10;
int a1 = (a/10) % 10;
int a0 = a % 10;
if((a0 == a1) && (a1 == a2) && (a2 == a3))
printf("Equal\n");
else
printf("Not equal\n");
return 0;
}
И всё!
Хм, ульи всегда стандартны.( Конечно же если ты имеешь в виду именно ульи. типо HKLM, HKCU,HKCC,HKCR, HKU)
Мне тогда не совсем понятен смысл ф-ций RegOpenCurrentUser,RegOpenUserClassesRoot.В описание последней "Retrieves a handle to the HKEY_CLASSES_ROOT key for the specified user." Как тогда понимать фразу "key for the specified user" если "ульи всегда стандартны" ?
Всем доброго времени суток. Помогите, плиз, подружить Builder с wpcap'ом :)
Пытаюсь сделать вывод инфы в Memo-поле. Вот исходник:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <winsock.h>
#include <time.h>
#define HAVE_REMOTE
#include "inc/pcap.h"
#include "inc/remote-ext.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma comment(lib,"wpcap.lib")
#pragma comment(lib,"packet.lib")
TForm1 *Form1;
TMemo *Memo1;
typedef struct ip_address{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;
/* IPv4 header */
typedef struct ip_header{
u_char ver_ihl; // Version (4 bits) + Internet header length (4 bits)
u_char tos; // Type of service
u_short tlen; // Total length
u_short identification; // Identification
u_short flags_fo; // Flags (3 bits) + Fragment offset (13 bits)
u_char ttl; // Time to live
u_char proto; // Protocol
u_short crc; // Header checksum
ip_address saddr; // Source address
ip_address daddr; // Destination address
u_int op_pad; // Option + Padding
}ip_header;
/* UDP header*/
typedef struct udp_header{
u_short sport; // Source port
u_short dport; // Destination port
u_short len; // Datagram length
u_short crc; // Checksum
}udp_header;
/* prototype of the packet handler */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
u_int netmask;
char packet_filter[] = "ip and udp";
struct bpf_program fcode;
/* Retrieve the device list */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
Memo1->Lines->Add("Error in pcap_findalldevs:" + IntToStr(errbuf));
exit(1);
}
/* Print the list */
inum = 2;
/* Jump to the selected adapter */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
/* Open the adapter */
if ((adhandle= pcap_open(d->name, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf)) == NULL)
{
Memo1->Lines->Add("Unable to open the adapter.");
pcap_freealldevs(alldevs);
exit(1);
}
/* Check the link layer. We support only Ethernet for simplicity. */
if(d->addresses != NULL)
netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
else
netmask=0xffffff;
//compile the filter
if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )
{
Memo1->Lines->Add("Unable to compile the packet filter. Check the syntax.");
pcap_freealldevs(alldevs);
exit(-1);
}
if (pcap_setfilter(adhandle, &fcode)<0)
{
Memo1->Lines->Add("Error setting the filter.");
pcap_freealldevs(alldevs);
exit(-1);
}
pcap_freealldevs(alldevs);
pcap_loop(adhandle, 0, packet_handler, NULL);
}
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
TForm *Form1;
ip_header *ih;
udp_header *uh;
u_int ip_len;
u_short sport,dport;
ih = (ip_header *) (pkt_data + 14); //length of ethernet header
/* retireve the position of the udp header */
ip_len = (ih->ver_ihl & 0xf) * 4;
uh = (udp_header *) ((u_char*)ih + ip_len);
/* convert from network byte order to host byte order */
sport = ntohs( uh->sport );
dport = ntohs( uh->dport );
/* print ip addresses and udp ports */
Memo1->Lines->Add(ih->saddr.byte1 + ih->saddr.byte2 + ih->saddr.byte3 + ih->saddr.byte4);
}
//---------------------------------------------------------------------------
При нажатии на Button прога "зависает". Если сделать трассировку (F7/F8), то билдер ругается на
Memo1->Lines->Add(ih->saddr.byte1 + ih->saddr.byte2 + ih->saddr.byte3 + ih->saddr.byte4);
В чем ошибка?
Требуется создать двумерный массив заданной длины. Срочно !
#define ROW 5;
#define COL 5;
void main() {
int a[ROW] [COL];
}
:) ...
Larionich
04.10.2008, 19:53
Требуется создать двумерный массив заданной длины. Срочно !
Двумерный динамический создавай так:int rows, cols;
cin >> rows >> cols;
int **pMass = new int *[rows];
for (int i = 0; i < rows; i++)
pMass[i] = new int[cols];
Обращаться например так:
Temp=Mass[i][j];
Можно воспользоваться стандартными контейнерами:
vector < vector<int> > Mass (sizecol, vector <int> (sizerow) );
... билдер ругается на
Memo1->Lines->Add(ih->saddr.byte1 + ih->saddr.byte2 + ih->saddr.byte3 + ih->saddr.byte4);
В чем ошибка?
вроде как Memo1->Lines->Add строку выводит а ты туда пишешь число. Попробуй функцию inet_ntoa, она возвращает IP-адрес в виде ANSIZ строки с точками
вроде как Memo1->Lines->Add строку выводит а ты туда пишешь число. Попробуй функцию inet_ntoa, она возвращает IP-адрес в виде ANSIZ строки с точками
Не. Он в любом случае ругается, даже если я туда строку вставлю...
:D "Погуглил я и нашёл такую функцию" int main() :D
Как определить есть ли в четырехзначном числе одинаковые цифры???
#include <stdio.h>
int main()
{
int a;
scanf("%d\n", &a);
int a3 = (a/1000)%10;
int a2 = (a/100)%10;
int a1 = (a/10) % 10;
int a0 = a % 10;
if((a0 == a1) && (a1 == a2) && (a2 == a3))
printf("Equal\n");
else
printf("Not equal\n");
return 0;
}
И всё!
Гениально! Большое спасибо! Это решение гораздо проще, чем я там мудрил.
Спасибо!
Помогите, плиз, подружить Builder с wpcap'ом
Пытаюсь сделать вывод инфы в Memo-поле.
Если я вместо последнего Memo1->Lines->Add, делаю ShowMessage(AnsiString(ih->saddr.byte1));
То спустя какое-то время выскакивает-таки мое окошко...правда приходится много раз на "ОК" нажимать...
приходится много раз на "ОК" нажимать...
тогда попробуй так, рано или поздно получится;):
Memo1->Lines->Add(IntToStr(ih->saddr.byte1)+"."+IntToStr(ih->saddr.byte2)+"." +IntToStr(ih->saddr.byte3)+"."+IntToStr(ih->saddr.byte4));
или так:
char buf[64];
...
wsprintf(buf, "%u.%u.%u.%u", ih->saddr.byte1,ih->saddr.byte2,ih->saddr.byte3,ih->saddr.byte4);
Memo1->Lines->Add(AnsiString(buf));
или даже так
Memo1->Lines->Add(AnsiString(inet_ntoa(*(struct in_addr*)&ih->saddr))));
под рукой билдера нет, но что-нить из этого точно должно работать :)
Доброго времени суток.
Как в MFC приложение добавить красочный 32-битн. тулбар? (заранее нарисован)
По дефолту в VisualStudio2008 ставится 8 бит и все мои попытки нарисовать прикольный тулбар и импортировать его в существующий проект сводились к тому что изображение с 32-х битного становилось 8-битн..
Спасибо.
под рукой билдера нет, но что-нить из этого точно должно работать :)
При любой операцией с Memo, вылетает эксепшн. ShowMessage() норм работает, выводит мне ИП....
Прошелся еще раз трассировкой заметил одну вещь, очень долго думает над строчкой:
pcap_loop(adhandle, 0, packet_handler, NULL);
MaSTeR GэN
05.10.2008, 13:22
хм.. не кто случайно не подскажет как можно получить листинг файлов в директории на C++ ?
findfirstfile, findnextfile
MaSTeR GэN
05.10.2008, 13:44
2galiaff а можно немного поподробнее что за библиатека и пример использования если конечно не затрудит ! Заранее спасибо :)и желательно для консольного приложения :)
2galiaff а можно немного поподробнее что за библиатека и пример использования если конечно не затрудит ! Заранее спасибо :)и желательно для консольного приложения :)
Воспользуйся поиском. Товарищ nerezus пару недель назад приводил пример.
Вот пример поиска, тока я не помню где я его нашел:
void FindDir(char *path,char *mask, char file[])
{
WIN32_FIND_DATA wfd;
HANDLE hfound;
char newpath[MAX_PATH];
char fpath[MAX_PATH];
char pathifile[MAX_PATH]; //полный путь до файла
char delpath[MAX_PATH];
strcpy(fpath,path);
strcat(fpath,"\\");
strcpy(delpath,fpath);
strcat(fpath,mask);
if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE)
{
if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))
{
//нашли первый файл в папке path
//
printf("Error: %d\n", GetLastError());
}
while(FindNextFile(hfound,&wfd))
{
if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))
{
// файл в папке path
// delpath - папка, с которой начинается реккурсия
// wfd.cFileName - имя найденного файла
// копируем строку delpath в pathifile
strcpy(pathifile, delpath);
// прибавляем к строке pathifile значение
// переменной wfd.cFileName - имя файла
strcat(pathifile, wfd.cFileName);
if (strstr(pathifile, file) != NULL)
{
// send(sd, pathifile, strlen(pathifile), 0);
strcat(tmp, pathifile);
strcat(tmp, "\n");
}
// делаем что-либо с найденным файлом
}
}
}
FindClose(hfound);
//поиск файлов закончили, теперь ищем подпапки
strcpy(fpath,path);
strcat(fpath,"\\*.*");
if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE)
{
if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))
{
strcpy(newpath,path);
strcat(newpath,"\\");
strcat(newpath,wfd.cFileName);
FindDir(newpath,mask, file, sd); //Рекурсивный вызов
}
while(FindNextFile(hfound,&wfd))
{
if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)&&strcmp(wfd.cFileName,"..")&&strcmp(wfd.cFileName,"."))
{
strcpy(newpath,path);
strcat(newpath,"\\");
strcat(newpath,wfd.cFileName);
FindDir(newpath,mask, file, sd); //Рекурсивный вызов
}
}
}
}
(c) чье_то_но_не_мое
Что нужно добавить в код, чтобы Memo1 был виден в моей функции?
Если я внутри своей функции делаю:
TMemo1 *Memo1;
то получаю: Undefined symbol 'TMemo1'
народ, подскажите как заставить консольку создать новую директорию? тоесть мне нужно чтоб программа создавала папку с определенным именем, которое заранее известно. А потом после этого удалить директорию. И еще, как можно сделать чтоб из переменной класса стринг(и чар) можно текст использовать в виде имени файла или папки? я использую ofstream заранее спс. VC++ 6.0
ofstream txtfile("C:\Program Files\myfolder\mytxt.txt");
народ, подскажите как заставить консольку создать новую директорию?
BOOL CreateDirectory(
LPCTSTR lpPathName, // directory name
LPSECURITY_ATTRIBUTES lpSecurityAttributes // SD
);
Пример:
void main()
{
if (CreateDirectory(”c:\\new”,NULL))
printf("Done!\n");
else
printf("Error\n");
}
ToniKapuchon
05.10.2008, 19:34
Нажимаю я клавишу например f5, получаю её виртуальный код в десятичном представлении = 116! Возможно ли каким нибудь мегахитрым путём, получить VK_F5 и шестнадцатиричное представление етой клавиши (без забивки значений массива)
Каким образом в операторе if (в С) можно остановить выполнение программы, при выполнении заданного условия?
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
if (CreateDirectory("c:\\new",NULL))
cout << "Done!\n";
else
cout <<"Error\n";
}
чет не работает(
error C2664: 'CreateDirectoryW' : cannot convert parameter 1 from 'const char [7]' to 'LPCWSTR'
Каким образом в операторе if (в С) можно остановить выполнение программы, при выполнении заданного условия?
можно использовать return или exit()
if( /* условие */)
return 0; // или return 1
или
if( /* условие */)
exit(0);
можно использовать return или exit()
Это как ? Вот так у меня не работает:
# include <iostream>
# include <stdlib.h>
int main() {
int n, a0, a1, a2, a3;
char a01, a11, a12;
printf("Enter n, please:");
scanf("%d", &n);
a0=(n/1000);
a1=(n/100)-a0*10;
a2=(n/10)-(a0*100+a1*10);
a3=n-(a0*1000+a1*100+a2*10);
if (n<10) {
printf("Error: n have only one digital");
exit();
}
else if (n>9999) {
printf("Error: n>9999");
}
else {}
if (a0==0 && a3!=0) {
a0=n+1;
}
else if (a1==0 && a3!=0) {
a1=n+2;
}
else if (a2==0 && a3!=0) {
a2=n+3;
}
else {}
if (a0==a1 || a0==a2 || a0==a3 || a1==a2 || a1==a3 || a2==a3) {
printf("YES!");
}
else {
printf("NO!");
}
}
Это как ? Вот так у меня не работает:
if (n<10) {
printf("Error: n have only one digital");
exit(1);
}
Большое спасибо! Если не трудно скажите, что означает эта -1 и что она даёт?
Larionich
05.10.2008, 21:27
Каким образом в операторе if (в С) можно остановить выполнение программы, при выполнении заданного условия?
int main() {
//твой текст
if (temp==0) return 0;
//текст2
return 0;
}
Лучше используй "return 0;" это стандарт. Если же это условие например ошибка записи/чтения файла, то можно return(21); 21-это код ошибки, если программа завершилась удачно, то его ставят 0, если с ошибкой, то 1-255.
Часто полезно испоьзовать оператор выхода из цикла- "break".
Это как ? Вот так у меня не работает:
Убери exit(); и напиши return 0;. criz, код выхода (-1) не используют, он от 0 до 255.
Большое спасибо! Если не трудно скажите, что означает эта -1 и что она даёт?
1 это статус завершения программы. exit() принимает в качестве аргумента любое число. 0 - означает успешное завершение.
Larionich, исправил, спасиб :)
если кому интересно, то вот что я состряпал...
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
int main()
{
ofstream fol("C:/abc/ab/a.txt");
if(fol.fail())
{
cout << "creating...\n";
system("mkdir C:\\abc\\ab");
ofstream fol("C:/abc/ab/a.txt");
return main();
}
else
cout << "exist\n";
}
он от 0 до 255.
напомни плиз, где об этом написано
З.Ы. что-то мне подсказывает, что я был прав насчет exit(-1) :)
horlyk, попробуй так:
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
if (CreateDirectory(L"c:\\new",NULL))
cout << "Done!\n";
else
cout <<"Error\n";
}
vikseriq
05.10.2008, 21:43
http://www.opennet.ru/docs/RUS/bash_scripting_guide/a14876.html
Погугли - я много нашел.
ЗЫ это тебе не надо к работе ))
1 это статус завершения программы. exit() принимает в качестве аргумента любое число. 0 - означает успешное завершение.
0 - означает 0 и ничего более в данном случае.
он от 0 до 255.
напомни плиз, где об этом написано
З.Ы. что-то мне подсказывает, что я был прав насчет exit(-1)
-1 = 255
работает, спс.
если кому интересно и удаление то...
void main()
{
if (CreateDirectory(L"c:\\new",NULL))
cout << "Done!\n";
else
cout <<"Exist\n";
int a;
cout << "\ndelete it?\n";
cin >> a;
if(a == 1)
RemoveDirectory(L"c:\\new");
system("PAUSE");
}
и кстати, как подпапки создавать?обычным CreateDirectory(L"c:\\new\\asd",NULL);
не выходит(
Товарищи, меня тут 2 вопроса мучают:
1) как узнать какие порты открыты на локальной машине
2) как узнать какой процесс(какое приложение) использует конкретный порт?
Larionich
05.10.2008, 22:36
и кстати, как подпапки создавать?обычным CreateDirectory(L"c:\\new\\asd",NULL);
не выходит(
Создавай каждую папку отдельно, если тебе нужно создать много-много папок, создавай в цикле.
CreateDirectory(L"c:\\new",NULL);
CreateDirectory(L"c:\\new\\asd",NULL);
Товарищи, меня тут 2 вопроса мучают:
1) как узнать какие порты открыты на локальной машине
2) как узнать какой процесс(какое приложение) использует конкретный порт?
Для того, чтобы увидеть открытые порты можно использовать команду netstat из командной строки. Она показывает показывает порты и сервисы, которые пользуются этими портами.
C:\Documents and Settings\root>netstat
выводит
Active Connections
Proto Local Adress Foreign Adress State
TCP root-87bf31da7b:1413 localhost:1414 ESTABLED
TCP root-87bf31da7b:1414 localhost:1413 ESTABLED
Ну, а закрывать, порты можно при помоши Firewall (стандартный есть в xp). А вообще, поставь себе аутпост фаервол например, он получше windoze firewall.
Larionich, спс. Както не удобно создание выходит :) тот пример что я писал - в этом случае удобнее :)
Народ, дайте кто нить описание на windows.h
я хз, чет не могу найти - на мсдн не посылайте, разве что по прямой ссылке на описание.
заранее спс
Товарищи, меня тут 2 вопроса мучают:
1) как узнать какие порты открыты на локальной машине
2) как узнать какой процесс(какое приложение) использует конкретный порт?
http://www.xakep.ru/magazine/xa/098/122/1.asp
Для того, чтобы увидеть открытые порты можно использовать команду netstat из командной строки.
мммм...моя ошибка, не написал что мне надо программным способом узнать какие порты открыты...хотя написал вроде в разделе "Кодинг"....
Larionich, еще варианты есть?
Народ, дайте кто нить описание на windows.h
какое описание?
З.Ы. ты перед создание подпапки где находишься? в новой директории? Попробуй сменить директорию на вновь созданную и сделать ту же процедуру создания..
какое описание?
о содержащихся в нем ф-ях типа system("pause") и т.д.
о содержащихся в нем ф-ях типа system("pause") и т.д.
Да там не особо много функций... В нем инклюды содержатся...
у меня такая проблема...
хочу написать функцию, которая бы возвращала переменную типа list (которая из Stl'a)....
вообщем сейчас напишу, вопрос будет понятен сам собой
#include <list>
list add();
написать функцию которая возвращала бы список...
а на то что я написал, компилятор выводит ошибку
error C2955: 'std::list' : use of class template requires template argument list
и т. п.
ну так ты должен тип указать
list<int> add;
Есть такой код:
unsigned int i;
Form1->mesg(i);
.....
void __fastcall TForm1::mesg(char *s)
{
Memo1->Lines->Add(AnsiString(s));
}
помогите, плиз, разобраться с типами. Как преобразовать unsigned int в char
Доброго времени суток.
Вопрос:
как задать размер главного окна в MFC приложении.
главное окно которое генерит вижуал студио для даного приложения не подходит по размерам в эстетическом плане)
CMyFrameWin::CMyFrameWin()
{
Create(NULL,"PROGRAM",
WS_OVERLAPPEDWINDOW,rectDefault,NULL,
MAKEINTRESOURCE(IDR_MAINFRAME));
}
где и как подправить эти функции?
rect ставить не по дефолту или хз...?
можно как нить реализовать автомасштабирование в зависимости от разрешения экрана?
спасибо.
/////////////////////////////////////////////////////////
разобрался сам)
я просто втыкал здесь:
писал Rect(100, 100, 750, 620)
вместо CRect(100, 100, 750, 620)
////////////////////////////////////////////////////////
Кто подскажет где взять обучающее видео или какуюто литературу по Visual Studio 2008 для визуального коддинга под С++ ?
Хочу реализовать звуковое сопровождение при открытии программы и (или) диалогов MFC приложения.
вот что успел накалякать с помощью гугл..
-----------------------------------
есть функция ЗВУК
void ZVYK(int IDR_WAVE)
{
HRSRC hWav;
hWav=FindResource(AfxGetResourceHandle(),MAKEINTRE SOURCE(IDR_WAVE),"WAVE");
HGLOBAL hPtrDataWav;
hPtrDataWav=LoadResource(AfxGetResourceHandle(), hWav);
LockResource(hPtrDataWav);
sndPlaySound((LPCTSTR)hPtrDataWav,SND_MEMORY|SND_A SYNC );
FreeResource(hPtrDataWav);
}
вот собственно создание главного окна программы
CMyFrameWin::CMyFrameWin()
{
ZVYK(IDR_WAVE1);
Create(NULL,"PROGRAM",
WS_OVERLAPPEDWINDOW,CRect(100, 100, 750, 620),NULL,
MAKEINTRESOURCE(IDR_MAINFRAME));
}
int CMyFrameWin::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
HICON newIcon= AfxGetApp()->LoadIcon(IDI_ICON1);
SetIcon(newIcon,TRUE);
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD
| WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS
| CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1;
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1;
}
return 0;
}
есть ресурс типа WAVE с идентификатором IDR_WAVE1 (название файла WAVE1.BIN - экспортированный WAV файл)
когда компилю получаю вот такую байду:
Linking...
TOOLBAR7.obj : error LNK2019: unresolved external symbol __imp__sndPlaySoundA@8 referenced in function "void __cdecl ZVYK(int)" (?ZVYK@@YAXH@Z)
Debug\qwerty.exe : fatal error LNK1120: 1 unresolved externals
помогите разобраться... или может у кого есть пример реализации?
Спасибо.
наверно лучше было бы заюзать PlaySound
http://msdn.microsoft.com/en-us/library/ms712879(VS.85).aspx
Для этих функций необходимо подключить библиотеку
Library: Use Winmm.lib.
Значит с плейсаунд...
заинклудил вроде все что нужно...
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "Winmm.lib")
....
сама функция...
CMyFrameWin::CMyFrameWin()
{
PlaySound("Trumpet1.wav", NULL, SND_FILENAME);
Create(NULL,"PROGRAM",
WS_OVERLAPPEDWINDOW,CRect(100, 100, 750, 620),NULL,
MAKEINTRESOURCE(IDR_MAINFRAME));
}
Нагуглил что нужно еще в afxwin.h добавить строку
#pragma comment(linker, "/nod:winmm.lib")
сделал...
при F5 имеем опять..:
Linking...
TOOLBAR7.obj : error LNK2019: unresolved external symbol __imp__PlaySoundA@12 referenced in function "public: __thiscall CMyFrameWin::CMyFrameWin(void)" (??0CMyFrameWin@@QAE@XZ)
Debug\qwerty.exe : fatal error LNK1120: 1 unresolved externals
в чем может быть дело?...
трудно сказать. Попробуй прилинковать через настройки проекта
в крайнем случае используй динамическое подключение dll (LoadLibrary, GetProcAddress)
Где найти полное описание библиотеки wininet на русском?
А еще лучше пример брутфорса на этой библиотеки.
2ZEXEL Ищи TeachPro Visual C++
ToniKapuchon
28.10.2008, 19:39
char p[20];
char* buffer_float=p;
GetDlgItemTextA(hDlg,IDC_EDIT6,LPSTR(p),20);
char* end_ptr;
double val =0;
val=atof(buffer_float);
val=strtod(buffer_float,&end_ptr);
float perem_float=0;
perem_float =(float)val;
DWORD leng;
WriteFile(hFile,&perem_float,sizeof(perem_float),&leng,NULL);
CloseHandle(hFile);
break;
После преобразования, из char в double например числа 75.65 получаю в double нечто подобное 75.649999999? шо не так?
На100ящий
31.10.2008, 13:53
Люди почему в Турбо Си 3,0 #include <iostream>
<iostream.h> не работает или вообще не находит библиотеку или если находит то выдаёт 300 ошибок??
Люди почему в Турбо Си 3,0 #include <iostream>
<iostream.h> не работает или вообще не находит библиотеку или если находит то выдаёт 300 ошибок??
OPTIONS>DIRECTORIES>INCLUDE DIRECTORIES
проверь здесь правильно ли прописан путь к инклудам.
если не поможет попробуй поменяй свой иострим на мой (версия СИ таже что и у тебя.)
КАЧАЙ (http://slil.ru/26290871)
если же это не поможет напиши какие ерроры вылетают.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot