![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
S.A.G. |
|
||||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
1. В разделе справки для Pelles C C99 language reference - Introduction - ISO C conformance читаем:
С первым предложением никаких проблем. Но что за екстеншены такие для поддержки которых необходимо включать режимы /Ze и /Zx? И о каких вообще расширениях языка идет речь? 2. Для вывода на экран русскоязычного "Привет, мир!" нужно как минимум написать такой код:
Для чего определять символ WIN32_DEFAULT_LIBS? Кстати без пресловутого /Ze это тоже нехочет работать. Понятно, что CharToOemA - API функция которая определена в каком-то .dll из стандартного комплекта для Windows. Но разве недостаточно просто включить файл windows.h? В MVS 2005 это так работало, а в Pelles C Windows.h вообще какой-то маленький... Это сообщение отредактировал(а) main - 31.7.2006, 00:32 -------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
||||
|
|||||
Pilligrim |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 9.6.2006 Репутация: 1 Всего: 1 |
Просто вопрос: а зачем тогда перешел на Pelles C(?) если уже разбирался в VC++.
Второй момент: конечно код будет немаленьким! Посмотри сам: консоль-проект, а функция вообще-то для винды писана(это я про CharToOemA), ибо консоль и русский язык это берега одной реки(если не разных и параллельных!). Зачем тебе это? Выводи на английском! Тогда код у тебя сократится как минимум на 3 строчки.
Может это расширения для реализации возможности использования твоей прожки на платформе винды? З.Ы. Не пробовал убрать #define WIN32_DEFAULT_LIBS? Я начинал писать на Dev C++, дык там компилятор генерил такой стандартный код, а без нено оказывается програ работает! |
|||
|
||||
S.A.G. |
|
||||||||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
Разбирался но не разобрался. Если бы далеко зашел - не стал бы переходить. Но не жалею. Pelles C как-то покомпактней да и стандарт лучше чем студия поддерживает. (!) Попробовал выполнить пример на обозначенные инициализаторы и был удивлен. MVS 2005 выдавала ошибку. Как ни пытался юзать тип _Bool или Bool ничего не получалось а в Pelles C и то и другое прекрасно поддерживаеться. Думаю это не все приемущества этого компилятора.
А разве консоль-проект в виндозе это не есть по сути программа под винду? По по-моему - да. Я не про размер кода говорю а про заголовочный файл Windows.h - в нем же должны быть описаны прототипы всех API - функций? Про язык - нехочу транслитом а инглиш неочень хорошо знаю дабы проги свободно писать. А нельзя ли про эти берега поподробней написать? Я совсем запутался в этих кодовых страницах, кодировках, наборах символов.
Компилятор вроде как под винду..
Пробовал - некатит ![]() Это сообщение отредактировал(а) main - 1.8.2006, 01:09 -------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
||||||||
|
|||||||||
Damarus |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
Сохраняй свои исходники в DOS-совской кодеровке (VS2005: File -> Advanced Save Options... -> Encoding: Cyrillic (DOS) - Codepage 866). Или используй UNICODE-версии функций:
Это расширения языка. /Ze - расширения Microsoft, /Zx - расширения Pelles. Добавлено @ 06:21
Если Windows.h неполный, не мучайся, скачай Platform SDK. Думаю его можно подключить к Pelles. Это сообщение отредактировал(а) Damarus - 1.8.2006, 06:16 |
||||||
|
|||||||
S.A.G. |
|
||||||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
Спасибо, совет был бы особенно актуальным если бы я писал на VS2005 но для меня важна поддержка стандарта поэтому перешел на Pelles C. Там такой фичи с сохранением кода в нужной кодировке я невидел. ![]()
Я только начал учить язык C и мне к сожалению мало о чем говорит код на C++ да еще и с юникодовыми версиями функций. Немог бы, если не сложно, переписать этот код на C? Значит консоль поддерживает юникод? И какая вообще связь между кодовыми страницами и наборами ASCII, UNICODE, ANSI и т.д.(к примеру редактор исходного кода в той же VS2005 работает с кодовой страницей 1251)?
Поддержка SDK в Pelles C повидимо есть так как я скачал и установил плагин Add-in SDK для Pelles C. Но пока еще не разобрался что такое SDK? Обьясни плиз на доступном русском. ![]() -------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
||||||
|
|||||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
Код, посути, обычный текстовый файл. Открой его в любом редакторе, который поддерживает разные кодировки, и сохрани в нужной. Но это гимор. Лучше так: Тут дело даже не в UNICODE, а в том, что кодовую страницу консоли можно установить. Что и делают функции setlocale (ANSI) и _wsetlocale (UNICODE). Например так, без UNICODE:
SDK это Software Development Kit. Platform SDK, соответственно, - Platform Software Development Kit. Содержит заголовочные файлы, библиотеки, инструменты и прочее для написания программ под Windows. Последняя версия: Windows® Server 2003 SP1 Platform SDK ISO Install Это сообщение отредактировал(а) Damarus - 2.8.2006, 08:07 |
|||
|
||||
rsm |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 2 Всего: 62 |
main, начинаем все с начала.
Расширения языка - это определение дополнительных, не содержащихся в стандарте, опций. Читаем справку, что включают расширения языка Microsoft:
Смотрим так же, что включают авторские расширения языка:
Чтобы линкер автоматически подключил библиотеки, из которых вызываются функции. Например, если ты подключил к проекту хидер "shellapi.h" и определил директиву WIN32_DEFAULT_LIBS, то библиотека "shellapi.lib" подключится к проекту автоматически. В противном случае ее придется прописать вручную в настройках проекта. Недостаточно. Потому без включения расширений языка компилятор будет честно стараться действовать в рамках стандарта и обругает определения из хидера "windows.h" (и всех какие он включает) самыми грязными словами.
Не должны. Многие функции вынесены в отдельные хидеры.
Тогда остается либо использовать вызов функции CharToOem, либо вынести все строки в отдельный хидер и перед компиляцией конвертировать его в СР-866. В консоль текст выводится в кодировке СР-866. В редакторе кода по-умолчанию используется кодировка СР-1251. При компиляции файла кодировка сохраняется. При запуске программы получается несоответствие: текст в СР-1251, а консоль - в СР-866. |
||||||||||
|
|||||||||||
S.A.G. |
|
||||||||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
Первое что хочу сделать - это поблагодарить форум. Такой оперативной помощи как здесь я невидел нигде - как в русском так и в украинском сегменте сети. А теперь по-сути дела. Некоторые вопросы разрешены, некоторые нет. Скажем все стало ясно насчет расширений языка - у компиляторов разных производителей они могут быть свои - для их включения предусмотрены специальные режимы соответствующих компиляторов. Делаеться это, повидимо, для повышения еффективности кода, для удобства программистов и т.д. С этим ясно.
1. Насчет Platform SDK 2Damarus
Но ведь Windows API тоже содержит такие средства? Какая между ними разница? Каково предназначение Platform SDK? Последняя версия - версия Platform SDK производства Microsoft? Кстати для Pelles C тоже есть этот самый SDK, я его установил но как с ним работать - понять не смог. Но впечатление такое - этот самый SDK можно использовать для добавления новых фич в IDE для Pelles C. Кстати в их числе - преобразование текста в редакторе в консольную кодировку. Так как все-таки работать с Platform SDK? 2. Кодировки
Я запускал - у меня это не работает. Раз в обоих случаях устанавливаеться кодовая страница 1251 (кстати что это такое?), то какая разница между этими двумя функциями? "UNICODE-версии" - где используеться юникод? Какая разница между названиями - "кодовая страница" и "кодировка"? 3. Насчет WIN32_DEFAULT_LIBS 2rsm
Какая разница между автоматическим и не автоматическим подключением библиотек? Имееться ввиду .lib а не .dll? Но почему .lib раз речь идет о стандартных виндовых библиотеках? Или может быть я что-то непонимаю? Разве WIN32_DEFAULT_LIBS касаеться не только Win API библиотек?
Как? Это сообщение отредактировал(а) main - 3.8.2006, 03:37 -------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
||||||||
|
|||||||||
Damarus |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
Platform SDK это и есть Windows API (грубо говоря). Да. Platform SDK кстате делает именно Microsoft. Видимо с Pelles C идет SDK для разработки plugin-ов. Это совершенно другая история. Что значит работать? Скачиваеш, устанавливаеш, в настройках Pelles указываеш новые пути к директориям include, lib и т.д. После этого при написании:
Будет использоваться файл windows.h из установленного Platform SDK. Но возможно устанавливать отдельно Platform SDK не надо. В Pelles C он вероятно уже входит (возможно не полностью).
Вторая функция:
У меня обе работают. Разница в том, что вторая функция использует UNICODE строки, а первая - ANSI. UNICODE используется в Windows NT и выше. В UNICODE каждый символ занимает два байта, что позволяет иметь более 65 тысяч символов в таблице (против 255 у ANSI). Если пишеш только для Windows NT и выше, нет смысла использовать ANSI строки, т.к. все ANSI функции (например MessageBoxA) являются обёртками для UNICODE функций (соотв. MessageBoxW). Никикой. |
||||||||
|
|||||||||
rsm |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 2 Всего: 62 |
В нем содержатся хидеры, библиотеки и небольшой набор инструментов для написания программ на С\С++ с непосредственным вызовом функций WinAPI. С непосредственным потому, что PSDK не включает каких-либо надстроек над WinAPI (типа MFC, ATL и иже с ними), кроме CRT.
Попробовал - замечательно, просто замечательно, непременно буду юзать! Настраивается все очень легко:
Скачиваешь, устанавливаешь. Потом настраиваешь нужную IDE, добавляя в ее настройках пути к хидерам и к библиотекам. Для Pelles C for Windows это неприменимо, т.к. данная IDE является чисто C'шной, а PSDK рассчитан в первую очередь на С++ и заточен под компилятор от MS. Однако, для Pelles C for Windows PSDK и не нужен, т.к. он включен в дистрибутив. У меня тоже не работает. Нормально работает только вот это:
Кодировка - установленная зависимость, когда некоторый символ записывается некоторым кодом (числом или символом). Кодовая страница - список (таблица) таких установленных зависимостей. Устроим небольшую прогулку в мир библиотек? ![]() Для начала о том, что же такое библиотека функций. Библиотека функций (далее просто "библиотека") - это сборник некоторых функций, выполняющих полезную работу. Важным свойством библиотеки является ее общедоступность - получить возможность вызвать некоторую функцию может любая программа. Таким образом, библиотеки позволяют провести унификацию кода и сократить его количество - представь, какой был бы хаос, если бы в каждой программе приходилось каждый раз писать одинаковый код и что было бы, если б потребовалось его заменить? Разберемся, что такое DLL (Dynamic Link Library, "динамически подключаемая библиотека"). DLL являет собой общедоступную всем программам библиотеку, которую можно подключить с помощью функции WinAPI "LoadLibrary(Ex)" и вызывать из нее (библиотеки) нужные функции. Теперь рассмотрим, что представляет собой LIB (Microsoft Library Format, не расшифровывается). LIB бывают двух типов: с кодом и без кода. LIB с кодом содержат в составе каждой функции ее код, такие библиотеки называют статическими. LIB без кода в составе каждой функции содержат лишь переходник на одноименную функцию, вызываемую из DLL (например, в LIB содержится функция "CreateFileA", которая является лишь переходником к функции "CreateFileA", находящейся в библиотеке "kernel32.dll"). Такие LIB-библиотеки называют подключаемыми. Зачем нужны статические и подключаемые LIB? И те, и другие используются линкером (сборщиком), когда он собирает ЕХЕ-файл. Работает линкер следующим образом: он исследует выданный компилятором промежуточный объектный (OBJ) файл и запоминает вызовы всех импортируемых (вызываемых извне, из DLL или LIB) функций (например, функций WinAPI). Затем, линкер просматривает список заданных ему LIB-библиотек и ищет в них требуемые функции. При обнаружении в LIB нужной функции события разворачиваются по двум направлениям. Если LIB статическая, то линкер извлекает полностью весь код функции и записывает его в ЕХЕ-файл. Если LIB подключаемая, то в ЕХЕ-файл записывается название функции и название DLL-библиотеки, откуда эту функцию следует вызывать. Например, если требуется вызывать функцию "CloseHandle" из DLL "kernel32.dll", то в ЕХЕ-файл так и будет записано: функция - "CloseHandle"; библиотека - "kernel32.dll". В дальнейшем, при запуске ЕХЕ-файла, системный загрузчик обнаружит эту запись и подключит библиотеку "kernel32.dll" для того, чтобы из нее можно было вызвать функцию "CloseHandle". LIB-библиотеки из PSDK в большинстве своем являются подключаемыми. Исключение составляет библиотека CRT и еще несколько других. Далее, раз уж так пошло, разберемся, зачем нужны хидеры. В хидерах (*.h; *.hpp) представлено описание функций (в нашем случае - функций WinAPI). Описание это нужно для того, чтобы компилятор мог: во-первых, проверить правильность твоего кода - вдруг ты функции вместо числа строку подсовываешь или пару аргументов указать забыл?; и во-вторых, узнать значения констант (например, ERROR_SUCCESS) или размер структур (например, OPENFILENAMEA). В получаемый после компиляции объектный (OBJ) файл прописываются имена импортируемых из DLL и/или LIB функций, которые потом будет искать линкер (об этом процессе написано выше). Директива "WIN32_DEFAULT_LIBS" указывает компилятору, чтобы он добавил линкеру в список поиска LIB-библиотек нужные библиотеки. Рассмотрим в качестве примера кусок кода из хидера "shellapi.h":
Добавить библиотеку в список поиска можно и вручную в настройках проекта:
|
||||||
|
|||||||
S.A.G. |
|
||||||||||||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
2Damarus
Какая? Platform SDK - это разработка Microsoft для продуктов этой фирмы? Тогда что такое Platform SDK для Pelles C? Может быть автор просто так назвал средство для разработки плагинов для своей IDE? (кстати это единая функция Platform SDK - плагины?) 2rsm
Раз вызов непосредственный то что за функции находяться в библиотеках PSDK? Разве эти функции не выступают посредниками между программистом и WinAPI? Или я что-то непонимаю?
Надаже как это я незаметил. Перерыл же все, а в "customize" не полез. ![]()
Я его устанавливал отдельно.
Какая разница между ANSI (это кодовая страница?) и кодовой страницей 1251?
Насчет библиотек все ясно, спасибо. ![]() Насчет "WIN32_DEFAULT_LIBS". Рассмотрим известную нам WinAPI функцию CharToOem(). В MSDN содержиться следующая инфа: Minimum DLL Version: user32.dll Header: Declared in Winuser.h, include Windows.h Import library: User32.lib Minimum operating systems: Windows 95, Windows NT 3.1 Unicode: Implemented as ANSI and Unicode versions. В исходном коде мы включаем хидер windows.h. В нем есть ссылка на хидер Winuser.h. Тот в свою очередь содержит прототип этой функции и ссылку на нужную библиотеку. Разве линкеру недостаточно этой информации? Это сообщение отредактировал(а) main - 4.8.2006, 04:42 -------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
||||||||||||
|
|||||||||||||
rsm |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 2 Всего: 62 |
Там находятся описания функций, констант, структур и пр. WinAPI.
Если это функции-обертки вокруг функций WinAPI - тогда да, получается некое посредничество. Например, функция CRT "malloc" является оберткой вокруг функции WinAPI "HeapAlloc". В противном случае никакого посредничества нет, функции WinAPI вызываются напрямую.
В 1967 году ANSI (American National Standards Institute, "Американский Институт Национальных Стандартов") опубликовал первую редакцию стандарта ASCII (American Standard Code for Information Interchange, "американский стандартный код для обмена информацией"). Сей стандарт описывал кодовую страницу для букв американского алфавита, а так же некоторых дополнительных символов. Кодировка была 7-ми битной и соответственно могла включать до 128-ми символов. В дальнейшем, стандарт переработали и улучшили, назвав Extended ASCII ("расширенный ASCII"). В нем кодировка была уже 8-ми битной и включала соответственно до 256-ти символов. На основе стандарта Extended ASCII корпорация Microsoft разработала две группы кодовых страниц: одну группу для DOS и консольных программ (кодировки OEM-437, 720, 737, 775, 850, 852, 855, 857, 858, 862, 866, 874, 1258) и вторую группу для программ с GUI, не поддерживающих кодовых страниц стандарта Unicode (кодировки ANSI-874, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258). Мой тебе совет - не грузись сильно всей этой ботвой с кодировками. Ибо среди них такой бедлам, что сам Гейтс ногу сломит - кроме ANSI есть еще много организаций, разрабатывавших стандарты на кодовые страницы (ISO например); плюс есть еще и национальные кодовые страницы, заточенные под конкретный язык (например, KOI8-R для русского и KOI8-U для украинского); и так далее. Для программирования под Windows человеку русскоязычному вполне хватит знаний о существовании трех кодировок:
Прототип есть, а вот где ты там нашел ссылку? Или это ты так назвал строчку "#pragma comment(lib, "user32.lib")"? Линкер хидерами не пользуется, его удел - сборка из объектных (OBJ) файлов результирующего ЕХЕ-файла. Такой подход используется для обеспечения максимальной гибкости. Это сообщение отредактировал(а) rsm - 4.8.2006, 12:14 |
||||
|
|||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
Ты путаеш. В Pelles C входят два SDK (SDK это не название - это абривеатура: Software Development Kit): Platform SDK - разработка Microsoft, об этом писал rsm. Add-in SDK - разработка производителей Pelles, этот SDK используется для написания плагинов (Add-in) к Pelles. |
|||
|
||||
S.A.G. |
|
||||||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
2rsm
Насчет PSDK всеравно непонял.. может порекомендуешь хорошую книгу про PSDK(что это такое, как относиться к винде и для чего оно нужно) и кстати кодировки где бы было все хорошо расписано на доступном, понятном языке? Раз это все относиться к платформе Windows то может быть это книга про эту ОС? Не представляю как можно еффективно писать проекты без знания платформы.
Да, эта строчка будет выполнена если в программе будет объявлен символ "WIN32_DEFAULT_LIBS":
Но разве нельзя обойтись без этого условия? Так ведь делаеться в компиляторе от MS? Но если код функции CharToOem() находиться в user32.lib то зачем тогда user32.dll? Или в либе только ссылка? Если да тогда зачем столько промежуточных инстанций?
А кто пользуеться? Компилер? 2Damarus То что разные вещи понял - но что такое PSDK - нет. Это сообщение отредактировал(а) main - 6.8.2006, 01:23 -------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
||||||
|
|||||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |