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

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

Автор: ryambler
Дата сообщения: 05.09.2006 18:33
Qraizer
Спасибо за ответ.
Как я теперь понимаю, функция trunc округляет значение к меньшему что и делает функция floor? То есть если число 3,2 то результат 3 и если число 3,6 то результат тоже 3? А в общем счас сам испытаю)
Все равно спасибо. Просто я в английском не силен)
Автор: Qraizer
Дата сообщения: 05.09.2006 20:21
Не совсем. Есть два отличия:
1) Trunc усекает к нулю.
2) floor() возвращает вещественный результат.
Автор: b3nd3rster
Дата сообщения: 09.09.2006 19:41
Я начинающий поэтому нужна литература. Подскажите что получше. И еще я так понимаю лучше всего использовать VS2005, но я хочу так что бы с перспективой на Linux/FreeBSD. Или может тема есть для новичков с чего начать. Я просто запутался, мне одни говорят одно, другие другое.

P.S. Есть книга Страуструпа Дизайн и Эволюция C++ 2006 года издания (Москва).
Автор: xdude
Дата сообщения: 09.09.2006 20:35
b3nd3rster
Если с перспективой на Линукс, то лучше всего использовать MSYS+MinGW+GCC.
http://www.mingw.org/
Под нее есть несколько IDE, небольшой список есть на этой странице:
http://www.mingw.org/links.shtml
Тут же немного ссылок на документацию, уроки, инструменты и т. д. Однако, нужен английский, без него никак.
Автор: b3nd3rster
Дата сообщения: 09.09.2006 20:44
Я английский учу, но читать литературу могу, со словарем кончно. Я пока под Виндой сижу, поэтому xdude, то что указал применимо к Виндоусу, так как чисто с Линуксом обойтись не могу. А вообще спасибо
Автор: xdude
Дата сообщения: 09.09.2006 21:05
Немного не понял последний пост, использована неизвестная пока мне грамматическая констукция Отвечу на то, что понял
GCC/G++ - это стандартный C/C++ компилятор для линукс/freebsd/unix. MinGW/MSYS - это небольшая линуксоподобная оболочка для винды, в которой работает этот самый GCC. Я делаю так: пишу код под виндой, создаю Makefile (так как если проэкт достаточно большой - компилять отдельные файлы и собирать из командной строки немного неэффективно по времени), компилирую под виндой, запускаю, тестирую, а потом в VMVare на виртуальной машине с нужной операционкой все это без проблем компилируется под линукс/фрибзди/CerntOS/Solaris и т.д. Однако, при написании кода нужно соблюдать стандарты ANSI для того чтобы не было проблем при переносе, не использовать чисто виндовые функции, не использовать чисто виндовые библиотеки, ну и т.д. По идее, почти все функции стандартной библиотеки C, так же как и библиотека STL для C++, работают одинаково как под виндой, так и под линуксом/юниксом. Кроме того, в интернете можно найти множество кросс-платформенных библиотек любого назначения (в основном все полезное я нахожу на SourceForge.net).
Ну и плюс к этому, если использовать IDE типа Dev-C++ или VisualMinGW, то не надо будет париться с Makefile-ами, командной строкой, и прочими заморочками: там все просто, и очень похоже на MS Visual Studio - так же создается проэкт, также в нем создаются или добавляются исходные файлы, ну и т.д.
Автор: b3nd3rster
Дата сообщения: 09.09.2006 21:16
xdude, вообщем ты мне все доступно объяснил. А VS только под виндой, так что его не следует использовать. А есть хоть какая то инфа на русском, и примеры программ. Для начала что бы основы понять (основы C/C++). Я до этого в школе на Паскале и Визуал Бейсике работал (довольно хорошо, 3-е место на Обл Олимпиаде по информ, без подготовки).
Автор: Abs62
Дата сообщения: 10.09.2006 00:13
xdude

Цитата:
MinGW/MSYS - это небольшая линуксоподобная оболочка для винды, в которой работает этот самый GCC.

Насколько я помню, так реализован cygwin - библиотека cygwin.dll эмулирует среду, в которой работает GCC, а mingw - это натуральный порт GCC под Windows.
Автор: xdude
Дата сообщения: 10.09.2006 00:29
Abs62
mingw/msys позволяет запускать под виндой не только gcc, но много других полезных утилит, портированных из Linux/Unix. Так что нельзя назвать ее портом gcc. И это не эмулятор, как cygwin. Поэтому можно сказать, что это своего рода оболочка (набор библиотек и утилит) для запуска приложений, портированных из юниксоподобных систем. При этом, если скомпилировать под mingw/msys/gcc программу, она без проблем запустится на любой Windows-системе, даже если там не установлена MinGW/MSYS. А вот скомпилированная под cygwin программа без наличия cygwin не запустится.

b3nd3rster
Выложил "Бьерн Страуструп. Язык программирования С++, издание второе дополненное". Год выпуска не знаю. По идее, самая толковая книга из тех, которые мне попадались:
http://rapidshare.de/files/32547252/StraustrupCprogramming.rar

А вообще, если нужна помощь по какой-то функции, можно набрать в гугле что-то вроде "man 3 имя_функции". Если такая функция под линуксом существует - обязательно найдется описание.
Автор: Abs62
Дата сообщения: 10.09.2006 01:39
xdude

Цитата:
mingw/msys позволяет запускать под виндой не только gcc, но много других полезных утилит, портированных из Linux/Unix.

Кажется, я чего-то не понимаю. Если утилиты портированы, то никаких дополнительных приблуд для их работы не требуется - теперь они натуральные Win-приложения.

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

А в следующей фразе утверждается обратное:

Цитата:
При этом, если скомпилировать под mingw/msys/gcc программу, она без проблем запустится на любой Windows-системе, даже если там не установлена MinGW/MSYS.

Значит, всё-таки никакая оболочка им не нужна. Но это же относится и к самому MinGW, разве нет? Без всяких оболочек - полноценный C/C++ компилятор под Windows. Значит - натуральный порт.

Цитата:
А вот скомпилированная под cygwin программа без наличия cygwin не запустится.

То есть, по сути cygwin не является портом - это скорее эмулятор UNIX. И фраза из предыдущего поста "линуксоподобная оболочка для винды, в которой работает этот самый GCC" относится именно к нему, но никак не к MinGW.
Автор: xdude
Дата сообщения: 10.09.2006 02:02
Abs62
Все это очень зыбкая тема для прений. Например, можно ли запустить тот же gcc/g++, портированный из линукса, без наличия MSYS/MinGW? Вряд ли. То есть, оболочка все же нужна. То же самое относится и к sh, и еще некоторым утилитам. Ну, и плюс ко всему, MinGW/MSYS объединяет все эти утилиты и подчиняет единой структуре, создавая необходимое дерево каталогов, прописывая необходимые пути в переменные окружения, создавая переменные окружения, специфичные для unix-систем, ну и т.д. То есть, ее все таки можно назвать оболочкой.

Цитата:
А в следующей фразе утверждается обратное:

Обратное я не утверждаю. Я лишь утверждаю, что программы, скомпилированные в самой оболочке MSYS/MinGW с использованием gcc, для своей работы этой оболочки не требуют (но сам-то gcc и смежные с ним утилиты без ее наличия не работают, иначе зачем нужно было создавать всю эту обололочку, если проще было просто портировать gcc со всеми дополнительными утилитами ). А вот cygwin - это уже не оболочка, а самый натуральный эмулятор.
Ну и последний аргумент: что такое Visual Studio? Это по сути тоже оболочка (или среда) программирования. Она так же состоит из массы взаимосвязанных библиотек и утилит (IDE, утилиты для компиляции из командной строки, и т. д.). Причем, отдельно взятая утилита ничего толкового из себя не представляет, и работает только в оболочке, вкупе со всеми остальными. И также, как и в MinGW, создаваемые ей программы для своего запуска наличия этой оболочки не требуют.
Автор: Abs62
Дата сообщения: 10.09.2006 04:16
xdude

Цитата:
Все это очень зыбкая тема для прений.

Не договорившись о смысле применяемых терминов, достигнуть взаимопонимания крайне сложно.

Цитата:
Например, можно ли запустить тот же gcc/g++, портированный из линукса, без наличия MSYS/MinGW?

А что в таком случае именуется MinGW?

Цитата:
Ну, и плюс ко всему, MinGW/MSYS объединяет все эти утилиты и подчиняет единой структуре, создавая необходимое дерево каталогов, прописывая необходимые пути в переменные окружения, создавая переменные окружения, специфичные для unix-систем, ну и т.д.

Программа, проделывающая описанные действия, именуется не "оболочка", а "инсталлятор".

Цитата:
иначе зачем нужно было создавать всю эту обололочку, если проще было просто портировать gcc со всеми дополнительными утилитами

Именно это и проделали разработчики MinGW, в отличие от разработчиков cygwin.

Цитата:
Ну и последний аргумент: что такое Visual Studio? Это по сути тоже оболочка (или среда) программирования.

VS включает в себя компилятор, библиотеки, хидеры, утилиты и оболочку (среду) - IDE. MinGW включает в себя компилятор, библиотеки, хидеры, утилиты, но оболочка (среда) в нём отсутствует. Вот уже упомянутый Dev-C++ - это как раз и есть оболочка (среда). О чём прямо говорят разработчики - "Dev-C++ is a full-featured Integrated Development Environment (IDE) for the C/C++ programming language. It uses Mingw port of GCC (GNU Compiler Collection) as it's compiler".

Цитата:
Причем, отдельно взятая утилита ничего толкового из себя не представляет, и работает только в оболочке, вкупе со всеми остальными.

Отнюдь. Требование наличия определённых DLL и/или переменных окружения не есть признак оболочки - иначе оболочкой следовало бы называть едва ли не любую программу.
Автор: b3nd3rster
Дата сообщения: 10.09.2006 19:29
xdude, за книгу спасибо. У меня только один вопрос, ты ведь эту книгу изучал уже. У меня в книге описывается C++ до 1993/1994 года. То есть там только про предварительный стандарт ANSI/ISO августа 1994. А до какого года (стандарта) описывается во втором издании.
Автор: xdude
Дата сообщения: 10.09.2006 23:38
Abs62

Цитата:

MinGW: A collection of freely available and freely distributable Windows specific header files and import libraries combined with GNU toolsets that allow one to produce native Windows programs that do not rely on any 3rd-party C runtime DLLs.

MSYS: A Minimal SYStem to provide POSIX/Bourne configure scripts the ability to execute and create a Makefile used by make.

Перевод, надеюсь, не требуется?
MSYS/MinGW - это та же среда, или оболочка, как угодно, только не включающая в себя редактор кода. Это те же самые утилиты, что и в Visual Studio - компиляция, сборка, архивирование (.lib, или .a - это не что иное, как архив .o). Плюс к этому, для этой среды можно скачать кучу других утилит, например, automake, autoconf, и т.д. Вот если взять отдельную такую программу (например, порт automake под Windows, или порт gcc под windows) - это будет порт, а если объединить массу таких программ вместе, плюс линуксовую оболочку sh или bash - то это никак нельзя назвать портом, это уже среда разработки, оболочка, включающая в себя массу различных утилит для достижения поставленной цели.

Цитата:
Программа, проделывающая описанные действия, именуется не "оболочка", а "инсталлятор".

Мдаа... Cygwin - это тоже инсталлятор? Он ведь тоже при запуске создает окружение, в которое прописывает переменные, в нем тоже все подчинено единой структуре, типичной для линукса?
Кстати, MSYS вполне можно назвать эмулятором, так как если попытаться из-под sh или bash набрать команду cd /;ls - можно увидеть, что типичная для windows раскладка файлов и папок пропала, как и диски C: D: и т.д. Вместо этого MSYS эмулирует линоксовый расклад каталогов, с папками /usr /bin /var и т.д. И многие портированные утилиты именно поэтому без самой оболочки MSYS не работают.


Цитата:
Отнюдь. Требование наличия определённых DLL и/или переменных окружения не есть признак оболочки - иначе оболочкой следовало бы называть едва ли не любую программу.

В принципе, достаточно обширный программный комплекс можно назвать средой (или оболочкой). Например, тот же Microsoft Office вполне назвать средой создания и обработки офисной документации. В то время как каждая отдельно взятая парограмма (например MS Word) - это всего лишь программа.

В общем, советую зайти на страницу загрузки http://www.mingw.org/download.shtml, там можно увидеть, что gcc, MinGW и MSYS качаются отдельно, как и другие программы и программные пакеты для этой среды разработки. Еще можно почитать мануалы, где пишется, что для работы с gcc под виндой вам понадобится установить набор MinGW/MSYS.

В общем, считаю, что нет смысла продолжать эти прения, потому что они скоро перевалят (если уже не перевалили) за тематическую грань данного топика.


b3nd3rster
Дело в том, что я не изучал эту книгу полностью, только некоторые необходимые мне отрывки, поэтому об описываемых там стандартах сказать ничего не могу. Но почитать советую, потому что мне ее рекомендовали как лучшую в своей области, да и мне самому понравилось, как там все описывается.
Автор: Abs62
Дата сообщения: 11.09.2006 00:54
xdude

Цитата:
В общем, советую зайти на страницу загрузки http://www.mingw.org/download.shtml, там можно увидеть, что gcc, MinGW и MSYS качаются отдельно, как и другие программы и программные пакеты для этой среды разработки. Еще можно почитать мануалы, где пишется, что для работы с gcc под виндой вам понадобится установить набор MinGW/MSYS.

Для любителей UNIX-like систем - MinGW/MSYS. Для привычных к Windows - Dev-C++/MinGW, и не надо MSYS. Компилятор один, оболочки разные.

Цитата:
В общем, считаю, что нет смысла продолжать эти прения, потому что они скоро перевалят (если уже не перевалили) за тематическую грань данного топика.

Согласен. Не будем тут holy war устраивать.
Автор: xdude
Дата сообщения: 11.09.2006 01:11
Abs62

Цитата:
Согласен. Не будем тут holy war устраивать.

Да уж И так полторы страницы уже нафлудили

Вместо этого у меня вопрос по теме (или не совсем): как можно максимально урезать размер компилируемой DLL (под VS2006)? Я уже поотключал стандартные библиотеки, линкую только с самыми необходимыми (типа user32.lib и kernel32.lib), стандартной Сишной библиотекой не пользуюсь, STL тоже, короче, ограничиваю себя, как могу. Может, есть еще какие-то способы? Какие-то дополнительные настройки при компиляции/сборке? Или какие-то сторонние утилиты, типа как для exe-шников всякие упаковщики?
Автор: Abs62
Дата сообщения: 11.09.2006 07:37
xdude
Ну, можно попробовать уменьшить выравнивание файловых секций (опция линкера /ALIGN), свести несколько секций в одну (/MERGE), подключить уменьшенную DOS-заглушку (/STUB), вообще отказаться от run-time library. Вот здесь есть несколько рекомендаций по этому поводу.
Автор: xdude
Дата сообщения: 11.09.2006 21:13
Abs62
Спасибо, буду экспериментировать
Автор: Elf23
Дата сообщения: 14.09.2006 10:26
Если есть кто живой отзовись!!
Автор: xdude
Дата сообщения: 16.09.2006 20:20
Товарищи, кто-нибудь работал с потоками в WinAPI? У меня такая проблема:
Создаю удаленный поток CreateRemoteThread который вызывает функцию LoadLibrary в процессе назначения. Туда параметром передаю путь к библиотеке. В самой библиотеке в функции DllMain при dwReason==DLL_PROCESS_ATTACH создаю поток hThread=CreateThread, в качестве входной использую функцию X, после чего вызываю WaitForSingleObject(hThread,INFINITE) и все зависает. Если поставить таймаут не INFINITE, а, скажем, 5 секунд, то через 5 секунд WaitForSingleObject возвращает значение WAIT_TIMEOUT. Но все дело в том, что после этого функция X все-таки выполняется, причем уже тогда, когда я начинаю деинициализацию, закрытие HANDLE-ов, освобождение памяти и т.д. Пытался перед вызовом WaitForSingleObjerct вставить Sleep(10000) - результата 0, функция X даже не начинает свое выполнение. У меня в самом начале функции идет запись в лог-файл, и эта запись там появляется только после того как я уже начинаю деинициализацию. Насколько я понял, после завершения remote thread. Может, нельзя так делать, чтобы один поток ждал завершения другого потока, в то время как его самого ждет еще и третий поток? Или, может, нужно закрывать какие-то хэндлы, или соблюдать какую-то последовательность, или вызывать какие-то дополнительные функции, или что-то еще?
Заранее спасибо.
Автор: Abs62
Дата сообщения: 16.09.2006 22:33
xdude

Цитата:
В самой библиотеке в функции DllMain при dwReason==DLL_PROCESS_ATTACH создаю поток hThread=CreateThread, в качестве входной использую функцию X, после чего вызываю WaitForSingleObject(hThread,INFINITE) и все зависает.

Не зависает, а ждёт завершения инициализации DLL. И запускается только после того, как DLLMain завершится. Вот что по этому поводу написано в MSDN:

Цитата:
The ExitProcess, ExitThread, CreateThread, CreateRemoteThread functions, and a process that is starting (as the result of a CreateProcess call) are serialized between each other within a process. Only one of these events can happen in an address space at a time. This means the following restrictions hold:
- During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process.
- Only one thread in a process can be in a DLL initialization or detach routine at a time.
- ExitProcess does not return until no threads are in their DLL initialization or detach routines.
Автор: xdude
Дата сообщения: 16.09.2006 22:48
Abs62
Во! Спасибо за толковое разъяснение. А то я уже мозги сломал на этом деле
Тогда вопрос немного из другой области: в интернете я нашел небольшой исходник в интернете, который решает мою задачу немного по-другому. Смысл в том, что там используется ресурс, который является файлом DLL. Для получения указателя на этот ресурс используются функции LoadResource и LockResource. А есть ли способ не используя ресурсы получить указатель на уже загруженный в память экземпляр библиотеки? Например, используя GetModuleHandle я могу получить хэндл моей библиотеки, но вот что делать с ним дальше? Или так сделать вообще нельзя?
Автор: Abs62
Дата сообщения: 17.09.2006 01:14
xdude

Цитата:
Например, используя GetModuleHandle я могу получить хэндл моей библиотеки, но вот что делать с ним дальше?

Зависит от того, что от этой библиотеки требуется.
Если ресурсы - доставать их уже упомянутыми LoadResource и LockResource. Если функции - указатель на них можно получить через GetProcAddress.

PS. Такие вопросы лучше задавать не здесь, а в теме по WinAPI.
Автор: Larry
Дата сообщения: 19.09.2006 09:21
Я только недавно начал программировать на С++, поэтому многого еще не знаю.

Подскажите, пожалуйста, как можно функции fopen передать составное имя файла? Например: fopen_s(&file1 , file_name, "w")), где имя файла берется из argv[1] и к нему добавляется расширение 'txt'. Никак не могу сообразить, как это все передать программе.

Заранее благодарен за ответ...
Автор: RedPromo
Дата сообщения: 19.09.2006 11:19
Larry
Вот тебе код

Цитата:

    if (argc<2)     {
        cout<<"Program Test3"<<endl;
        cout<<"Comand line: test3 [file name]"<<endl;
        getchar();
        return 0;}
    
    FILE *stream; //Поток открыторго файла
    char* _fname; //Комбинированое имя файла
    int sizeNew = sizeof(argv[1])+5;

    _fname = new char[sizeNew]; //Новый размер переменной имени файла

    sprintf(_fname,"%s.%s",argv[1],"txt"); //Вот и коббинируем то что нам нужно
    errno_t err = fopen_s(&stream,_fname,"w");
    //тут чтото делаем с тем что нам нужно

    _fcloseall();
    return 0;

Автор: Larry
Дата сообщения: 19.09.2006 13:40
RedPromo, спасибо, буду пробовать.
Автор: distance
Дата сообщения: 19.09.2006 14:46
Larry
составное имя файла тебе нужно сформировать самому.
и лучше сразу приучай себя к tchar


Код:
#include <strsafe.h>
#include <tchar.h>

TCHAR szBuf[MAX_PATH];
StringCchPrintf(szBuf, MAX_PATH, _T("%s.%s"), file_name, argv[1]);
_tfopen_s(&file1, szBuf, _T("w"));
Автор: Elf23
Дата сообщения: 19.09.2006 15:35
Если есть кто отзовись!!
Автор: xdude
Дата сообщения: 19.09.2006 17:00
Elf23

Цитата:
Если есть кто отзовись!!


Это что за прикол? Количество постов нагоняешь, или как?
Странно, за то, что я "спасибо" ответил - мне предупреждение, а на подобные бессмысленные посты - ноль внимания

Добавлено:
Блин, аж забыл, зачем в форум полез
distance

Цитата:
и лучше сразу приучай себя к tchar

А зачем этот TCHAR нужен? Что он делает? Почему он лучше wchar_t или просто char?
Автор: Larry
Дата сообщения: 19.09.2006 17:14
Еще один вопрос. Ситуация следующая:

Есть хидер, в котором определена структура:

Цитата:
typedef struct S_xxxx {
int param1;
...
}


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

Я делаю так:

Цитата:
int main(int argc, char* argv[])
{
xxxx *ns_buf;

ns_buf->param1 = 0; // присваиваю определенные значения параметрам...
unsigned SetCommand(xxxx *);
}


Но что-то не катит. По-моему под ns_buf нужно сначала выделить память, но как это сделать, до меня не доходит.

Помогите, пожалуйста...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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