LINUX.ORG.RU

Вопросы по C, и вообще.

 ,


4

9

Будем считать что я пишу прикладные программки.

  1. Как лучше обрабатывать malloc == NULL? Игнорировать или кидаться аbort() не хочется, но обработать нужно, обрабатывать каждый вызов?
  2. Писать свои строки или есть библиотека? Строки хранить как utf8 или utf32?
  3. Динамические массивы, писать свои, есть готовые? Как находить оптимальный размер для увеличение массива при расширении, нужно ли вообще заранее выделять память?
  4. Куда лучше выводить ошибку? Можно в консоль, но на винде не прокатит вроде, плюс ничего не видно.
  5. Нормальная ли идея: Есть много строк по 3-16 символов, сделать MyMemAllocate который при выделении (64 > X) байт, выделяет память в уже аллоцированном буфере на пару мегабайт к примеру... А при MyMemRealloc(X > 64) перемещает память из этого буфера в системную кучу. Перед данными хранить байт отвечающий за тип кучи.
  6. Когда структуру нужно передавать через стек а когда по указателю?
  7. на x86_64 быстрее uint32_t или uint64_t?
  8. for(...;i != len;...) vs for(...;i < len;...)
  9. Всегда ли ((unsigned)0-1) == ((unsigned)0-1)?
  10. На чем быстро рисовать графику (картиночки, кнопочки)? SDL2 говорят медленный.
  11. Есть много текста, с разным шрифтом, разным размером. Как лучше такое рисовать? (ttf), нарисовать алфавит для каждого {размер+шрифт}, или нарисовать алфавит с очень большим размером а потом сжимать для буков меньшего размера? Рендерит кто нибудь TTF на видеокарте кстати?
  12. Есть много объектов с одинаковыми и неизвестными именами, делать отдельную структуру (в виде чего?) где будут храниться эти имена дабы не занимать память одинаковыми строками?
  13. Как лучше хранить значения key:value что бы быстро с ними работать?
    1. если значений мало,
    2. если значений много.
  14. Можно ли как то поставить обработчик на изменение участка памяти? Костыль, но нужно. (Win/Linux хотя бы)
  15. Актуальна ли для современных систем фрагментация кучи?
  16. Какие библиотеки есть для многопоточного? Что можно почитать? SDL_Thread тоже медленный?
  17. Вот допустим решил я распарсить INI файл, как лучше его читать? По линиям? Сразу весь? Проецировать?
  18. Библиотека для RegExp?
  19. Какие флаги для строгости компилятора юзать стоит? Я использую: -std=c89 -Wall -pedantic

Ну или можно книжку где это расписанно.



Последнее исправление: beastie (всего исправлений: 2)

Ответ на: комментарий от RazrFalcon

То есть вы пишите прогу чисто для себя?

Нет, откуда такой вывод?

Чем меньше си прог - тем лучше

Начни с установки Haiku.

linuhs_user
() автор топика
Ответ на: комментарий от linuhs_user

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

Я тебя не уговариваю, можешь искать и тащить десяток зависимостей - одну для регэкспов, одну для юникогда, одну для тредов, а потом героически их дружить, потому что они были написаны разными студентами из разных вузов и не всегда их легко использовать совместно, вместо того, чтобы заюзать маленькую джилибку, в которой всё хорошо притёрто друг к другу. Можешь писать для всего этого свои костыли, по сути дела реализуя свой глиб, только костыльный и корявый. Единственное, что хочу сказать, что не стоит слепо верить всем подряд лоровским «экспертам», а то тебе сейчас тут насоветуют однобайтовых кодировок и гуй на нкурсе.

meliafaro ★★★★★
()
Ответ на: комментарий от linuhs_user

на си все удобное и готовое

В какой вселенной? Попробуйте изучить парочку других языков.

Так а что там мне заменит SDL2?

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

RazrFalcon ★★★★★
()
Ответ на: комментарий от meliafaro

Да я уже использовал ее. Но она падает при malloc == NULL к примеру (если я правильно понял) и все такое. Я не отказываюсь сразу же, просто говорю «не решение, тред продолжается».

linuhs_user
() автор топика
Ответ на: комментарий от linuhs_user

либо wchar_t

Why?

Это декодированные из байтов code point'ы. Ни в какой кодировке, чисто номера символов (системно-зависимые, правда). Предположение «1 wchar_t == 1 символ», правда, всё равно не выполняется. В любом случае, способ хранения зависит от применений. Никто не мешает взять libicu и оставить внутреннее представление тоже в байтах UTF-8.

Кнопочки? Быстро в каком смысле, для программиста (IUP!) или для компьютера?

Для компьютера приоритетнее.

Но зачем? Пользователь всё равно не сможет так быстро нажимать кнопочки, как компьютер будет их перерисовывать.

Быстрее всего, действительно, будет создать OpenGL-контекст и фигачить текстуры в видеопамять, но такая программа будет плохо (не-нативно) выглядеть на всех системах (мы же не делаем ещё один WinAmp?) и будет поддерживать только тот минимум средств ввода, о которых пришло в голову задуматься разработчику. А потом придёт какой-нибудь инвалид или азиат со своим особенным способом ввода символов, и программа у него не заработает (хотя у всей остальной системы ввод работает прекрасно).

Дайте больше информации. Универсального ответа нет. Если всё ещё хотите максимально быстро, пишите максимально тонкие системно-специфичные прослойки для каждой платформы, на которой хотите рисовать интерфейс.

anonymous
()
Ответ на: комментарий от RazrFalcon

В какой вселенной? Попробуйте изучить парочку других языков.

За ~5 лет домашнего программирования я попробовал много языков. На С я стал писать относительно недавно.

Внезапно - sdl имеет биндинги к чему угодно.

Внезапно SDL2 for Rust сильно отличается от Сишной версии и прекрасной документации с офф.сайте.

а не для гуи

Подходит и для GUI, да и SDL2 это не только рисовка.

linuhs_user
() автор топика
Ответ на: комментарий от anonymous

Пользователь всё равно не сможет так быстро нажимать кнопочки, как компьютер будет их перерисовывать.

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

со своим особенным способом ввода символов, и программа у него не заработает

У SDL2 есть Input хороший, он китайские или какие то такие тоже поддерживает.

Дайте больше информации.

Думаю сделать для рисовки два потока, будет буфер 'рисовальных' комманд. Один поток будет иметь окно и рисовать этот буфер (а как?), второй поток будет как раз писать комманды в буфер.

linuhs_user
() автор топика
Ответ на: комментарий от linuhs_user

Что именно Вы собираетесь отрисовывать так быстро, что стандартных способов рисования интерфейса оказывается недостаточно?

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

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

anonymous
()
Ответ на: комментарий от linuhs_user

За ~5 лет домашнего программирования я попробовал много языков

Таких же маргинальных?

Подходит и для GUI, да и SDL2 это не только рисовка.

Приведите примеры GUI софта написанного на SDL.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

что стандартных способов рисования интерфейса оказывается недостаточно?

Да не, всего там хватает просто я тогда плохо написал. Но рендер хочу побыстрее, нужно.

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

Окно не закрывалось) У SDL2 события сохраняются, но если закрыть в момент рисования то сначала выполнится рисовка а потом дойдет до обработки событий.

linuhs_user
() автор топика
Ответ на: комментарий от linuhs_user

Думаю сделать для рисовки два потока, будет буфер 'рисовальных' комманд. Один поток будет иметь окно и рисовать этот буфер (а как?), второй поток будет как раз писать комманды в буфер.

Используйте Qt и не морочьте голову.

RazrFalcon ★★★★★
()

Приведу свое мнение по поводy пары вопросов:

1. Я рекомендую стараться не выделять память динамически совсем. Очень часто можно представить сколько ее максимум отвести на ту или иную задачу и не выходить за рамки. Подталкивает думать как памяти O(1) использовать.

19. Тут я аскетичен:

-Wall -pedantic -std=iso9899:1990
-Wshadow -Wpointer-arith -Wcast-qual
-Wcast-align -Wstrict-prototypes
-Wmissing-prototypes -Wconversion
-Wsign-compare

dsl
()
Ответ на: комментарий от RazrFalcon

Таких же маргинальных?

С плюсов начинал.

Приведите примеры GUI софта написанного на SDL.

Я таких не знаю.

linuhs_user
() автор топика
Ответ на: комментарий от linuhs_user

Но рендер хочу побыстрее, нужно.

Но для чего нужно, рассказать не можете, потому что это коммерческая тайна?

Что происходило, если не поймать момент между перерисовками?

Окно не закрывалось) У SDL2 события сохраняются, но если закрыть в момент рисования то сначала выполнится рисовка а потом дойдет до обработки событий.

Я бы сказал, это проблема SDL2 и/или дизайна приложения, которое его использовало. Более быстрый рендер тут проблему не решит.

anonymous
()

И еще одна вещь резанула:

uint32_t и остальные появились только в C99, в ANSI C (тот что ISO/IEC 9899:1990) их нет

dsl
()
Ответ на: комментарий от anonymous

Но для чего нужно, рассказать не можете, потому что это коммерческая тайна?

Браузер пишу. Лол. Не смейтесь там!

Я бы сказал, это проблема SDL2 и/или дизайна приложения, которое его использовало.

Да так и в WinAPI.

linuhs_user
() автор топика
Последнее исправление: linuhs_user (всего исправлений: 1)
Ответ на: комментарий от dsl

Да я знаю все это, но почти каждая библиотека с поддержкой C89 реализует их...

linuhs_user
() автор топика
Ответ на: комментарий от RazrFalcon

Не культяпками едиными жив человек.

ТС, между прочим, спрашивал о С, а не С++. Если бы был он плюсером и ему было бы совсем насрать на себя, то пользовался бы культями.

anonymous
()
Ответ на: комментарий от RazrFalcon

Есть много игр с SDL/SDL2 GUI, недавно вышел Nuklear, к нему легко можно прикрутить SDLX, и? Мне все равно придется свой GUI делать, проще SDL2 or (SDL2+GL) тут взять.

Steam клиент на SDL2 вроде еще.

linuhs_user
() автор топика
Последнее исправление: linuhs_user (всего исправлений: 2)
Ответ на: комментарий от meliafaro

однобайтовых кодировок и гуй на нкурсе

таки что вы имеете против UTF-8 и nsurses? у вас на всех серверах гуй стоит? или вы не видели серьёзного софта и на своём домашнем ноутбуке только мышевозите?

Iron_Bug ★★★★★
()
Ответ на: комментарий от linuhs_user

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от linuhs_user

Браузер пишу.

помощь нужна? :) а то меня тоже задрало это безобразие, которое сейчас с браузерами происходит. и я всё думаю, что пора уже начинать писать свой.

Iron_Bug ★★★★★
()
Ответ на: комментарий от RazrFalcon

Понимаю, но ты сам такой вопрос задал. Если окно создается на SDL2, события обрабатываются SDL2, а рисовка на OpenGL это GUI на SDL2? Нет? Ну значит и забудь о том что я говорил про SDL2/GUI.

linuhs_user
() автор топика
Ответ на: комментарий от Iron_Bug

Я слишком далек от нормальной разработки, да и со своим опытом в полтора года буду якорем.))
Вроде проект https://github.com/lexborisov/Modest есть, там примерно такие же цели: https://habrahabr.ru/post/277031/
Но мне лично его подход не нравится, он пытается написать все сам а я наоборот.

Ну у меня времени много, буду продолжать совершенствоваться, пилить.

linuhs_user
() автор топика
Последнее исправление: linuhs_user (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

неосиляторы постоянно вопят, что он «опасный», или «сложный»

Точно. И неосиляторы принимаются свои языки придумывать, создавать для них вполне работающие трансляторы и библиотеки.

anonymous
()
Ответ на: комментарий от linuhs_user

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

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 2)

Куда лучше выводить ошибку? Можно в консоль, но на винде не прокатит вроде, плюс ничего не видно.

Так может использовать трассировку и закидывать все это дело в лог файл?

Zermond
()
Ответ на: комментарий от anonymous

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

потом приходят новые бодрые студенты-неосиляторы и снова пишут «новый блестящий крутой компилятор» и история повторяется. я это уже почти 30 лет наблюдаю.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 2)
Ответ на: комментарий от linuhs_user

и, кстати, есть же NetSurf. он вполне себе на ANSI C. и типа тоже с нуля. но недоделан местами. недоделки в плане криптографии, недоделки в поддержке жабаскрипта. ну, и на WM его иногда пучит. в остальном он работает и вполне даже шустро.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

ну, в подходе «написать всё сам» иногда бывают плюсы

Да я понимаю, но он хочет использовать свой рендер на любом чайнике и поэтому многое пишет сам, а у меня цель для пк браузер написать, и мне 'позволительно' использовать библиотеки для рисования, шрифтов, etc

linuhs_user
() автор топика
Ответ на: комментарий от Iron_Bug

Про большинство забывают, и это совершенно нормально. Если знать, как технический прогресс работает. Но не надо врать про «неосиляторов». Хотя религиозники все такие. «Предки и Святой Ритчи дали нам божественный C, не имеющий недостатков! Долой греховные новшества, ересь! На костёр!»

anonymous
()
Ответ на: комментарий от Iron_Bug

Смотрел на него, даже использовал некоторое время, но они изначально полностью отказывались от поддержки JavaScript, настраиваемости, а теперь пытаются все переделать как я понял) Ну и рендер у него немного тормозной если оценивать загрузку страницы. Вот хочу это все поправить.

linuhs_user
() автор топика
Ответ на: комментарий от anonymous

я ничего такого не заявляла. наоборот, это неосиляторы тут подняли вой по поводу «долой Си». и я просто поясняю реальное положение вещей для тех, кто думает, что он сейчас создаст язык-«убийцу Си»: это всё влажные мечты.

и, как правило, «долой Си» вопят те, кто банально не смог его осилить. что совершенно никак не отражается на разработке софта на Си. вот и вся простая правда жизни.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от linuhs_user

я не фанат жабаскрипта. и у меня он по умолчанию отключен. но современный веб без него в большинстве случаев не работает. поэтому отдельные скрипты для отдельных сайтов приходится всё же включать.

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

«Осилить С» - это научиться танцевать на минном поле и получать удовольствие от того, что мины не огорожены и танцевать не мешают? Ну, каждому своё.

red75prim ★★★
()
Ответ на: комментарий от Iron_Bug

Да у меня он тоже отключен по умолчанию, NoScript везде стоит. Но без него уже почти никуда и не зайти нормально, думал сначала написать совсем Ъ браузер без javascript и сомнительных вещей в css3 но куда с него заходить в современном вебе?) Наверное надо будет продумать вшитый аналог NoScript/Matrix.

linuhs_user
() автор топика
Ответ на: комментарий от RazrFalcon

OpenGL - это не только разноцветные треугольнички.

linuhs_user
() автор топика
Ответ на: комментарий от red75prim

да, а ваши песочницы (внезапно!) работают поверх ядра, которое непрерывно «танцует на минном поле» и кучи сишных библиотек. так что не плюй в колодец.

Iron_Bug ★★★★★
()
Ответ на: комментарий от linuhs_user

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от red75prim

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

а остальные будут скулить в сторонке о том, как «страшно писать на Си».

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.