LINUX.ORG.RU

Вышла YAFL-0.30.2

 , , , ,


1

2

Сегодня состоялся третий релиз библиотеки YAFL.

YAFL — это библиотека, написанная на Си, содержащая несколько алгоритмов Калмановской фильтрации, распространяемая под лицензией Apache-2.0.

Библиотека ориентирована на применение во встраиваемых системах на базе микроконтроллеров с аппаратной поддержкой вычислений с плавающей точкой. Для прототипирования и оценки библиотеки создано расширение python yaflpy.

По сравнению с YAFL-0.20.0 произошли следующие изменения:

  • Минимальная размерность вектора состояния теперь равна одному.
  • Добавлен расчёт логарифмического правдоподобия при обновлении наблюдения.
  • Добавлен вывод человекочитаемых статусов в лог при возникновении ошибок времени выполнения.
  • Исправлено несколько ошибок.
  • Расширение yaflpy теперь доступно в PyPi, его можно поставить командой pip install yaflpy.

>>> Подробности

★★★★★

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

Ладно, музыку шумную выравнивать :)
Я про вот это.

  • typedef struct {...} yaflUKFFullAdapiveSt

Вот так лучше

  • typedef struct {...} yafl_ukf_full_adapive_st

У меня от первого варианта жопа болит :)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Хотя это лично мои проблемы, а школьник-кун крутой.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Code of conduct шикарен! Позаимствую его (если не текст, то идею написать именно в таком ключе и кратко — без мата в заголовке разве что).

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

Сегодня состоялся третий релиз библиотеки YAFL. YAFL — это библиотека, написанная на Си, содержащая несколько алгоритмов Калмановской фильтрации, распространяемая под лицензией Apache-2.0.

Библиотека ориентирована на применение во встраиваемых системах на базе микроконтроллеров с аппаратной поддержкой вычислений с плавающей точкой. Для прототипирования и оценки библиотеки создано расширение python yaflpy.

Вот так и надо писать новости. Сразу понятно, что такое YAFL, и зачем оно нужно. Зашёл похвалить автора за хорошую работу.

Ghostwolf ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Теперь жопа не будет болеть

-----------------------------------------------------------
local project_url = 'git@github.com:shkolnick-kun/yafl.git'
local project_dir = 'yafl'
local project_tag = 'yafl'
local project_src =
{
    '/src/yafl.h',
    '/src/yafl.c',
    '/src/yafl_math.h',
    '/src/yafl_math.c',
}
-----------------------------------------------------------
local pro_u = project_url
local pro_d = project_dir
os.execute('git clone '..pro_u..' '..pro_d..' 2>/dev/null')
-----------------------------------------------------------
local ignored_list = {}
local replace_list = {}
for id,filename in ipairs(project_src) do
    local file = assert(io.open(project_dir..filename));
    local code = assert(file:read('*a'));
    for word in code:gmatch('(%w+)') do
        if word:find(project_tag) and word ~= project_tag then
            if not ignored_list[word] then
               ignored_list[word]=true;
               local nword = word:gsub('(%u)(%l)','_%1%2');
               nword = nword:gsub('(%l)(%u%u)','%1_%2');
               nword = nword:lower();
               table.insert(replace_list,{new=nword,old=word})
            end
        end
    end
    file:close();
end
-----------------------------------------------------------
table.sort(replace_list,function (a,b)
     return #a.new < #b.new
end)
print('/*-----------------------------------------------*/')
for i,v in ipairs(replace_list) do
    print('#define '..v.new..' '..v.old)
end
print('/*-----------------------------------------------*/')
------------------------------------------------------------
dron@gnu:~/Рабочий-стол/autolow$ lua tolow.lua 
/*-----------------------------------------------*/
#define yafl_int yaflInt
#define yafl_float yaflFloat
#define yafl_ukf_st yaflUKFSt
#define yafl_status_en yaflStatusEn
#define yafl_ekf_base_st yaflEKFBaseSt
#define yafl_ukf_base_st yaflUKFBaseSt
#define yafl_ukf_merwe_st yaflUKFMerweSt
#define yafl_kalman_funcp yaflKalmanFuncP
#define yafl_ukf_sigma_st yaflUKFSigmaSt
#define yafl_ukf_rob_funcp yaflUKFRobFuncP
#define yafl_ukf_robust_st yaflUKFRobustSt
#define yafl_ukf_julier_st yaflUKFJulierSt
#define yafl_ekf_robust_st yaflEKFRobustSt
#define yafl_ukf_sigma_addp yaflUKFSigmaAddP
#define yafl_kalman_base_st yaflKalmanBaseSt
#define yafl_ekf_adaptive_st yaflEKFAdaptiveSt
#define yafl_kalman_rob_funcp yaflKalmanRobFuncP
#define yafl_ukf_adaptived_st yaflUKFAdaptivedSt
#define yafl_kalman_res_funcp yaflKalmanResFuncP
#define yafl_ukf_full_adapive_st yaflUKFFullAdapiveSt
#define yafl_ukf_sigma_methods_st yaflUKFSigmaMethodsSt
#define yafl_kalman_scalar_updatep yaflKalmanScalarUpdateP
#define yafl_ukf_sigma_gen_sigmasp yaflUKFSigmaGenSigmasP
#define yafl_ukf_adaptive_robust_st yaflUKFAdaptiveRobustSt
#define yafl_ekf_adaptive_robust_st yaflEKFAdaptiveRobustSt
/*-----------------------------------------------*/
dron@gnu:~/Рабочий-стол/autolow$
LINUX-ORG-RU ★★★★★
()

Библиотека ориентирована на применение во встраиваемых системах на базе микроконтроллеров с аппаратной поддержкой вычислений с плавающей точкой

А на тупых МК без неё работает?

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

Очень плохо :( Такое yaflUKFFullAdapiveSt просто даже читать очень трудно, а без автодополнения вводить просто невозможно.

Мне тоже с подчёркиваниями иногда не нравится, порой слишком длинно.
Но это легко писать и легко читать. Есть пограничные случаи когда ВотТакое терпимо.
Например в SDL1/2/3 Там два три слова и они длинные и SDL_CreateWindow,
но тоже не айс лучше привести к sdl_create_window и не мучаться.
Но опять же, это чисто мой бзик. Кому как.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Werenter

А чё бы не работать то, чистая сишка. Можно попробовать на ATmega8 залить и там погонять, но пока лениво.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от shdown

Эт мелочи. Никто не мешает писать на C99 используя подходы C89. Любой компилятор сожрёт. Ну разве что для красоты причесать.

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

Я понимаю, что так можно делать. Вопрос в том, зачем так делать.

Нигде не нашёл информацию о том, под какую версию Си это написано.

Ну и ещё идентификаторы, начинающиеся с _X, где X — это символ в верхнем регистре, зарезервированы (например, _Bool, _Generic). Но это тоже «мелочи».

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

Был мощный документ fido Policy. Это явная отсылка к полиси.

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

Нет версий Си, есть версии компиляторов. Ни один из компиляторов не мешает программисту использовать _X для чего угодно. А объявление перед использованием - это просто хороший стиль чтоб не превращать код в помойку.

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

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

Устарело. Со времен 90го фортрана уже давно капсом не пишут и отступ на семь символов не используют. :) Посмотри примеры из Numeric Recipes :)

gns ★★★★★
()

YAFL — это библиотека, написанная на Си

Дальше читать не стал, какое то очередное дерьмо. На С я всё пишу сам, как не крути так лучше.

Herabora
()

А чисто практически, если есть запись лекции с кассетного диктофона с шумами, то насколько хорошо этот фильтр шумы убирает?

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

Нет версий Си

Тогда что описывают соответствующие тексты стандартов? Для чего в компиляторах ключ -std=?

, есть версии компиляторов.

В смысле gcc 12.2.0? При чём они тут?

А объявление перед использованием - это просто хороший стиль чтоб не превращать код в помойку.

Нет, у тебя просто какой-то стокгольмский синдром от C89. Можешь назвать сколько-нибудь популярный проект на C99 или выше, который использует подобный «хороший стиль чтоб не превращать код в помойку»?

Ни один из компиляторов не мешает программисту использовать _X для чего угодно.

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

Это то же самое неопределённое поведение, которое уже сто раз обсуждали.

https://en.cppreference.com/w/c/language/identifier

The following identifiers are reserved and may not be declared in a program (doing so invokes undefined behavior):

1. The identifiers that are keywords cannot be used for other purposes. In particular #define or #undef of an identifier that is identical to a keyword is not allowed.

3. All identifiers that begin with an underscore followed by a capital letter or by another underscore (these reserved identifiers allow the library to use numerous behind-the-scenes non-external macros and functions).

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

Ну уж говна... Осталось хорошо работающее и проверенное годами.

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

Тогда что описывают соответствующие тексты стандартов? Для чего в компиляторах ключ -std=?

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

В смысле gcc 12.2.0? При чём они тут?

При том что исходник может компилироваться gcc 12, но не компилироваться gcc 2. Значит этот исходник для новых gcc. Так же следует учитывать всё многообразие флагов. Но если по теме, то библиотека скорее всего совместима с максимально возможным количеством компиляторов.

Можешь назвать сколько-нибудь популярный проект

Не надо вот на апеляции к авторитетам переходить. Объявление в середине кода в большинстве случаев приводит к помойке в коде. Это моё заявление никак не зависит от того, какие там у кого привычки.

Это то же самое неопределённое поведение, которое уже сто раз обсуждали.

В реальных компиляторах (например gcc) - вполне себе определённое. Никакой магии над такими идентификаторами в них не заложено.

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

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

Получается, ты придрался к словам «версия языка», вместо которых, по-твоему, нужно было сказать «версия стандарта». Однако я не понимаю, в чём разница. Каждый стандарт описывает отдельный язык. Они даже в общем случае не совместимы друг с другом (выпилили gets в C11).

Не надо вот на апеляции к авторитетам переходить. Объявление в середине кода в большинстве случаев приводит к помойке в коде. Это моё заявление никак не зависит от того, какие там у кого привычки.

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

В реальных компиляторах (например gcc) - вполне себе определённое. Никакой магии над такими идентификаторами в них не заложено.

Язык (_Bool, _Generic).

Расширения GNU C (_Float128).

Промежуточные сущности между языком и реализацией (функции для деления __int128).

Реализация (_GLOBAL_OFFSET_TABLE_, _IO_stdin_used).

Манглинг в C++ (_Z1hic).

Названия для inline-функций, которые компилятор не осилил заинлайнить, а назвать их как-то нужно.

Продолжать? Там же специально пояснение написано: “these reserved identifiers allow the library to use numerous behind-the-scenes non-external macros and functions”.

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

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

Нет, всё не так. Скорее вообще не следовало спрашивать этот бесполезный вопрос.

Однако я не понимаю, в чём разница. Каждый стандарт описывает отдельный язык. Они даже в общем случае не совместимы друг с другом (выпилили gets в C11).

Разница в том, что эти так называемые стандарты описывают мифический несуществующий язык. На самом же деле gets вообще никак с языком не связано, это функция glibc или другой системной библиотеки. И она разумеется есть во всех системах.

что неуместное использование глобальных переменных

Причём тут глобальные переменные? Речь была про объявление перед использованием.

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

Ты какую-то чушь написал.

Язык (_Bool, _Generic). Расширения GNU C (_Float128).
...

И что? А есть ещё int, это тоже ключевое слово и никакого подчёркивания в нём нет. Повторю - подчёркивание и заглавная буква сами по себе никакой роли не имеют. Просто не надо переиспользовать в идентификаторах ключевые слова, вне зависимости от того, с подчёркиванием они или без. Если ты вздумаешь назвать переменную int или static - у тебя код даже не скомпилируется.

И повторю ещё раз: если речь про препроцессор, то можно даже ключевые слова подменить, например введя #define int float - и это гарантированно будет работать с любым вменяемым компилятором.

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

Нет, всё не так. Скорее вообще не следовало спрашивать этот бесполезный вопрос.

По-твоему, вопрос «под какую версию стандарта Си написана эта библиотека?» бесполезный. Его не следовало спрашивать. Я не понимаю твою логику.

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

Если я напишу

for (int i = 0; i < 10; ++i)
то к i я смогу обратиться только внутри цикла. А если напишу
int i;
for (i = 0; i < 10; ++i)
то не только внутри. А ты ещё и выступаешь за переиспользование таких переменных, если циклов несколько, что явно «превращает код в помойку» таким же образом, как и глобальные переменные.

И что?

То, что нет никаких гарантий по поводу идентификаторов, которые стандарт определяет как зарезервированные, лол.

А есть ещё int, это тоже ключевое слово и никакого подчёркивания в нём нет.

Keywords — это первый пункт того перечисления.

можно даже ключевые слова подменить, например введя #define int float

Нельзя, это undefined behavior (дал ссылку на перечисление выше).

и это гарантированно будет работать с любым вменяемым компилятором

А если не будет, то компилятор невменяем. Вроде проходили уже это с переполнением интов.

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

то не только внутри

Верно. И в этом нет ничего плохого.

А ты ещё и выступаешь за переиспользование таких переменных

Откуда ты узнал? Я тут этого не писал. Но да, лучше переиспользовать.

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

Нет. Просто нет лишних надписей «int». И кстати да, сувать везде int без разбору это очень плохо.

То, что нет никаких гарантий по поводу идентификаторов, которые стандарт определяет как зарезервированные, лол.

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

Keywords — это первый пункт того перечисления.

И второй и третий тоже keywords. Четвертый частично про libc которая не часть языка, частично про системный идентификатор. Не суть.

Нельзя, это undefined behavior (дал ссылку на перечисление выше).

Нет, можно. Не надо врать. Или приведи мне пруфы - хоть один немаргинальный компилятор, который сломается от #define int float.

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

Откуда ты узнал? Я тут этого не писал.

В этом топике не писал, а на ЛОРе где-то писал.

Нет. Просто нет лишних надписей «int».

Я поэтому и не хотел вступать в спор, просто указав, что так больше никто не делает. О чём спорить, если ты на аргумент (spooky action at distance универсально считается чем-то плохим в программировании, а ты выступаешь за spooky action at distance, только в пределах одной функции) говоришь просто «нет»? Ну нет — так нет.

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

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

Нельзя, это undefined behavior (дал ссылку на перечисление выше).

Нет, можно. Не надо врать. Или приведи мне пруфы

Тезис: согласно стандарту, определение макроса, имя которого совпадает с ключевым словом, является undefined behavior. Иными словами, согласно стандарту, программа, в которой написано #define int float, может сделать что угодно.

Тезис: использование undefined behavior считается плохой практикой. Код, полагающийся на это, может сломаться при переходе от одной версии компилятора к другой. Примером может служить signed overflow. Когда-то не существовало компиляторов, на которых код со знаковым переполнением мог сломаться. Однако это всё ещё было undefined behavior и так делать не следовало.

С каким их этих тезисов ты будешь спорить? Какие пруфы тебе нужны, помимо тех, что я уже привёл?

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

spooky action at distance универсально считается чем-то плохим в программировании

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

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

Это был риторический вопрос. Ответ на него в следующей же фразе.

Тезис: согласно стандарту

А я тебе опять повторю: отвлекись от этой графомании, в которой может быть написано что угодно, и посмотри на реальные компиляторы. Реальные компиляторы нигде не нарушают абстракцию под названием «препроцессор», а у препроцессора ключевое слово всего одно - defined. Всё остальное для него - идентификаторы, равноправные (а если не использовать #if - то просто токены, и даже defined - уже не ключевое слово). Строчка #define int float означает, что во всём последующем тексте токен int следует заменить на токен float, что и будет безусловно сделано.

Код, полагающийся на это, может сломаться при переходе от одной версии компилятора к другой

Почти любой код может сломаться при переходе к другой версии компилятора. Даже более того - при смене опций компиляции.

Примером может служить signed overflow.

Это как раз пример того, что компилятор надо настраивать под нужды программиста - там есть опции -fstrict-overflow, -fwrapv, описанные в мануале.

С каким их этих тезисов ты будешь спорить?

Ты неявно вплёл в них третий: авторитетным источником понятия undefined behaviour является С-комитет. Вот этот тезис и есть корень проблем.

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

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

Английский — непонятный язык. ОК.

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

https://en.wikipedia.org/wiki/Action_at_a_distance_(computer_programming)

Google Translate в помощь, если непонятно. Глобальные переменные там тоже упоминаются.

Это был риторический вопрос. Ответ на него в следующей же фразе.

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

Почти любой код может сломаться при переходе к другой версии компилятора. Даже более того - при смене опций компиляции.

{{Citation needed}}. Можешь показать хоть один проект, который заявляет «да, у нас тут непортируемый код, его нужно собирать обязательно вот этой версией вот этого компилятора вот с такими опциями»?

Ты неявно вплёл в них третий: авторитетным источником понятия undefined behaviour является С-комитет. Вот этот тезис и есть корень проблем.

Кто ещё может являться авторитетным источником этого понятия? Разработчики компиляторов? Я что-то не видел, чтобы они публиковали какой-то альтернативный стандарт.

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

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

Google Translate

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

Не мешает, но если так напишешь, то гарантии на то, что получится, нету

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

реализацией

Что это такое вообще?

{{Citation needed}}

Твой же пример с signed overflow.

Можешь показать хоть один проект

Опять ты за своё...

Кто ещё может являться авторитетным источником этого понятия?

Мануал к компилятору.

Я что-то не видел, чтобы они публиковали

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

И ты по факту споришь со вторым тезисом

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

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

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

Я, значит, должен сам перевести эту статью на русский язык для тебя? Или скопипастить то, что выдаёт Google Translate? Или скопипастить английский текст? Я не понимаю. “Action at a distance” означает «действие на расстоянии». Что это такое и почему это антипаттерн, там рассказывается.

Гарантии и так и так нет.

Почему нету?

#define X
int main(void)
{
}
На поведение этой программы есть гарантия с точки зрения стандарта? Есть. А на поведение этой — нету:
#define _X
int main(void)
{
}

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

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

реализацией

Что это такое вообще?

В данном случае это означает «стандартная библиотека и прочие кишки, необходимые для запуска conforming программ на Си». Я уже приводил в пример символы _GLOBAL_OFFSET_TABLE_ и _IO_stdin_used (они начинаются с _X, по-другому быть не могло).

> Кто ещё может являться авторитетным источником этого понятия?

Мануал к компилятору.

> Я что-то не видел, чтобы они публиковали

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

> И ты по факту споришь со вторым тезисом

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

Интересно. Значит, есть «мануал» или «спецификации конкретного компилятора». Но эти документы ссылаются на сишный стандарт, иногда только говоря, что в этом случае то или иное поведение становится определено. А где там написано, что можно определять _X?

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

Я, значит, должен сам перевести эту статью на русский язык для тебя?

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

с точки зрения стандарта

Вот вырежи эту фразу, иначе смысла нет.

А на поведение этой — нету

Шанс поломки этих программ примерно одинаковый. И он вовсе не из-за названия переменной (шанс того, что займут кейвордом _X - такой же нулевой, как и то, что займут X), а из-за того что где-то в будущем авторы компиляторов могут решить что int main() без return это ошибка. Или из-за того что переменная объявлена но не используется, а у компилятора в скрипте сборки включён -Werror=unused или как его там.

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

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

Но эти документы ссылаются на сишный стандарт

Только в информационном плане. Точно так же мануал от шланга неявно ссылается на мануал от gcc, когда описывает свои флаги для компиляции программ на GNU C.

Ну и вот смотри:

https://gcc.gnu.org/onlinedocs/gcc-7.5.0/gcc/Optimize-Options.html#index-fstr...

никаких отсылок на C89/C99/C11 тут нет, чисто описание опции. А именно: она делает signed переполнение неопределённым для того, чтобы оптимизатор мог лучше работать. Обрати внимание, что это вовсе не дефолт, а именно опция, которую надо явно включать, этим флагом или -O.

А где там написано, что можно определять _X?

Это само собой подразумевается. Там ещё нигде не написано, что можно определять X. Или что можно определять Y.

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

shkolnick-kun В README.md в части yafl_config.h есть ошибки. Во-первых, YAFL_LOG - должно быть вовсе не вызовом printf. Во-вторых, не объявлен YAFL_DBG. В-третьих, YAFL_LOG (ну или теперь YAFL_DBG) не объявлен для не-DEBUG ветви.

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

если ты на аргумент (spooky action at distance

Каким боком объявление переменной в начале блока кода позволяет одному блоку программы влиять на другой?

Предположим, у нас есть две программы

{
   int i;
   ...
   for(i = 1; i <= n; i++) ...
   ...
   for(i = 100; i <= k; i++) ...
   ...
   for(i = 5; i <= 20; i++) ...
   ...
}   

и

{
   ...
   for(int i = 1; i <= n; i++) ...
   ...
   for(int i = 100; i <= k; i++) ...
   ...
   for(int i = 5; i <= 20; i++) ...
   ...
}   

Что такого spooky можно сделать в первой и нельзя во второй?

monk ★★★★★
()

shkolnick-kun

Тесты какие-то есть (и это круто), но такое впечатление, что они не автоматизированные, а предназначены для запуска вручную и последующей оценки графиков «на глаз».

Для уверенности (что нет грубых ошибок в коде, что нет каких-то проблем при сборке с конкретным yafl_config.h, и тд) было бы здорово иметь автоматизированные тесты. Имею ввиду запуск функции на захардкоженных тестовых данных, и проверку результатов её работы относительно захардкоженного эталонного результата (хардкодные данные готовятся и вдумчиво вычитываются глазами при написании теста). Напрашивается как минимум по 1 тесту для каждой функции из yafl_math.h. При всей кажущейся нерациональности траты времени на написание таких тестов (ведь МОЁМ-ТО коде глупых ошибок точно НЕ МОЖЕТ БЫТЬ, так что проверять его нет смысла), как ни странно, иногда это позволяет отловить восхитительные баги.

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

Каким боком объявление переменной в начале блока кода позволяет одному блоку программы влиять на другой?

Точно тем же боком, которым считается нежелательным использование глобальных переменных. Чем меньше время жизни state, тем проще не налепить ошибок. Конкретно в твоем примере можно в одном из for-ов забыть заново инициализировать переменную.

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