Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 12

GCC flexible array member

13.03.2016, 18:17. Показов 5444. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Уважаемые форумчане, подскажите мне непутевому одну должно быть простую вещь.
Как в GCC (MinGW) без особых извращений реализовать вот такой фокус:

C++
1
2
3
4
5
6
7
8
struct Str {
    DWORD length;
    char data[];
};
 
static const Str x={4,{'a','b','c','d'}};
static const Str y={3,{'1','2','3'}};
...
Необходимо именно размещение длины и данных последовательно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2016, 18:17
Ответы с готовыми решениями:

Причины отсутствия flexible array member в плюсах
Очень простой вопрос - с чем связанно отсутствие flexible array member в стандарте плюсов? При том что и gcc, и VS прекрасно кушают поля...

Invalid use of member in static member function
Здравствуйте! У меня есть класс: class foo{ public: foo(); ~foo(); int m_number;

[xvalue][msvs/gcc][bug] member function with ref-qualifier
добрый вечер. следующий код работает как и ожидается. и прекрасно компиляется gcc: http://rextester.com/VASW79342 ...

29
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 12
14.03.2016, 17:05  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от AlexVRud Посмотреть сообщение
Т.е. std::vector<uint8_t>
в принципе да, вектор, но самописный, родной уж больно сильно раздувает экзешник. Мне ,собственно, от него нужны пара-тройка методов. Или может есть способы как-то наследовать только самое необходимое?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.03.2016, 17:08
Цитата Сообщение от Evg Посмотреть сообщение
А как там будет выглядеть статическая инициализация?
Я же показывал уже
C++
1
static const auto sh = make_holder<'a', 'b', 'c'>();
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
14.03.2016, 17:17
Цитата Сообщение от Sapanonic Посмотреть сообщение
родной уж больно сильно раздувает экзешник.
Включи оптимизацию -O и разница в неполных 200 байт.
0
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 12
14.03.2016, 17:20  [ТС]
Цитата Сообщение от AlexVRud Посмотреть сообщение
Включи оптимизацию -O и разница в неполных 200 байт.
Мне нужно уложиться в 10 килобайт, тут никакая оптимизация не поможет.
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
14.03.2016, 17:59
тогда только:

C++
1
2
3
4
5
6
7
8
9
10
11
#define hello_lenght 5
const uint8_t hello[hello_lenght]={'H','e','l','l','o'};
 
#define MAX_BUFFER_LENGHT] 100
uint16_t buffer_lenght;
uint8_t buffer[MAX_BUFFER_LENGHT];
 
/* ... */
 
woker(hello, hello_lenght);
woker(buffer, buffer_lenght);
А то для
C++
1
mystr->lenght
преобразуется в код, содержащий не только ссылку но и смещение (которое тоже займёт свои байты).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
14.03.2016, 18:17
Цитата Сообщение от DrOffset Посмотреть сообщение
Я же показывал уже
static const auto sh = make_holder<'a', 'b', 'c'>();
Вообще-то я про Объект произвольного размера через new говорил
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.03.2016, 18:34
Цитата Сообщение от Evg Посмотреть сообщение
Вообще-то я про
Этот код нужно читать в контексте этого треда. Смысл вырывать его из контекста?
Код со статической инициализацией я уже давал, потом дал код для динамической памяти. Пост 14 - это то, что, я предполагал, ТС сможет сделать сам: объединить эти два кода и получить решение для обоих случаев. Так понятнее?
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
14.03.2016, 21:16
Ещё вариант, основанный на отсутствии описания типа данных в объектном файле.

В отдельном Си файле constdata.c объявляем константы:

C
1
2
3
4
5
6
7
8
9
#include <stdint.h>
 
struct mstring_c {
  uint16_t lenght;
  uint8_t data[];
};
 
const struct mstring_c hello = {5, {'H', 'e', 'l', 'l', 'o'}};
const struct mstring_c world = {6, {' ', 'W', 'o', 'r', 'l', 'd'}};
Для него заголовочный файл со своим типом constdata.h:

C
1
2
3
4
5
6
7
8
9
#include <stdint.h>
 
struct mstring {
  uint16_t lenght;
  char data[0];
};
 
extern const struct mstring hello;
extern const struct mstring world;
Использование в Си main.c:

C
1
2
3
4
5
6
7
#include <stdio.h>
#include "constdata.h"
 
int main() {
  printf("%.*s %.*s!\n", hello.lenght, hello.data, world.lenght, world.data);
  return 0;
}
Использование в С++ main.cpp:

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <string>
#include "constdata.h"
 
int main() {
  std::cout << std::string((char*)hello.data, hello.lenght) << " "
            << std::string((char*)world.data, world.lenght) << "!\n";
  return 0;
}
В последнем случае, главное не забывать, что constdata.c компилируется gcc, а main.cpp - g++

Для динамических данных смотри примеры выше, хотя можно и заранее завести Си-буфер.
0
Заблокирован
12.07.2017, 07:57
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Такое нестандартное расширение в GCC существует только в языке С.
Flexible array members — это же стандартный C99.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
12.07.2017, 08:18
Цитата Сообщение от daun-autist Посмотреть сообщение
Flexible array members — это же стандартный C99.
В моем сообщении речи идет не о flexible array members как таковых (это, разумеется, стандартный C99), а о возможности объявить локальную или статическую переменную "переменной длины" при помощи инициализатора вида { 4, {'a', 'b', 'c', 'd'} }. Вот именно это - нестандартное поведение. В стандартном С99 выделять памяти переменной длины для структуры с flexible array member можно только динамически, т.е. через malloc.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.07.2017, 08:18

Flexible array member not at end of struct
Вот такой код: typedef struct q_query { char query; //тут ошибка short past_time; short count; } dQuery; Ошибка...

GCC Сборка 32 разрядной версии GCC 64 разрядным GCC
Доброго времени суток. Возникла необходимость под 32х разрядный Linux, собрать 32 разрядный GCC. Но на моей основной машине установлена 64...

По поводу Flexible Least Squares
Коллеги, добрый день. Нашёл реализацию данного алгоритма: `fls` &lt;- function (A, b, mu=1, ncap=length(b),...

Создать mouseover effect для картинки с flexible grids
Я создала 2 в 1 картинку, где верхняя половина - mouseover, нижняя - неактивная. Мне необходимо сделать так, чтобы в каждой строке всегда...

Импорт проекта SIMATIC STEP7 WINCC flexible в TIA PORTAL V11
Здравствуйте, подскажите пожалуйста как открыть проект панели созданный WINCC flexible в программе TIA PORTAL V11 ? В программе TIA...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе. Самым главным критерием для меня было создание паролей, в котором отсутствуют знаки: | 1 l I Обработка содержит следующие. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru