Стандарт базовых языков?

slavka_online
Offline
Зарегистрирован: 31.08.2016

Добрый день, подскажите на каких стандартах С++ или С базируется язык Arduino ?
При программирвание возникают пару проблем:
1) 
Код типо 

foo((struct Simple){.value = 1});

не компилируется
2)
Зона видимости переменных
Чтобы увидеть переменную из соседнего файла приходится применять конструкцию extern хотя переменная объявлена глобальной 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

1. И не должен компилироваться, ибо набор символов, а не код;

2. Всё в порядке с зонами видимости переменных, не в порядке только одно - ваше понимание этого момента.

Хинт: Arduino IDE использует gcc как компилятор. GCC - один из лучших компиляторов с С/С++.

З.Ы. Языка Arduino в природе не существует.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

slavka_online пишет:

на каких стандартах С++ или С базируется язык Arduino ?

Языка Ардуино не существует в природе.

То, что Вы имели в виду базируется на стандарте ISO/IEC 14882:2011

slavka_online пишет:

Код типо 

foo((struct Simple){.value = 1});

не компилируется

Компилируется он или нет зависит от версии IDE. В ранних версих разработчики перестарались с "облегчением жизни новичкам". Позже это исправили. Если интересны подробности, в чём именно перестарались, я это здесь уже много раз объяснял, например.

Впрочем, если вынести это в отдельный файл, то всё отлично компилируется в любой версии IDE. Попробуйте создать скетч с любым именем:

#include "kaka.h"

void setup(void) {
	kaka();
}

void loop(void) {}

В ту же папку, рядом со скетчем положите два файла.

Файл кака.h

extern void kaka(void);

и файл kaka.cpp

#include <arduino.h>
#include "kaka.h"

struct Simple {
	int value;
};

static void foo(struct Simple ss) {
	analogWrite(1, ss.value);
}

void kaka(void) {
	foo((struct Simple){.value = 1});
}

запустите IDE и убедитесь, что всё компилируется нормально. Не только компилируется, но и работает.

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

slavka_online пишет:
Чтобы увидеть переменную из соседнего файла приходится применять конструкцию extern хотя переменная объявлена глобальной

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

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ЕвгенийП пишет:

 

Компилируется он или нет зависит от версии IDE. В ранних версих разработчики перестарались с "облегчением жизни новичкам". Позже это исправили. Если интересны подробности, в чём именно перестарались, я это здесь уже много раз объяснял, например.

Евгений, вы же про использование неопределённого типа, я правильно понял? Просто мне показалось, что ошибка в приведённом коде не в этом, в просто в неправильном синтаксисе. Строго говоря, давненько не освежал в памяти многие моменты из стандарта, поэтому - ошибся я, получается. Спасибо за уточнение, всему виной косность - не привык я так инициализировать структуры :) Просто по порядку следования полей, в фигурных скобках - это да, частенько.

Приношу свои извинения ТС в части пункта 1 моего ответа.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Да, именно про тип. Свинство они всё же устроили.

А конструкция действительно экзотическая, чего уж там :)

slavka_online
Offline
Зарегистрирован: 31.08.2016

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

slavka_online
Offline
Зарегистрирован: 31.08.2016

я понимаю что языка Arduino нет и в помине, имелось ввиду что понимает IDE. Как я понял единтсвенный выход это иметь один *ino файл для запуска скетча, а все остальное хранить в *с/*cpp и *h файлах для меньешго гемороя с IDE ? 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

slavka_online пишет:

я понимаю что языка Arduino нет и в помине, имелось ввиду что понимает IDE. Как я понял единтсвенный выход это иметь один *ino файл для запуска скетча, а все остальное хранить в *с/*cpp и *h файлах для меньешго гемороя с IDE ? 

Ну, не знаю, всегда ведь есть 100500 способов что-то сделать. Делайте как Вы умеете и как Вам удобнее.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

Нужно использовать тогда, когда Вас собрались увольнять, но работающий код придется показать и передать другому.

Отсюда требования:

1. коментарии желательно писать в стиле "Где мы? - На воздушном шаре.", причем писать много и ставить не в  те строки.

2. Никакого структурного кода, все строки с первой позиции! (исключение - Питон, там структура по синтаксису положена, к сожалению!);

3. чаще использовать перенос строки в длинной формуле

4. да! и побольше длинных формул!

5. да! и переменные инициализировать внутри этих самых длинных формул!

6. Если есть возможность использовать ()?():() - вместо if() else();

7. название переменной должно быть не длиннее трех символов. Предпочтительнее i1, i11, I95.

slavka_online
Offline
Зарегистрирован: 31.08.2016

таким способам удобно передавать именнованные аргументы в функцию 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

[

slavka_online пишет:

я понимаю что языка Arduino нет и в помине, имелось ввиду что понимает IDE. ля меньешго гемороя с IDE ? 

Простите, но ведь уже написали, что в IDE используется самый обычный GCC. Который соответствует именно стандартному С и С++.

Разбивку на файлы - можете делать как Вам угодно. Но папки/подпапки в структуре проекта пока нельзя использовать. Хотя на последних версиях не проверял еще.

slavka_online
Offline
Зарегистрирован: 31.08.2016

вы действительно считаете что это более читаемо 

setSettingsPID(pid, 0.01,  0.0,  0.0,  REVERSE,  10,  0,  (MUnit.tspeed - Speed));

чем это 

setSettingsPID(pid, (struct sPID){ .kp = 0.01, 
                                                            .ki=  0.0, 
                                                            .kd = 0.0, 
                                                            .dir =   REVERSE,  
                                                            ._time = 10,  
                                                            ._min = 0, 
                                                            ._max =  (MUnit.tspeed - Speed)});

?

slavka_online
Offline
Зарегистрирован: 31.08.2016

c89, c99, c11 ? инициализация структур таким способом как я хочу появилась в стандарте с99

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Да я не спорю, я же просто прикалываюсь.

В Вашем примере - хороший вариант самодокументированного кода. Мне нравится.

Я бы - по старинке - просто комментарий написал, но это дело вкуса. Ваш вариант весьма изящен.

 

ssss
Offline
Зарегистрирован: 01.07.2016

wdrakula пишет:

3. чаще использовать перенос строки в длинной формуле

Чушь! Всё зависит от понимания.

Цитата:

4. да! и побольше длинных формул!

Чушь! На нормальных МК длинная формула чаще всего вырождается в более короткий и быстрый код.

Цитата:

6. Если есть возможность использовать ()?():() - вместо if() else();

Чушь! Нужно просто знать язык программирования.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

slavka_online пишет:

c89, c99, c11 ? инициализация структур таким способом как я хочу появилась в стандарте с99

 

Прошу прощения за традиционное хамство, но Вас в гугле забанили?

gcc - Все таки основной компилятор С в мире. Ну в том, что не ограничен исключительно Microsoft.

http://gcc.gnu.org/c99status.html

Верю, что по аглицки читаете.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ssss пишет:

Чушь! На нормальных МК длинная формула чаще всего вырождается в более короткий и быстрый код.

Та нема базару, брателло! STM32 - форева рулез! Мега - мега-ацтой! Я согласен с тобой полностью! ;) ;) ;)

slavka_online
Offline
Зарегистрирован: 31.08.2016

да и у gcc есть фалги типо -std=c99.
Гугл все таки помог понять что в Arduino IDE этого не сделать. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ну почему????? все флаги компилятора в среде настраиваются, не из среды, а в настроечном файле. Опять подсказывать нужно, где именно?