The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Идеи по усовершенствованию реализации библиотек на языке Си, opennews (??), 17-Окт-10, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


11. "Идеи по усовершенствованию реализации библиотек на языке Си"  +1 +/
Сообщение от croster (ok), 17-Окт-10, 23:47 
Код может быть написан грамотно, но прибит гвоздями к Windows (Linux). Потом может кому и захочется на Linux (Windows) портировать, но затраты будут достаточно велики (а возможно и написать с нуля будет гораздо проще).
Ответить | Правка | Наверх | Cообщить модератору

35. "Идеи по усовершенствованию реализации библиотек на языке Си"  +1 +/
Сообщение от ананим (?), 18-Окт-10, 14:35 
это уже не грамотный код.
с точки срения стандартов.
к примеру fprintf есть в стандарте C, cin/cout есть в стандарте С++, а WWriteFile есть в стандарте только винапи.
первые доступны на любой платформе, последняя только на винде (вайны не в счет)

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

Ответить | Правка | Наверх | Cообщить модератору

39. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от Морозов Алексей (?), 18-Окт-10, 20:00 
> к примеру fprintf есть в стандарте C

Есть-то он есть, да кто ж его ест. В смысле, для того, чтобы правильно и _портабельно_ воспользоваться fprintf в нетривиальных случаях (с нетривиальными модификаторами/типоуказанием), надо не полениться заглянуть в man на фряхе, инфо на линуксе и MSDN на винде.

Ответить | Правка | Наверх | Cообщить модератору

45. "Идеи по усовершенствованию реализации библиотек на языке Си"  –1 +/
Сообщение от Аноним (-), 19-Окт-10, 00:07 
_портабельно_ - это как указанно в ANSI C стандарте. А он на всех платформах един ...
Ответить | Правка | Наверх | Cообщить модератору

46. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от Crazy Alex (??), 19-Окт-10, 00:15 
Та часть, которая предсказуемо работает на всех платформах, уж очень ограниченна. Учитывая, что даже на размер переменной не заложишься - а для разных размеров нужны разные модификаторы.
Ответить | Правка | Наверх | Cообщить модератору

54. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от ананим (?), 19-Окт-10, 11:56 
приведите пример "ограниченности".
пока только сферически-нетривиальные кони в вакууме.

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

зы:
про размеры переменных - это несчастный инт что ли?
1. его, инта, не та уж много. 2. а нахрена на размер закладываться? достаточно того, что его в любой момент можно подсчитать. 3. не пользуйтесь интом.

Ответить | Правка | Наверх | Cообщить модератору

57. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от Морозов Алексей (?), 21-Окт-10, 06:08 
> приведите пример "ограниченности".
> пока только сферически-нетривиальные кони в вакууме.

Нет, практический опыт написания низкоуровневых приложений (а иначе нахрена C ?)

> это во-первых.
> а во-вторых, портирование под платформу (а эти кони именно так и называются)
> никто не отменял. просто заморачиваться этим не стоит на первом этапе.

И, в результате "портирования" выясняется, что дешевле НЕ пользоваться всем из себя таким _портабельным_ , "ANSI-Сишным" и бла-бла fprintf и иже с ними, а нагородить свой велосипедик разной степени убогости, и в следующем проекте использовать именно его.

> зы:
> про размеры переменных - это несчастный инт что ли?
> 1. его, инта, не та уж много.
> 2. а нахрена на размер закладываться? достаточно того, что его в любой момент можно
> подсчитать.
> 3. не пользуйтесь интом.

Ох... В C им и так почти не пользуются. А пользуются, например, типом size_t. Или off_t. Или ещё какой int16_t. Итак, Вы, кажется, знаете, как "портабельно" напечатать в поток эти
чудесные типы данных? На всём многообразии платформ, для которых есть компиляторы C, хоть сколько-нибудь претендующие на "ANSI-Сишность". Рецепт, что называется, в студию!

Ответить | Правка | Наверх | Cообщить модератору

59. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от kshetragia (ok), 22-Окт-10, 05:25 
> Ох... В C им и так почти не пользуются. А пользуются, например, типом size_t. Или off_t. Или
> ещё какой int16_t. Итак, Вы, кажется, знаете, как "портабельно" напечатать в поток эти
> чудесные типы данных?

э-э-э... inttypes.h не?
По крайней мере это работает для linux/bsd x32/x64. Для винды похоже придется писать свой.

Ответить | Правка | Наверх | Cообщить модератору

63. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от Морозов Алексей (?), 22-Окт-10, 22:35 
>> Ох... В C им и так почти не пользуются. А пользуются, например, типом size_t. Или off_t. Или
>> ещё какой int16_t. Итак, Вы, кажется, знаете, как "портабельно" напечатать в поток эти
>> чудесные типы данных?
> э-э-э... inttypes.h не?
> По крайней мере это работает для linux/bsd x32/x64. Для винды похоже придется
> писать свой.

Задание, напомню, касалось вывода целочисленных типов в поток посредством "портабельного и ANSI-Сишного" fprintf & Co. inttypes.h не при делах, см. соседние сообщения

Ответить | Правка | Наверх | Cообщить модератору

71. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от kshetragia (ok), 25-Окт-10, 11:29 
гм.. уже посмотрел..

Ответить | Правка | Наверх | Cообщить модератору

60. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 22-Окт-10, 08:41 
> Ох... В C им и так почти не пользуются. А пользуются, например,
> типом size_t. Или off_t. Или ещё какой int16_t. Итак, Вы, кажется,
> знаете, как "портабельно" напечатать в поток эти
> чудесные типы данных? На всём многообразии платформ, для которых есть компиляторы C,
> хоть сколько-нибудь претендующие на "ANSI-Сишность". Рецепт, что называется, в студию!

Для size_t и ptrdiff_t в POSIX имеются варианты конверсии "z" и "t", соответственно. Для работы с целочисленными же типами есть inttypes.h; На тех платформах, где его нет изначально (Windows), можно взять готовый и адаптировать. Это будет заметно меньше работы, чем полностью городить свой огород, равно как и его поддерживать.

Ответить | Правка | К родителю #57 | Наверх | Cообщить модератору

61. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 22-Окт-10, 08:48 
>> Ох... В C им и так почти не пользуются. А пользуются, например,
>> типом size_t. Или off_t. Или ещё какой int16_t. Итак, Вы, кажется,
>> знаете, как "портабельно" напечатать в поток эти
>> чудесные типы данных? На всём многообразии платформ, для которых есть компиляторы C,
>> хоть сколько-нибудь претендующие на "ANSI-Сишность". Рецепт, что называется, в студию!
> Для size_t и ptrdiff_t в POSIX имеются варианты конверсии "z" и "t",
> соответственно. Для работы с целочисленными же типами есть inttypes.h; На тех
> платформах, где его нет изначально (Windows), можно взять готовый и адаптировать.
> Это будет заметно меньше работы, чем полностью городить свой огород, равно
> как и его поддерживать.

А если собирать не посредством VC++, то и таких проблем не возникнет.

Ответить | Правка | Наверх | Cообщить модератору

62. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от Морозов Алексей (?), 22-Окт-10, 22:30 
> Для size_t и ptrdiff_t в POSIX имеются варианты конверсии "z" и "t",

Спасибо, Капитан.

> соответственно. Для работы с целочисленными же типами есть inttypes.h; На тех
> платформах, где его нет изначально (Windows), можно взять готовый и адаптировать.
> Это будет заметно меньше работы, чем полностью городить свой огород, равно
> как и его поддерживать.

Вы хотите предложить таскать мне за собой гнутый рантайм (или сравнительно свежий BSD'шный). Что ж, это решение, покуда у вас есть "настоящая платформа". Как только дело начнёт касаться всяких аппаратно-программных недоразумений - тут внезапно и выяснится, что переносимость, а, главное, применимость гнутого рантайма - сильно преувеличена. Поспрашайте людей, пишущих под телефоны и прочие "имбеддеды".


Ответить | Правка | К родителю #60 | Наверх | Cообщить модератору

64. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от Морозов Алексей (?), 22-Окт-10, 22:39 
>> Для size_t и ptrdiff_t в POSIX имеются варианты конверсии "z" и "t",
> Спасибо, Капитан.

Ну и да, выше упоминается off_t, а не ptrdiff_t. Который, как известно, нынче скорее 64'битный "на линуксах", но, во-первых, и там необязательно и достигается дифайном при компиляции, и, во-вторых, кое-где - по-прежнему 32-х битный. Специального модификатора для него в POSIX'овом printf'е нет.

P.S. Замечу, от ANSI C-шного стандарта мы как-то тихой сапой уползли в POSIX. Что, замечу, существенно сокращает и выбор рантаймов, и выбор компиляторов для них.

Ответить | Правка | Наверх | Cообщить модератору

66. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 22-Окт-10, 23:15 
>>> Для size_t и ptrdiff_t в POSIX имеются варианты конверсии "z" и "t",
>> Спасибо, Капитан.
> Ну и да, выше упоминается off_t, а не ptrdiff_t. Который, как известно,
> нынче скорее 64'битный "на линуксах", но, во-первых, и там необязательно и
> достигается дифайном при компиляции, и, во-вторых, кое-где - по-прежнему 32-х битный.
> Специального модификатора для него в POSIX'овом printf'е нет.
> P.S. Замечу, от ANSI C-шного стандарта мы как-то тихой сапой уползли в
> POSIX. Что, замечу, существенно сокращает и выбор рантаймов, и выбор компиляторов
> для них.

<inttypes.h> входит в C99. Что ещё тут сказать? Да, не все компиляторы поддерживают C99. Если у кого-то нет inttypes.h в наборе разработчика, может взять из BSD-шного и, если возникнет такая необходимость, доработать.

Ответить | Правка | Наверх | Cообщить модератору

65. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 22-Окт-10, 23:07 
>> соответственно. Для работы с целочисленными же типами есть inttypes.h; На тех
>> платформах, где его нет изначально (Windows), можно взять готовый и адаптировать.
>> Это будет заметно меньше работы, чем полностью городить свой огород, равно
>> как и его поддерживать.
> Вы хотите предложить таскать мне за собой гнутый рантайм (или сравнительно свежий
> BSD'шный).

Всего лишь заголовочный файл.

> Что ж, это решение, покуда у вас есть "настоящая платформа".
> Как только дело начнёт касаться всяких аппаратно-программных недоразумений - тут внезапно
> и выяснится, что переносимость, а, главное, применимость гнутого рантайма - сильно
> преувеличена. Поспрашайте людей, пишущих под телефоны и прочие "имбеддеды".

Мимо. :)

Ответить | Правка | К родителю #62 | Наверх | Cообщить модератору

67. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от Морозов Алексей (?), 23-Окт-10, 04:43 
> Всего лишь заголовочный файл.

П-цаны, _откуда_ , _откуда_ , скажите, сделайте милость, всплыл этот дурацкий inttypes.h в вопросе форматирования сообщения fprintf'ом? Кое-кто здорово заменил исходную задачу той, с которой ему удобно сражаться, и понеслось...

> Мимо. :)

Это точно, точнее не скажешь.

Итого, подведём промежуточные итоги. Исходным тезисом являлось утверждение о том, что (ANSI-) C'шный рантайм обладает достаточной портабельностью и универсальностью, чтобы можно было не задумываясь применять его в широкопортабельных проектах (порты с Ubuntu/32 на Debian/64 не в счёт). В качестве примера такой универсальной функции приводился классический fprintf.

В результате 4 (четырёх) попыток ответа на вопрос, как отформатировать fprintf'ом вывод типов size_t, off_t и int16_t, я дождался от Вас только предложения форматировать size_t при помощи модификатора z (непортабельного в заметной степени), ненужных мне, в общем, сведений о том, как форматировать ptrdiff_t и предложения таскать за собой _реализацию_ fprintf'а из glibc (или *BSD libc или любой другой открытой реализации С-шного рантайма, непринципиально). Ещё Вы порадовали меня предложением не использовать MSVC++.

Мне кажется, Вы уже исчерпали допустимый лимит неправильных ответов на такой простой, не правда ли, вопрос?

Ответить | Правка | Наверх | Cообщить модератору

68. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 23-Окт-10, 05:04 
>> Всего лишь заголовочный файл.
> П-цаны, _откуда_ , _откуда_ , скажите, сделайте милость, всплыл этот дурацкий inttypes.h
> в вопросе форматирования сообщения fprintf'ом? Кое-кто здорово заменил исходную задачу
> той, с которой ему удобно сражаться, и понеслось...

Вы это серьёзно? Или вы в inttypes.h ни разу не заглядывали?


/* fprintf macros for signed integers */
#define PRId8                   "d"             /* int8_t */
#define PRId16                  "d"             /* int16_t */
#define PRId32                  "d"             /* int32_t */
#define PRId64                  "lld"           /* int64_t */

И т.д.

>[оверквотинг удален]
> классический fprintf.
> В результате 4 (четырёх) попыток ответа на вопрос, как отформатировать fprintf'ом вывод
> типов size_t, off_t и int16_t, я дождался от Вас только предложения
> форматировать size_t при помощи модификатора z (непортабельного в заметной степени), ненужных
> мне, в общем, сведений о том, как форматировать ptrdiff_t и предложения
> таскать за собой _реализацию_ fprintf'а из glibc (или *BSD libc или
> любой другой открытой реализации С-шного рантайма, непринципиально).

Вам что, очевидные вещи разжёвывать надо? Так за этим вы не по адресу, это к Марьиванне из детского сада. Или сделать

printf("%" PRIdLEAST64, some_value)
религия не позволяет? Или скажете, что это не даст гарантированно искомое?

> Ещё Вы порадовали меня предложением не использовать MSVC++.

Как самый простой способ не связываться с кастратом под названием msvcrt. Впрочем, в нём есть свои фишки, спорить не буду. Поэтому это было лишь предложение, для _поставленной_ задачи.

> Мне кажется, Вы уже исчерпали допустимый лимит неправильных ответов на такой простой,
> не правда ли, вопрос?

Да ну? А вы-то что умеете, кроме как задавать вопросы и напускать на себя важный вид?

(что-то я опять язвительный сверх меры... пойду-ка посплю)

Ответить | Правка | К родителю #67 | Наверх | Cообщить модератору

69. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от Морозов Алексей (?), 23-Окт-10, 11:38 
> #define PRId8                   "d"             /* int8_t */
> #define PRId16                  "d"             /* int16_t */
> #define PRId32                  "d"             /* int32_t */
> #define PRId64                  "lld"           /* int64_t */

Отлично. Вы эти макросы в реальной жизни пробовали применять? Впрочем, вижу, пробовали:

>

printf("%" PRIdLEAST64, some_value)
религия не позволяет?

увы, религия не позволяет. Потому что:

1. такой способ записи подходит только в лабораторных условиях. _Читать_ (а наглядность - главное достоинство printf-like форматирования) подобный код - задача не для слабонервных. Попробуйте туда засунуть ещё пару целочисленных значений, да с какими-нибудь модификаторами для разнообразия, и результат показать здесь. А потом оценить количество людей, которым понравится портабельность _такой_ ценой.

2. от того, что я придумаю макрос PRIdLEAST64 там, где его нет, "стандартная для платформы" реализация printf не научится волшебным образом понимать эти самые 64битные значения.

3. в исходной задаче говорилось про size_t, off_t и int16_t. Случай int16_t разобрали выше. Для size_t и off_t, по факту, требуется {configure/compile}-time проверки с выбором между этими типами, и "обычными" int/long/etc там, где рантайм не в курсе POSIX'овых умностей. Опять же, см. пп.1 и 2.

4. Впереди ещё форматирование многобайтных строчек и непрямое (через *) указание аргументов.

>>> Всего лишь заголовочный файл.
>> П-цаны, _откуда_ , _откуда_ , скажите, сделайте милость, всплыл этот дурацкий inttypes.h
>> в вопросе форматирования сообщения fprintf'ом? Кое-кто здорово заменил исходную задачу
>> той, с которой ему удобно сражаться, и понеслось...
> Вы это серьёзно? Или вы в inttypes.h ни разу не заглядывали?

Ну, макросов этих не помню, но, честно, они не помогают, см. возражения выше.

> (что-то я опять язвительный сверх меры... пойду-ка посплю)

Давайте. Авось, язвительность ненужная поутихнет.

P.S. буквально в среду разглядывал реализации такого форматирования сначала в сысоевском коде, а потом в ещё одном проекте, претендующем на переносимость. И чего это люди не горят использовать стандартные механизмы в своих проектах ;)

Ответить | Правка | К родителю #68 | Наверх | Cообщить модератору

70. "Идеи по усовершенствованию реализации библиотек на языке Си"  +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 23-Окт-10, 13:13 
>[оверквотинг удален]
>> #define PRId32                  "d"             /* int32_t */
>> #define PRId64                  "lld"           /* int64_t */
> Отлично. Вы эти макросы в реальной жизни пробовали применять? Впрочем, вижу, пробовали:
>>
printf("%" PRIdLEAST64, some_value)
религия не позволяет?

> увы, религия не позволяет. Потому что:
> 1. такой способ записи подходит только в лабораторных условиях. _Читать_ (а наглядность
> - главное достоинство printf-like форматирования) подобный код - задача не для
> слабонервных. Попробуйте туда засунуть ещё пару целочисленных значений, да с какими-нибудь
> модификаторами для разнообразия, и результат показать здесь. А потом оценить количество
> людей, которым понравится портабельность _такой_ ценой.

Этот вопрос не ставился. Был вопрос о реальности портабельности «родными» средствами языка. Это не говоря о том, что описываемые вами ситуации в рамках нормальной программы — редкость. Часто повторяющиеся *printf() выносятся в отдельные функции, и т.д. Впрочем, я могу не представлять себе какого-то проблемного класса программ — продемонстрируете?

> 2. от того, что я придумаю макрос PRIdLEAST64 там, где его нет,
> "стандартная для платформы" реализация printf не научится волшебным образом понимать эти
> самые 64битные значения.

Если «стандартная для платформы» реализация *printf не умеет понимать 64-битные значения (что, вообще говоря, нонсенс; пусть операции с 64-битными числами не будут атомарными, но они будут; впрочем, я не слишком большой спец в embedded-разработках), то и в программе не будет встречаться int64_t и иже с ним, так? Иначе ведь она всё равно на данной платформе даже не скомпилируется.

А если не будут встречаться 64-битные числа, то тогда используем макрос PRIdLEAST32... Ну и т.д.

> 3. в исходной задаче говорилось про size_t, off_t и int16_t. Случай int16_t
> разобрали выше. Для size_t и off_t, по факту, требуется {configure/compile}-time проверки
> с выбором между этими типами, и "обычными" int/long/etc там, где рантайм
> не в курсе POSIX'овых умностей. Опять же, см. пп.1 и 2.

Эм-м-м... Рантайм, он вообще, не в курсе size_t, off_t и так далее. Это чисто компиляторные заморочки. Оператор sizeof() ещё никто не отменял. Зачем делать выбор между типами size_t/off_t/etc. и int/long/etc., когда достаточно просто объявить size_t/off_t/etc. в случае их отсутствия (во время того же конфигурирования, или компиляции, например)?

> 4. Впереди ещё форматирование многобайтных строчек

А какое отношение имеют многобайтные строчки к размеру переменных? Для начала, какие у вас вообще строчки? char*? wchar_t*? А то вы всё пугаете, пугаете...

Стандартная библиотека предоставляет средства для форматирования строк в некоторых форматах. Если вам нужна экзотика — you're on your own, как в любой другой среде. Собственно, давно есть (портабельные, хе-хе) библиотеки для работы со специфическими кодировками, так что велосипед, опять же, изобретать не требуется...

> и непрямое (через *) указание аргументов.

И в чём здесь проблема? Не все платформы поддерживают? Ну простите... Возьмите тогда заодно точно так же BSD-шную реализацию *printf и таскайте с собой для таких случаев, в чём проблема-то? Не вижу серьёзных причин для того, чтобы всё с нуля переписывать.

>>>> Всего лишь заголовочный файл.
>>> П-цаны, _откуда_ , _откуда_ , скажите, сделайте милость, всплыл этот дурацкий inttypes.h
>>> в вопросе форматирования сообщения fprintf'ом? Кое-кто здорово заменил исходную задачу
>>> той, с которой ему удобно сражаться, и понеслось...
>> Вы это серьёзно? Или вы в inttypes.h ни разу не заглядывали?
> Ну, макросов этих не помню, но, честно, они не помогают, см. возражения
> выше.

Они помогают, а единственное возражение было — «плохо читается». Хотя в общем случае я с этим аргументом согласен (удобочитаемость кода очень важна), всё же позволю себе заметить, что использование альтернативной системы для форматирования строк повышает сложность программы, что тоже не есть гуд.

> P.S. буквально в среду разглядывал реализации такого форматирования сначала в сысоевском
> коде, а потом в ещё одном проекте, претендующем на переносимость. И
> чего это люди не горят использовать стандартные механизмы в своих проектах
> ;)

Это их выбор, я их не спрашивал, вы, по всей видимости, тоже (иначе бы не вопрос задавали, а давали факты). Люди ещё пишут тысячи однотипных CMS на PHP, и эти CMS от своего количества лучше не становятся.

Ответить | Правка | К родителю #69 | Наверх | Cообщить модератору

58. "про fprintf"  +/
Сообщение от Морозов Алексей (?), 21-Окт-10, 06:18 
Да, готовьтесь к тому, что во второй части нашей увлекательной викторины "а умеешь ли ты программировать на C" мы коснёмся таких интересных возможностей, как fprintf и многобайтные строки, возможность непрямого указания аргументов и других вроде бы стандартизованных возможностей *printf

Ответить | Правка | К родителю #54 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру