2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней. На страницу Пред.  1 ... 3, 4, 5, 6, 7  След.
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 10:01 


27/08/16
9426
warlock66613 в сообщении #1344680 писал(а):
нулевой символ может быть в названии файла.
Чё? В названии файла? :facepalm:
Пожалуйста, приведите конкретный пример операционки и системной функции в ней, в которых разрешены нулевой символ ('\0') в названии файла.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 10:07 
Заслуженный участник


02/08/11
6874
realeugene, да, вы правы, пример неудачный: действительно в имени файла нельзя нулевой символ использовать.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 10:13 


27/08/16
9426
Seman в сообщении #1344662 писал(а):
Боюсь спросить, но спрошу. Почему и зачем чистый asm ? Что это за контроллеры ? К ним СИ шного компилятора нет?
Не ко мне, но отвечу. Вообще говоря, в мире микроконтроллеров существует всякая китайчатина или древность без сишного компилятора. Во-вторых, для того же AVR встречается код при обработке прерываний или дёрганье ногами, где нужно считать отдельные такты. В этом случае ASM незаменим. В-третьих, самые простые и дешевые микроконтроллеры, вкусные для больших серий с простыми задачами, традиционно сильно ограничены по ресурсам, и даже стандартный printf для них слишком жрущий.

UPD Да и Dmitriy40 упоминал микроамперы. Потребляемый ток тоже может быть причиной использовать более простой микроконтроллер с ограниченными ресурсами.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 10:35 
Заслуженный участник


02/08/11
6874
Seman в сообщении #1344662 писал(а):
Но речь про СИ . printf - стандартная сишная функция
Если вы в каком-то случае пользуетесь C, это ещё не значит, что вы можете пользоваться сишным рантаймом.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 10:47 


27/08/16
9426
Munin в сообщении #1344573 писал(а):
Многие Un*x/GNU продукты унаследовали идеологию прошлых времён: многотомные зубодробительные man-ы. Это, кстати, в огород интерфейсу командной строки: на настройку "на лету по месту, с нулевыми начальными знаниями" он не способен. Впрочем, к счастью, на телефонах командной строки и нет (почти).
Кстати, поэтому не стоит путать системы для профессиональных разработчиков с массовыми программами для конечного потребителя. Командно-строчные утилиты в Линуксе во многих случаях удобнее утилит с GUI под теми же виндами. Конечно, после того, как прочитал man-ы и набрался опыта.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 11:26 


29/12/13
306
warlock66613 в сообщении #1344673 писал(а):
Я так говорил про один конкретный совет

Я говорил про один ваш совет и остальные не ваши.

warlock66613 в сообщении #1344673 писал(а):
Юникс писался на том, что обычно называется K&R C, а Линукс - на ANSI C или C99
Юникс был разный, первый или первые написаны вообще на asm, последующие писались на разных СИ, и первые bsd и современные free bsd это тоже unix. Да, K&R C, отличался, суть языка не очень, с89, с99, с11, с18 различий сильно принципиальных в языке нет, речь я вел про них. Я имел ввиду с с89, книги K&R C со второго про него, ansi c . Я ошибся со ссылкой, не посмотрел на что ссылаюсь, я читал третье наверное или второе издание, про ansi C , причем давно, но я помнил что там стилем называется оформление, я нашел гуглом первую книжку, запросом с нужным и текстом и кинул ссылку. Но это по ссылке оказалось первое издание, это действительно другой СИ. Я вообще не программировал на K&R C, в те славные годы я был совсем ребенок. Но эта цитата про стиль есть и в третьем(которая ansi):
Цитата:
Си-компилятор не обращает
внимания на внешнее оформление программы, но наличие в нужных местах отступов и пробелов
существенно влияет на то, насколько легко она будет восприниматься человеком при просмотре.
Чтобы лучше была видна логическая структура выражения, мы рекомендуем на каждой строке
писать только по одной инструкции и с обеих сторон от операторов ставить пробелы.
Положение скобок не так важно, хотя существуют различные точки зрения на этот счет. Мы остановились на одном из нескольких распространенных стилей их применения. Выберите тот,
который больше всего вам нравится, и строго ему следуйте.
Большая часть вычислений выполняется в теле цикла.


warlock66613 в [url=http://dxdy.ru/post1344673.html#p1344673 писал(а):
Например, решить, использовать ли errno для возврата ошибок из своих функций.

А как это связано с языком? В тех unix`ах, которые писались на K&R C там, такое должно уже быть.

И да строки, это строки. И в СИ они нулем терминированные и printf стандартная функция, прям совсем стандартная прям в стандарте, которая работает со строками как с нуль терминированными. Но вы можете ей передавать, что угодно, но не нультерминированую, если вы даже в неё вставите ограничитель(я сомневаюсь, что конкретно вы сумеете), но если вдруг, она будет все равно печать пока не наткнется на ноль или кусок памяти которому она не может обращаться. Да. И не нультермированной строки быть не может, может быть только массив символов или указатель на блок памяти. И функциях которые стандартные для работы строк, работают со строками, а которые не со строками те для другого. Я отдохну, расскажу подробней, с примерами. А libc, вас кто рантаймом называть научил?

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 11:31 


27/08/16
9426
Seman в сообщении #1344703 писал(а):
А libc, вас кто рантаймом называть научил?

Например: https://support.microsoft.com/en-us/hel ... -will-link

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 11:34 


29/12/13
306
realeugene в сообщении #1344705 писал(а):
Например


Так это не только libc. там есть стандартная libc cо стандартными функциями, а есть не со стандартными msvcrt, например.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 11:37 


27/08/16
9426
Seman в сообщении #1344706 писал(а):
Так это не только libc.

И чё?
Библиотеки поддержки исполнения, реализующие стандартные функции языка (кроме математических функций), обычно на сленге называются рантаймом.

С/С++ можно использовать без стандартного рантайма, но с урезанным функционалом. Впрочем, какие-то вспомогательные библиотеки всё равно обычно требуются, без них даже два целых числа перемножить может не получиться.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 11:49 


29/12/13
306
realeugene в сообщении #1344708 писал(а):
Seman в сообщении #1344706 писал(а):
Так это не только libc.

И чё?
Библиотеки поддержки исполнения, реализующие стандартные функции языка (кроме математических функций), обычно на сленге называются рантаймом.

ondllexit и прочие из msvcrt, - не есть стандартные. рантайм это именно набор библиотек для работы программы собранной под виду, виндовым компилятором и компановщиком полностью. можно скомпилировать часть с той же printf с libc, а часть чем то другим например вход на asm и скомпонавать без msvcrt. т.е. printf из майкрософтского libc, а остальное нет, т.е. без полного майкрософтского рантайма,

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 11:55 


27/08/16
9426
Seman в сообщении #1344715 писал(а):
ondllexit и прочие из msvcrt, - не есть стандартные. рантайм это именно набор библиотек для работы программы собранной под виду, виндовым компилятором и компановщиком полностью. можно скомпилировать часть с той же printf с libc, а часть чем то другим например вход на asm и скомпонавать без msvcrt.
Прежде всего, почему вы пишете, что только под винду? Под линуксом тоже используется этот термин. Как пример: https://github.com/lpsantil/rt0

Во-вторых, atexit - это давно стандартный функционал С. Как и malloc/free.

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

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 12:31 
Заслуженный участник


02/08/11
6874
Seman в сообщении #1344703 писал(а):
И не нультермированной строки быть не может, может быть только массив символов или указатель на блок памяти.
Это неважно как вы это назовёте. Важно, что встретив в программе char buf[2048] вы не можете сразу сказать, предполагается ли там нуль в конце или нет.
И да, для Си использовать нуль-терминированные строки - естественно, но программа может быть собрана из кусков, написанных на разных языках, и в современных языках строки обычно без нуля на конце. И если они при этом всё же UTF-8 (а не -16 или -32), то лишний раз делать копирование, чтобы этот нуль добавить, совершенно излишне - потому что Си может отлично работать и с такими строками тоже.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 13:00 


10/04/12
704
Seman в сообщении #1344703 писал(а):
И да строки, это строки. И в СИ они нулем терминированные и printf стандартная функция, прям совсем стандартная прям в стандарте, которая работает со строками как с нуль терминированными.


В C есть строковые констаны, которые вполне допускают в себе нулевой символ: "test\0test", но при этом обязательно зананчиваются нулевым символом. Но есть исключение — если мы инициализируем массив фиксированной длины, то если нелувой символ не помещается то его и не будет :)

Обычно в библиотечную функцию передаётся указатель, а сама библиотечная функция имеет соглашения по поводу того, что она принимает. Некоторые функции требуют, чтобы параметр была строка, которая оканчивается нулём. Некоторые просят длину, и нуль может использоваться как досрочное окончание строки. Не обязятельно все строки заканчиваются нулём, в некоторых случаях мы можем задавать длину строки (например, strncmp прекрасно будет работать для строк, которые не заканчиваются нулём, хотя нуль может использоваться в качестве досрочного окончания строки и остаток будет игнорироваться). Некоторые функции memchr довольствуются только длиной и не обрабатывают как-то отдельно нулевой символ.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 13:24 


30/01/17
245
ISO/IEC 9899:201x 7.1.1 Definitions of terms писал(а):
1 A string is a contiguous sequence of characters terminated by and including the first null character.

 Профиль  
                  
 
 Re: Странное поведение оператора if else в языке Си
Сообщение09.10.2018, 13:38 


29/12/13
306
realeugene в сообщении #1344717 писал(а):
Под линуксом тоже используется этот термин. Как пример: https://github.com/lpsantil/rt0


Я ещё отвечу на все подробней, пойже. Внимательно, посмотрите на что ссылаетесь этот минимальный рантайм без libc, соответственно без printf и большинства стандартных функций. Улавливаете разницу? В винде в vc в рантайм включена и libc со стандартыми си функциями, и стандартные функции c++ и много всего. А здесь по вашей ссылке наоборот функций пять, чтобы обеспечить минимальную работоспособность. рантайм это библитека среды выполнения , туда разное может быть включено, а libc - стандартная библиотека С , со стандартными функциями.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 102 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group