Jump to content

    

Как заставить инициализировать по-умолчанию не нулем?

13 hours ago, haker_fox said:

Скоростью записи? Износом флеша?

В основном временем записи. 

13 hours ago, adnega said:

Вовсе не единственное:

Единственное вменяемое. Если массив хоть чем нибудь инициализирую в программе там появляются нули еще до попадания линкеру. Если без инициализации, там и так 0xFF.

Share this post


Link to post
Share on other sites
37 минут назад, artemkad сказал:

Если массив хоть чем нибудь инициализирую в программе там появляются нули еще до попадания линкеру. Если без инициализации, там и так 0xFF.

Если массив во flash, и вы его не инициализируете, то там будет 0xFF?!

Или вы указываете специальный атрибут, мол, не инициализировать?

Под инициализацией понимается использование оператора присваивания (=) или что-то еще?

Share this post


Link to post
Share on other sites
#define getChr(str,idx) (idx < (sizeof(str)/sizeof(*str))?str[idx]:0xFF)

#define X1(str,n) getChr(str,n)
#define X2(str,n) X1(str,n), X1(str,n+1)
#define X4(str,n) X2(str,n), X2(str,n+2)
#define X8(str,n) X4(str,n), X4(str,n+4)
#define X16(str,n) X8(str,n), X8(str,n+8)
#define X32(str,n) X16(str,n), X16(str,n+16)
#define X64(str,n) X32(str,n), X32(str,n+32)
#define X128(str,n) X64(str,n), X64(str,n+64)
#define X256(str,n) X128(str,n), X128(str,n+128)
#define X512(str,n) X256(str,n), X256(str,n+256)
#define X1024(str,n) X512(str,n), X512(str,n+512)
                                                                         
__flash uint8_t hello_world_buf[1024] = {X1024("hello world",0)};

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

а в вывод препроцессора вообще лучше не заглядывать.

Share this post


Link to post
Share on other sites

Смотрите, что в стандарте C пишут:

Цитата

The initialization shall occur in initializer list order, each initializer provided for a
particular subobject overriding any previously listed initializer for the same subobject

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

Проверил для avr-gcc, получилось.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now