Перейти к содержанию
    

Массив указателей на массив char

3 минуты назад, Arlleex сказал:

Да. По образу и подобию

В целом, это даже удобнее.

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

А размеры обязательно вычислять, или пустые скобки можно ставить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 минут назад, ViKo сказал:

А размеры обязательно вычислять, или пустые скобки можно ставить?

Пустые скобки будут равносильны трактовке элемента как указателя.

Поэтому обязательно вычислять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, Arlleex сказал:

Пустые скобки будут равносильны трактовке элемента как указателя.

Поэтому обязательно вычислять.

Да, уже убедился.

Таперича не хотит смещение вычислять.
 

/*!*****************************************************************************
  @brief	Character (0x20...0x3f) offsets array
  @note		only digits and dot
  */
static const uint16_t BigCharOffs[] = {
	offsetof(BigCharIndx, BigSpace),		// 0x20	sp
	offsetof(BigCharIndx, BigSpace),		// 0x21 !

Source/BigFont.c(677): error: unknown type name 'BigCharIndx'
        offsetof(BigCharIndx, BigSpace),                // 0x20 sp
                 ^

Надо typedef - ом описать структуру? Сейчас сделаю.

А 5.06 компилятор, похоже, и offsetof не понимает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, ViKo сказал:

Source/BigFont.c(677): error: unknown type name 'BigCharIndx'
        offsetof(BigCharIndx, BigSpace),                // 0x20 sp
                 

Не знает кто такой BigCharIndx на момент объявления BigCharOffs.

Он (BigCharOffs) у Вас после структуры BigCharIndx объявляется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Arlleex сказал:

Не знает кто такой BigCharIndx на момент объявления BigCharOffs.

Он (BigCharOffs) у Вас после структуры BigCharIndx объявляется?

Да, после. Сразу за структурой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так, похоже, получится. Добавил имя типа структуры. И тип struct придётся добавить при вычислении offsetof.

static const struct bcrx {
	uint8_t BigSpace[2];				// 'space' (default, dummy)
static const uint16_t BigCharOffs[] = {
	offsetof(struct bcrx, BigSpace),		// 0x20	sp
	offsetof(struct bcrx, BigSpace),		// 0x21 !

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, ViKo сказал:

Вот так, похоже, получится. Добавил имя типа структуры. И тип struct придётся добавить при вычислении offsetof.

Ну либо через typedef описать структуру, создать статический экземпляр и уже делать без 'struct'.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 минут назад, Arlleex сказал:

Пустые скобки будут равносильны трактовке элемента как указателя.

Для typedef аналогично действовать будет? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё, скомпилировал, чего натворил. Пойду в симулятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 минут назад, ViKo сказал:

Для typedef аналогично действовать будет? 

Лучше вопрос задавать с примером кода, как хотите сделать.

А то я сейчас понял, что Вы хотите некое подобие

typedef struct
{
  u8 a[];
  u8 b[];
}str_t;

static const str_t str = {.a = {1, 2}, .b = {3, 4, 5}};

сделать, что, естественно, не правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, Arlleex сказал:

Лучше вопрос задавать с примером кода, как хотите сделать.

А то я сейчас понял, что Вы хотите некое подобие

сделать, что, естественно, не правильно.

Да, вы правильно поняли. Удивляет, что нужно считать размеры массивов. Наверное, можно задать отдельно типы - массивы, вычислять sizeof и вставлять в тип структуры? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, ViKo сказал:

Да, вы правильно поняли. Удивляет, что нужно считать размеры массивов. Наверное, можно задать отдельно типы - массивы, вычислять sizeof и вставлять в тип структуры? 

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

И, согласно синтаксису языка, тип при его описании должен быть полным.

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

Вот, например, как надо трактовать эту запись?

typedef struct
{
  u8 a;
  u8 b[];
}str_t;

 

А эту?

typedef struct
{
  u8 a;
  u8 b[];
  u8 c;
}str_t;

 

Что, по-Вашему, должно показать offsetof() до 'c'?

 

В первом примере компилятор проглотит определение типа, потому что b[] стоит в конце.

Во втором же компилятор будет ругаться, что 'b' это массив неопределенной длин(н)ы.

Для второго случая компилятор не сможет подсчитать sizeof(str_t), поэтому выкидывает ошибку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ясно.
А как мысль насчет sizeof массивов, которыми инициализирую структуру?
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, ViKo сказал:

Ясно.
А как мысль насчет sizeof массивов, которыми инициализирую структуру?

Подробнее? Под вечер я уже совсем не соображаю ничего =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...