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

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

07.12.2019, 02:36. Показов 1629. Ответов 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru