Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37

Ошибка компилятора, неверное выравнивание при forward declaration

07.12.2019, 02:36. Показов 1676. Ответов 1

Студворк — интернет-сервис помощи студентам
Уже не первый раз сталкиваюсь с ошибкой когда, одна и та же структура имеет разный вес в разных частях программы (по разному выравнивается) Вот пример такой структуры
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MemoryStream
{
private:
    int id;
    byte * _hndl;
 
    byte * _writePtr;
    byte * _readPtr;
 
    byte* _outRange;
 
    int bytesInBuffer;
    int bufferSize;
    int _growMultiply;
 
    ongrw_callback on_grow;
 
    bool can_grow;
    bool grow() noexcept;
При попытке вызвать sizeof(*this) напрямую из файла т.е. в хедере или в cpp этого класса sizeof высчитывает 72 байта, если попытаться вызвать sizeof из другого класса где была произведена форвард декларация
C++
1
2
3
4
5
6
7
8
9
10
11
12
class TServerManager
{
private:
    byte events;
    struct event* on_read_ev;
    struct event* on_write_ev;
    struct event_base* base;
 
    in_addr_t target_ip;
    in_port_t target_port;
 
    class MemoryStream* _outputStream;
sizeof(*TServer->_outputStream) = 57
Проблему эту можно решить двумя способами либо отключить выравнивание "#pragma pack(1)" либо не использовать forward d а непосредственно подключить файл "MemoryStream.h"
Оба решения такие-себе. В чем заключается проблема? Перерыл весь интернет ничего не нашел, вот ещё пример
Скриншот структуры
Ошибка выравнивания
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2019, 02:36
Ответы с готовыми решениями:

Ошибка при фильтрации данных: "Unsatisfied forward or external declaration"
пишу базу данных в делфи, начала делать фильтрацию данных, но появляется ошибка при компиляции bdr.pas(34): Unsatisfied forward or...

Ошибка: Unsatisfied forward or external declaration
Здравствуйте! Не могли бы участники форума найти ошибку в программном коде? Я скачала с этого сайта программу и решила ее модифицировать -...

Ошибка Unsatisfied forward or external declaration
Помогите пожалуйста.Что за ошибка Unit1.pas(147): Unsatisfied forward or external declaration: 'TForm1.PageControl1Change' Работало все...

1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
10.12.2019, 16:21
Цитата Сообщение от WODICHKA Посмотреть сообщение
class MemoryStream* _outputStream;
А зачем вы пишете так прямо в классе? У вас так форвардится тип TServerManager::MemoryStream а не ::MemoryStream.
При этом, насколько я понимаю, полное объявление class MemoryStream находится в другом месте.
Если хотите оставить forawrd declaration в этом случае, то надо делать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MemoryStream;
 
class TServerManager
{
private:
    byte events;
    struct event* on_read_ev;
    struct event* on_write_ev;
    struct event_base* base;
 
    in_addr_t target_ip;
    in_port_t target_port;
 
    MemoryStream* _outputStream;
Дополнительно скажу, что очевидно у вас в проекте кроется какая-то более серьезная проблема, потому что в ответ на sizeof для неполного типа компилятор выдаст ошибку компиляции, а не будет считать "неправильный" размер. Если он этого не делает, таких типа у вас таки два - один MemoryStream, другой TServerManager::MemoryStream. Разного размера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.12.2019, 16:21
Помогаю со студенческими работами здесь

Ошибка: Unsatisfied forward or external declaration
Помогите найти ошибку в Форм выходит я не могу понять изза чего.19строка что связано с форм.Пжлс-та помогите вот исходник программы ...

Ошибка: Unsatisfied forward or external declaration
unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; ...

Ошибка: Unsatisfied forward or external declaration
Привет. В чем проблема? Ошибка unsatisfied forward or external declaration 'TAnimal.GetKind', 'TDog.Create' и т.д. Спасибо. unit Unit1; ...

Ошибка Unsatisfied forward or external declaration:
Создаю свой собственный класс от TFileStream, Описываю его таким образом : type TRerordStream=class(TFileStream) private ...

Ошибка в программе: Unsatisfied forward or external declaration
Здравствуйте, создал функцию, объявил ее в type, а мне выдает ошибку, что делать? Unit17.pas(11): E2065 Unsatisfied forward or external...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru