LINUX.ORG.RU

чистый Си

 


2

3

Всем добра. Учусь программированию под линукс, знаю что нет ничего лучше чем практика. Пересел из микроконтроллеров, поэтому практически все нужно осваивать заново. Много гуглил но так и не смог найти примеры работы как загрузить веб контент, json или код html, и cookie на чистом си под линукс. а также как отправлять cookie. Киньте пример или ссылку на него, только рабочий пример пожалуйста, так как для меня это новые ворота.

Ответ на: Т.е., деградация настолько далеко зашла... от Moisha_Liberman

А чему же тогда этот инструмент тождественен? Постойте, дайте угадаю... Питону? Джавке с джаваскриптом? Чему по-вашему он тождственен-то, откройте тайну, хоть поржём? =)))

От это логика. Значит все что написано на С - это С. Питон написан на С. Все пишем на питоне (который и есть С) мву-ха-ха. /Thread

anonymous
()

Много гуглил но так и не смог найти примеры работы как загрузить веб контент, json или код html, и cookie на чистом си под линукс. а также как отправлять cookie. Киньте пример или ссылку на него, только рабочий пример пожалуйста, так как для меня это новые ворота.

Си - это язык для пацанов. json/html - это пхп-ламерков. Зачем тебе всё это днище?

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

На Си нельзя обойти поля структуры. Ну нет в языке такого механизма.

Ну как же ж нету? Их куча. Можно хоть свою написать, хоть готовую взять. Например, Glib HashTable. Чем не структура? Можно в неё сколько угодно полей добавить и все их обойти.

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

От это логика. Значит все что написано на С - это С. Питон написан на С.

Да.

Все пишем на питоне (который и есть С) мву-ха-ха. /Thread

Амёба вскукарекнула ахинею и думает, что это что-то значит - нет, ты обделался. С чего ты взял, амёба, что из «питон - си» следует «си - питон»?

Давай попроще, а то ты совсем тупой. Ты - обезьяна? Да. Обезьяна - ты? Нет.

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

Амёба вскукарекнула ахинею

Защекан не умеет в логику? Как быть даким как ты дебилушкой ?

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

И зачем мне их "обходить"?

Если я могу их тупо считать?

struct some_struct_t {
    int a, b;
    char *some_string;
}

void serialize_some_struct(struct some_struct_t *x, struct buffer *output) {
    serialize_int(x->n, output);
    serialize_int(x->m, output);
    serialize_string(x->string, output);
}

/* Далее надо расписать serialize_int(), serialize_string(), 
 * описать buffer, но мне лень, чесслово. И так ясно что мне   
 * "обход" тут в пень не вбился.
 */ 

Ыаааа! Нет миханизьма! Низзя! Низзя! =)))

Это решит вашу задачу.

Конечно решит. «Я мистер Вульф, я решаю проблемы» © Но кто сказал что язык должен решать за меня какие-то проблемы? Кто вообще сказал что в контексте решения какой-либо задачи они у меня вообще есть, эти проблемы? И что делать, если их в контексте решаемой задачи в принципе нет? Решать? Т.е., задачи нет, но Вы, главное, решайте их? Так по-вашему?

Да тем-то язык и уникален что если проблем нет, то нет и их решения. Если проблемы есть, то подразумевается что программист в состоянии их решить. Он за это вообще-то, на секундочку, деньги получает на свой высокий уровень жизни. Ну либо он их не решит, тогда и денег ему платить не за что. Вот и вся лубофь. =)

Moisha_Liberman ★★
()
Последнее исправление: Moisha_Liberman (всего исправлений: 1)
Ответ на: И зачем мне их "обходить"? от Moisha_Liberman

И зачем мне их «обходить»? Если я могу их тупо считать?

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

anonymous
()
Ответ на: И зачем мне их "обходить"? от Moisha_Liberman

Вам никто не навязывает ничего. И вообще Си прекрасен. Но механизма такого в нем нет. Написать это нельзя. Нет соответствующих выразительных средств языка.

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

Имеется в виду языковой механизм. struct.

Сэр, вы придираетесь к словам. Это два разных вопроса.

Первый вопрос — по ключевому слову «struct»: можно ли на Си описать структуру ключевым словом struct, а потом обойти её поля? Ответ: в принципе, можно (кодогенерация, макросы, адресация по смещению, парсинг исходников или любой другой хак на своё усмотрение). Без таких вот специальных инструментов — нельзя. Но на таких условиях ни на каком языке это сделать нельзя, ни на python ни на java нельзя обойти поля сишной структуры, описанной ключевым словом «struct». Да и на Си так тоже никто делать не будет, там где нужен обход полей, не будут использовать struct.

Второй вопрос — по принципиальной возможности: можно ли на Си хоть каким-то образом создать структуру, в которой можно обойти все поля? Ответ: да, можно, в Си можно создавать структуры с динамическим перечислимым набором полей, например, Glib HashTable.

anonymous
()
Ответ на: И зачем мне их "обходить"? от Moisha_Liberman

Наивный ты человек, мойша. Ты бы мог помножить макак на ноль одним вопросов - «покажи не на си» и эти клопы разбегутся, но ты решил геройствовать. Ты оппонируешь не какому-то язык, ни чему-то реальности, а вранью. Шизофазии ламеров. Они могут что угодно придумать, ведь они не ограничены чем-то конкретным. Ты же ограничен.

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

Всегда забавляло понятие "выразительности"...

Применительно к языку программирования. Если мы о practical expressivity, то С достаточно выразителен (не для всех, да), т.к. код на нём читается и понимается легко и просто, следовательно, идеи, реализованные в каком-то алгоритме, так же понимаются легко и просто.

Если мы о theoretical expressivity, то ссылки на литературу, показывающую как именно те или иные идеи могут быть реализованы в С, я уже давал выше. Чуваки даже в функциональном стиле умудряются.

Так что, видимо, просто не дано отдельным бойцам. Но это на С да, ни как не влияет.

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

Возможно.

Но мне интересно хотя бы относительно практическое решение той или иной задачи. Чтобы не объяснять что без самого по себе похапе или джавки на машине мне будет несколько сложно реализовать сериализации в данных языках. Т.е., без пары тонн говнокода, которые мне на машине на фиг не убились. И которые я просто ставить не буду. Мне хватает сишных либ. Они хотя бы не весят тонны и не норовят для здравствуймира сожрать все ресурсы системы. =)))

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

Если хочется, чтоб обходили именно аналоги сильных структур, то на D можно уже сейчас, на C++, вероятно, станет возможным (предложения в стандарт есть).

А так, в рантайме можно и в java и в питоне, да почти год угодно.

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

Зачем их копипастить?

У Вас есть несколько структур (не столь суть с динамическим перечислимым полей или нет). Для каждой структуры, точнее, для каждого элемента структуры в зависимости от его типа у нас есть соответствующая ф-я, отвечающая за сериализацию данного типа. Всё. Дальше мы просто как аргументы передаём что мы именно хотим сериализовать (какой элемент какой структуры) и куда. Т.е., результат работы ф-ии определяется её входными аргументами. И больше ни чем. Зачем Вам копипастить структуры-то?

Т.е., функция, ответственная за сериализацию типа int или string одна, а структур, с которыми она работает, может быть произвольное число. Копипастить-то зачем?

Moisha_Liberman ★★
()
Ответ на: Всегда забавляло понятие "выразительности"... от Moisha_Liberman

Если мы о theoretical expressivity, то ссылки на литературу, показывающую как именно те или иные идеи могут быть реализованы в С, я уже давал выше. Чуваки даже в функциональном стиле умудряются.

А можно ещё раз ссылку про функциональный стиль на C? На такое интересно хотя бы взглянуть...

anonymous
()
Ответ на: Зачем их копипастить? от Moisha_Liberman

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

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

Я бы тут всё-таки апеллировал к Оккаму.

Зачем плодить сущности без необходимости?

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

Похоже на оправдание: не хочу ничего учить, что преподавали после школы, то и буду хвалить, и мечтать о зарплате в сотку =)

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

Нет, не нужно.

Пример выше. Я там написал:

/* Далее надо расписать serialize_int(), serialize_string(),

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

Могу даже serialize_some_struct модифицировать сходным образом (т.е., изменять её поведение в зависимости от аргументов на входе).

Т.е., по факту, не так много и писать. Но уж точно не копипастить.

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

Почему же нет-то?

Можно конечно. С 1997г. можно, как ни странно. =))) Обмазывайтесь — https://research.utwente.nl/files/5128727/book.pdf Это, ЕМНИП, версия 6.8 данного издания. Но трезвых идей,кстати, в ФП полно. Например, минимизация side effects. Чумовая вещь.

Moisha_Liberman ★★
()
Ответ на: Почему же нет-то? от Moisha_Liberman

С 1997г. можно, как ни странно. =))) Обмазывайтесь — https://research.utwente.nl/files/5128727/book.pdf Это, ЕМНИП, версия 6.8 данного издания.

Листаю... простые функции... рекурсия... битовые операции, условия... Надоело. Перематываю в середину книги... массивы, cons-списки, функции с переменным числом параметров... Перематываю ближе к концу... Рисование множества мандельброта прямыми вызовами X Toolkit!

Это, безусловно, впечатляет. Но, честно говоря, это выглядит как учебник для начинающих сишников, которые уже знают SML. Я вижу там функции, вижу программирование. А где там функциональное программирование-то?

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

Хммм...

Скажите, аноним, а как на Ваш взгляд должно было бы выглядеть ФП на С? Может, надо было не «полистать», а «почитать»? =) А то да, там картинок мало, можно сказать вообще почти нет. =)))

Moisha_Liberman ★★
()
Ответ на: Не вопрос. от Moisha_Liberman

Тут бы лучше например и для начала найти книгу M. Kerrisk. The linux programming interface

Она же вроде по 2.6 ядру. Не устарела?

anonymous
()
Ответ на: Нет, не нужно. от Moisha_Liberman

Т.е., по факту, не так много и писать.

Но писать нужно. Для каждой структуры. Но было бы неплохо, если бы средства языка позволяли просто в статике(ну чтоб рантайме это стало просто смещением от адреса структуры) пройтись по полям произвольной структуры. Тогда такую сериализацию можно было бы написать один раз и она бы работала для любой структуры. Возможно, пришлось бы ещё задать правило, что делать с полями-указателями(следовать ли по нему и сериализации данные, работать как с одиночным значением или как с массивом и т.п.).

anonymous
()

Как всегда, ощущение, что к опорному псто прикрепили комментарии из совершенно другого треда.

Virtuos86 ★★★★★
()

Не нужно путать уровень абстракции и уровень языка. На высокоуровневом языке тоже можно получать бинари весящие считанные байты.

vlad9486
()

«Закат солнца вручную» нафиг не нужен в клиентском сетевом коде. Требования по гибкости и нагруженности не те. На серверной стороне баррикад - совсем другой сказ. Сишечка цветет, пахнет и сдавать свои позиции не собирается. В системной, виртуализационной и сервисно-мидлварной ипостасях, разумеется: прикладной код и там не пишут на Ц.

Если плеванина и ругань в этой ветке тебя не остановила - читай статьи и недописанную книгу покойного упорыша по имени Pieter Hintjens, он же автор ZeroMQ и тулкита czmq. У него довольно интересный подход к разработке легковесных сетевых сервисов голыми руками и без тонн зависимостей. И, конечно же, уходи и не задавай лишних вопросов, пока не перечитаешь исходники nginx.

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

Нет.

1 В языке в 80% (если не больше) случаев мне лично это всё на фиг не нужно было бы. В остальных случаях выход из положения находится очень просто. Просто читается элемент структуры и с ним что-то делается. Как обычно. Какие-то выморочные практики тут на фиг не нужны. Нам нужен всенепременно «обход элементов структуры»? Ok, покажите как это выглядит на Ваш взгляд (в идеале) и объясните чем это лучше чем простое чтение элементов структуры как в примере выше, которое спокойно и без напряга производится в рантайме.

2 Непонятен этот техно-фетишизм. Фетишизм не понятен в принципе, но с приставкой «техно» он ещё и довольно смешно выглядит. Ну ладно, предположи, простого чтения элементов структур Вам не достаточно, Вам нужен всенепременно «обход элементов структуры». Произвольной, ага... =))) Скажите, а что, в Вашем понимании сериализация как таковая это просто «обход элементов произвольной структуры» или там (в самой сериализации) ещё что-то должно быть? Ну, например, сохранение состояния сериализируемого объекта где-то? Возможно и по сети? Т.е., Вы на полном серьёзе предлагаете в язык вкрячить тот же xml-rpc, SOAP, COM или CORBA? У меня для Вас скорбная весть. Они уже есть эти технологии и ими уже во всю пользуются. Что делать, если мы хотим сохранить состояние объекта не по сети, а в простой файл, локально? Предлагаете заново изобрести операции файлового ввода-вывода применительно к задачам сериализации? Почему? Ну потому, что если уж маятся хернёй, так до конца. Если мы хотим изобрести «обход элементов структуры», т.к. слишком велика нагрузка на мозги от «чтения элемента структуры», то давайте будем до конца логичными и ещё изобретём методы для сохранения состояния объектов (универсальные, не забываем!). Не напрягает вот такая чушь? А это, по сути, именно то, к чему Вы и призываете. Потому что сериализация это всё-таки чтение состояния объекта и сохранение этого самого состояния. Одного без другого просто и тупо не бывает.

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

4

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

Зачем? У нас же должно быть «универсальное решение, пригодное для всех случаев жизни»? Ну вот и надо как пыхеры, не парясь. У них serialize($array); возвращает строку. И совершенно похер что там в строке может быть. Вот Вам пример Единственно Правильного, для всех случаев жизни применительного решения. Идиотизм это. Тут даже доказывать и обсуждать извините, но нечего.

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

Да нет. Нормально.

От курения манов не освобождает в любом случае.

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

На высокоуровневом языке тоже можно получать бинари весящие считанные байты.

Примеров бы пару-тройку не помешало бы.

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

Да https://github.com/jorisvink/kore

If you would like to build a specific flavor, you can enable those by setting a shell environment variable before running make.

    TASKS=1 (compiles in task support)
    PGSQL=1 (compiles in pgsql support)
    DEBUG=1 (enables use of -d for debug)
    NOTLS=1 (compiles Kore without TLS)
    NOHTTP=1 (compiles Kore without HTTP support)
    NOOPT=1 (disable compiler optimizations)
    JSONRPC=1 (compiles in JSONRPC support)
    PYTHON=1 (compiles in the Python support)

Note that certain build flavors cannot be mixed together and you will just be met with compilation errors.
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

Тут уже был банальнейший пример - обход структуры. Язык Си не позволяет это выразить.

Это — ложь.

В зависимости от трактовки вопроса, либо Си позволяет, либо никакой другой язык не позволяет, потому что другом языке нет аналога Си struct.

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

Ты что за анонизмус такой тупой?

Если в С нельзя обход структуры сделать, то и ни в каком другом языке нельзя!

Ты не думал, как это в том же говнопхытоне реализовано? Правильно! Через задницу.

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

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

C++, Rust

Как-то сложно считать C++ и Rust высокоуровневыми языками по нынешним временам, особенно Rust.

Да и размеры бинарников со статической линковкой там не такие уж маленькие, особенно в C++, особенно если без -fno-exceptions и -fno-rtti.

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

D позволяет, C++ на подходе. Структурки там такие же как в си.

Нет, не такие. В Си структуры — это последовательность байт в памяти, которым раздали имена для прямой адресации. А в С++ структуры — это разновидность класса, и их внутренняя реализация в памяти по большому счёту не известна. Например, знаете ли вы, как и где в памяти в С++ хранятся виртуальные функции структур/классов?

Если в С нельзя обход структуры сделать, то и ни в каком другом языке нельзя!

Просто почти ни в каком языке нет аналога struct из Си.

Ты не думал, как это в том же говнопхытоне реализовано? Правильно! Через задницу.

Нет, в говнопхытоне нет struct-ов. Есть dict-ы — ассоциативные хеш-массивы. Питоновые классы — их частный случай. А ассоциативный хеш-массив есть и в Си, например glib HashTable.

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

У меня есть несколько догадок, но мне, честно, интересно увидеть и твой вариант.

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

Если в С нельзя обход структуры сделать, то и ни в каком другом языке нельзя!

Что за глупости? В D точно такие же структуры:

D structs and unions are analogous to C's.

C code often adjusts the alignment and packing of struct members with a command line switch or with various implementation specific #pragmas. D supports explicit alignment attributes that correspond to the C compiler's rules. Check what alignment the C code is using, and explicitly set it for the D struct declaration.

И вы можете написать обход структуры через __traits(allMembers, my_struct)

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

В геймдеве std не используют, а без него там копейки. Что в C++, что в Rust.

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

Ну так я и в С могу сделать ту же чережнопность, что в этих говноЯПах!

Просто указываем новый тип данных, у которого будут поля «заголовок», «тип» и собственно данные (void*). Складываем это в список.

Вуаля — получили «структуру», которую можно «обходить»!

Хотя, кому в своем уме может это понадобиться вообще? Смысл?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.