2014 dxdy logo

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

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




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


27/08/16
5107
Seman в сообщении #1344764 писал(а):
Улавливаете разницу?
Нет.
Такой уж это рантайм. Урезанный и не позволяющий использовать стандартный С в полном объёме.

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


29/12/13
127
Такой или какой?

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


27/08/16
5107
Seman в сообщении #1344772 писал(а):
Такой или какой?
Такой. Посмотрите на название проекта. Я согласен с автором проекта, что название адекватно.

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


20/08/14
5591
Россия, Москва

(О задачах для мелких МК)

Seman в сообщении #1344662 писал(а):
Боюсь спросить, но спрошу. Почему и зачем чистый asm ? Что это за контроллеры ? К ним СИ шного компилятора нет?
Ну например недавно закончил прогу для PIC10F200, в наличии 256 команд и 16 байтов памяти и две ячейки стека для вызовов процедур. А надо пофильтровать шум с двух входов, удлинить входные импульсы, переключаться между входами, ещё и время считать. Чтобы компилятор С уложил всё это в 256 команд?! Да бросьте. А я на асме уложил в 90 команд вместе с начальной инициализацией процессора. И даже не использовал ни одной процедуры (не понадобилось, нет повторяющихся кусков кода), всё в теле main(). Данный МК выбран заказчиком из соображений размера корпуса (SOT23) и цены (чуть ли не самый дешёвый МК в мире). Как видно остался ещё нехилый запас по возможностям.

AVR tiny13 применяю массово (когда памяти хватает), а там 512 команд. Например ваттметр зарядки аккумулятора от солнечной батареи, измерение напряжения и тока, подсчёт мАч и Втч, вывод инфы на малопотребляющий сегментный ЖК индикатор, всё с батарейным питанием, живёт от старого телефонного Li-Ion уже месяца 3 и ещё проживет полгода-год. Занято 70% ёмкости памяти программ. Чистый асм. С под него конечно есть, но в 512 байт уложить да с использованием стандартных функций ... это без меня. Там одна printf займёт под 5 сотен команд и прога банально не влезает в память (только что проверил самый короткий вариант), у меня вывод чисел в 5-ти форматах занимает 110 команд.
Т.е. и на С под этот МК пишу конечно, и сильно чаще, но даже и тогда многие стандартные С-шные функции заменяю своими с минимально необходимой функциональностью.

В прерываниях почти всегда даже на С использую полностью асм процедуру: очень существенно экономятся такты - а это скважность и средний ток потребления, для батарей\аккумуляторов это критично, я не занимаюсь андроидами с ежедневной зарядкой, предпочитаю работать неделями/месяцами/годами, и именно такие задачи наиболее часты.
Во многих применениях, даже в казалось бы мощных устройствах, ток тоже сильно ограничен и такты экономить приходится, чтобы уложиться в заданные пределы по мощности в спящем режиме, когда всё равно надо выполнять кучу действий. Банальный пример - управление 40Вт блоком питания стандартного офисного светодиодного светильника. Сколько жрать в работе не волнует, а вот в выключенном состоянии - очень даже волнует, при том что надо опрашивать кучу внешних сигналов на просыпание, далеко не все из которых распознаются аппаратно. И при стоимости всего БП в 1000р никто не даст мне туда поставить высокоэффективный DC-DC, хорошо если вместо обычной за 5р нормальную микропотребляющую кренку за безумные для кренки 40р дадут ... Вот и получается что при 40Вт экономить приходится десятки мВт, при почти полной функциональности. :facepalm:

Учить меня обработке строк и замене '$'->'\0' не нужно.
Да и на остальное отвечать не буду, только не забывайте что кроме лично вашей колокольни в мире есть и другие и не всегда там всё ровно так же.

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


29/12/13
127
realeugene в сообщении #1344774 писал(а):
Seman в сообщении #1344772 писал(а):
Такой или какой?
Такой. Посмотрите на название проекта. Я согласен с автором проекта, что название адекватно.
такой, вот, минимальный рантайм без стандартных функций. И разницы между ним и libc(стандартной библиотекой c, куда стандартные функции таки входят), вы не улавливаете? Есть стандартные функции или их нет, или они есть, но не только стандартные, разницы нет? И почему одно называть другим не всегда уместно(особенно когда речь про printf) тоже не понимаете?

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

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

warlock66613 в сообщении #1344673 писал(а):
Если передать ограничивающий спецификатор - не начнёт.
начнет.
Используется синтаксис C
include <stdio.h>

int main()
{
    char char_arr0[100] ; //массив символов
    char char_arr[]={'-','%','.','4','s','-','-', '\n' }  ; //массив символов c ограничителем строки
    memset(&char_arr0[0],'z',100) ; // заполним первый массив символом 'z'
    printf(&char_arr[0],"строка") ; // помещает символы строки в массив, не более четырех байт по ограничителю(два символа для utf8), и далее выводит до нуля или исключения
    return 0 ;
}

вывод в linux(в windows чуть отличается, но тоже самое)
Используется синтаксис Bash
-ст--
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz�

 


warlock66613 в сообщении #1344735 писал(а):
Это неважно как вы это назовёте. Важно, что встретив в программе char buf[2048] вы не можете сразу сказать, предполагается ли там нуль в конце или нет.
Важно стараться называть вещь своими именами. (мы и так плохо понимаем друг друга) . Тут уже давали цитату из стандарта. Я повторю, но чуть больше:
Цитата:
A string is a contiguous sequence of characters terminated by and including the first null character. The term multibyte string is sometimes used instead to emphasize special processing given to multibyte characters contained in the string or to avoid confusion with a wide string. A pointer to a string is a pointer to its initial (lowest addressed) character. The length of a string is the number of bytes preceding the null character and the value of a string is the sequence of the values of the contained characters, in order.


у вас char buf[2048] - массив, а не строка . важно понимать это и не сувать его куда попало и как попало.

Dmitriy40 в сообщении #1344876 писал(а):
А надо пофильтровать шум с двух входов, удлинить входные импульсы, переключаться между входами, ещё и время считать. Чтобы компилятор С уложил всё это в 256 команд?! Да бросьте.

У вас шум фильтруется и импульсы удлиняются на СИ или на АСМе ?

Dmitriy40 в сообщении #1344876 писал(а):
Учить меня обработке строк и замене '$'->'\0' не нужно.

А зачем такие вопросы задаете?

Для чего это спрашивали:
Dmitriy40 в сообщении #1344250 писал(а):
А если в массиве могут быть строки не только с нулём на конце (а и например с символом '$' как было кое-где в DOS)? Делать по макросу на каждый вариант окончания или назвать макрос сразу SYMBOL_SUFFIXED (сразу учесть в названии и не однобайтовые символы)? А если может заканчиваться не байтом, а к примеру двумя нулевыми байтами (как бывает для списка строк ровно из одной строки :facepalm:, если вдруг её надо передать в функцию обрабатывающую лишь списки строк, типа переменных окружения в DOS при запуске программы)?

???

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


02/08/11
5493
Seman в сообщении #1345009 писал(а):
printf - стандартная сишная функция, которая определена стандартом, и должна быть в стандартной библиотеке, если вы ей где-то не можете пользоваться, то это нестандартно
Глубоко копаете! Но если, как вы говорите,
Seman в сообщении #1345009 писал(а):
речь про СИ
то давайте всё же определимся - про тот Си, на котором Linux написан? Если да, то что-то не сходится. Вы же понимаете, что в ядре (написанном на Си) никакого libc нет? И printf нету, и malloc, к примеру, тоже.
Seman в сообщении #1345009 писал(а):
И корректную работу printf, если вы ей передаете что попало никто не гарантирует.
Определённо так, но я такого бреда как в вашем кодеснипете не предлагал. Нуль-символ - не единственный способ сказать printf где надо остановиться, но это не значит, что можно вообще никаким образом конец строкисимвольного массива (так пойдёт?) не отмечать, и что printf в состоянии магическим образом угадать где надо остановиться. И нет, printf не помещает символы в массив, может вы перепутали с sprintf?

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


29/12/13
127
warlock66613 в сообщении #1345024 писал(а):
Вы же понимаете, что в ядре (написанном на Си) никакого libc нет? И printf нету, и malloc, к примеру, тоже.

Конкретно эти есть. в нестандартном виде, но есть. kmalloc, printk (и строки тоже нультерминированые)
Цитата:
When writing drivers, you cannot in general use routines which are from the C Library. Some of the functions have been found generally useful and they are listed below. The behaviour of these functions may vary slightly from those defined by ANSI, and these deviations are noted in the text.

https://www.kernel.org/doc/htmldocs/ker ... /libc.html
Вопрос интересный. Ядро это нестандартная вещь(в том смысле, что отличается обычных программ, тем что остальные работают поверх ядра, libc(стандартная библиотека) сама использует вызовы ядра, остальные программы используют её ), написано на разных С.

Я предлагаю, а давайте сначала разберемся с базовыми типами и терминами. Без этого мы увязнем.
1) Вот строка это любая последовательность символов или только нультерминированая? Я настаиваю на нультерминированости т.к. так принято, большинство людей кто пишут на си из этого исходят, так определено стандартом, так заточены стандартные библиотеки.
2) Вы любой массив объявленный с char будете строкой или чем-то имеющим отношение к тексту считать?

-- 10.10.2018, 03:53 --

warlock66613 в сообщении #1345024 писал(а):
Определённо так, но я такого бреда как в вашем кодеснипете не предлагал. Нуль-символ - не единственный способ сказать printf где надо остановиться, но это не значит


Я понимаю, что вы не предлагали. Важно, printf - принимает строку первым параметром, которая нультермированная и остальные параметры, которые не всегда обязательны и могут быть разными. Вот, попробуйте ей передать первым параметром, который должен быть строкой, что-то другое, не нультерминированое и так чтобы она остановилась.

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


20/08/14
5591
Россия, Москва
Seman в сообщении #1345009 писал(а):
У вас шум фильтруется и импульсы удлиняются на СИ или на АСМе ?
Вся программа в 90 команд на асме (и убогом, всего 35 разных команд, это вам не CISC x86! Вы ж писали что знакомы с AVR, в том числе его ассемблером, пики на него достаточно похожи). Под фильтрацией шума я имел в виду срабатывание лишь от импульсов заданной длительности (константный интервал времени), прочие (шум) игнорируются.

Seman в сообщении #1345009 писал(а):
А зачем такие вопросы задаете?
Чтобы проиллюстрировать, причём не Вам, другие возможные варианты, которые плохо подходят к предложенному паттерну (выбор имени макроса). Это не были вопросы "как сделать", это были примеры "посмотрите что будет с вашим предложением на вот этих данных и оцените его неудобство".

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


29/12/13
127
Dmitriy40 в сообщении #1345040 писал(а):
Вы ж писали что знакомы с AVR, в том числе его ассемблером, пики на него достаточно похожи
C avr знаком, но ни с пиками, ни с вашим проектом, ни с вами незнаком. поэтому мне сложно.

Dmitriy40 в сообщении #1345040 писал(а):
Под фильтрацией шума я имел в виду срабатывание лишь от импульсов заданной длительности
ну извините, виноват, что телепатией не владею. и все же, что за импульсы и от чего импульсы приходят?

Dmitriy40 в сообщении #1345040 писал(а):
Чтобы проиллюстрировать, причём не Вам, другие возможные варианты, которые плохо подходят к предложенному паттерну (выбор имени макроса).
Про не вам, ну это же открытый форум, тематическое обсуждение, любой может принять участие в обсуждение. Разве нет?

Странно и страшно выглядят ваши слова. я вот решил пообсуждать. Так вот, arseniiv предлагал макрос:
arseniiv в сообщении #1344229 писал(а):
#define ZERO_SUFFIXED(n) ((n)+1)
char s[ZERO_SUFFIXED(3)];
Ваше первое же:
Dmitriy40 в сообщении #1344250 писал(а):
А если в массиве могут быть строки не только с нулём на конце (а и например с символом '$' как было кое-где в DOS)?

В примере, считывается из файла. считывается scanf,scanf - считывает строки и считает, что строка нультерминированая последовательность, поэтому что прочиталось то scanf дополняет нулем. С чего бы scanf стала бы дополнять строки чем-то другим?
Может речь про файл такого содержимого:
Используется синтаксис Text
12345$12345$12345$

Это как-то разумней. Тут полно вариантов, можно использовать scanf и макрос arseniiv'a
Используется синтаксис C
///....
char arr[ZERO_SUFFIXED(5)];
///....
scanf("%5[^$]$s",arr) ;  
//...
 

Можно читать в буфер, объявив его предварительно макросом arseniiv'a и читать дальше по 6 байт и парсить, например strok, как я уже сказал. все это довольно банально и очевидно. Вы говорите, что умеете со строками работать, о чем тогда вопрос? Какие могут быть недостатки макроса по этому вопросу, тем более имени? Имени макроса ? Имя плохое? Но как имя может быть связано символом конца строки? Что вы хотели сказать?

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


27/08/16
5107
Seman в сообщении #1345009 писал(а):
И почему одно называть другим не всегда уместно(особенно когда речь про printf) тоже не понимаете?
Жду от вас детального конструктивного объяснения, что именно я не понимаю, иначе буду воспринимать эту вашу фразу как попытку троллинга.

 !  GAA:
Предупреждение за флейм. См. модераториал ниже.

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


29/12/13
127
realeugene в сообщении #1345070 писал(а):
Жду от вас детального конструктивного объяснения, что именно я не понимаю, иначе буду воспринимать эту вашу фразу как попытку троллинга.

Это был вопрос. И я написал, про что. почему libc называть рантаймом не всегда уместно, понимаете ?
троллите по моему вы.

-- 10.10.2018, 10:05 --

и я даже, может понимаю почему. типа, что я с придирками к людям пристал тут?

 !  GAA:
Предупреждение за флейм. См. модераториал ниже.

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


27/08/16
5107
Seman в сообщении #1345078 писал(а):
Это был вопрос. И я написал, про что. почему libc называть рантаймом не всегда уместно, понимаете ?
Я уже ничего у вас не понимаю. Делайте конструктивные утверждения и доказывайте их качественной аргументацией, или идите к чёрту. Ваши "вопросы" не интересны. Вы нарушаете правила ведения дискуссии.

 i  GAA:
Ветка закрыта. При желании обсудить конкретные темы, пожалуйста, создайте ветки (в соответствующих разделах: по ЯВУ в разделе «Программирование», по низкоуровневому программированию в “Hardware”) с четко сформулированной (и максимально узкой) темой в начальном сообщении. Не обвиняйте друг друга в троллинге, если не желаете быть заблокированными.

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

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



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

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


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

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