FreeBasic
Главная
Вход
Регистрация
Пятница, 21.06.2024, 13:06Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Заставить FB компилировать с не используемыми переменными
electrikДата: Среда, 09.08.2023, 16:02 | Сообщение # 1
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
Когда-то мне эта фишка у FB понравилась, мол те переменные которые не используются, они и не попадут в код.
Сейчас же следующая картина: у меня есть файл .bas, в котором написано примерно следующее:

Код
dim shared as const voice_t male = _
  ( _
    10000, /' Pitch factor '/ _
    _
    /' Sound offsets '/ _
    { _
      0, 101, 202, _
      303, 404, 505, _
      606, 707, 808, _
      909, 1010, 1111, _
      1212, 1313, 1414, _
      1515, 1616, 1717, _
      1818, 1919, 2020, _
      2121, 2222, 2323, _
} _
)


короче, идёт инициализация структуры. В этом файле кроме инициализации ничего больше нет. Мне это нужно собрать в .o файл. Но по правилам FB, он получается пустой, ну точнее говоря 400 с фигом байт. Я даже пробовал создать asm файл, он тоже почти пустой.
На C такое прокатывает, собственно это переписанный сишный код.
Просмотрел ключи, вроде ничего не нашёл.

Добавлено (09.08.2023, 18:36)
---------------------------------------------
Походу, придётся делать реструктуризацию проекта. Надо подумать. Понятно что можно эти данные запихать в заголовочник из которого они будут использоваться, но этот заголовочник в проекте вызывается из разных файлов, соответственно, в .o файлах будут дубликаты данных. Этого бы не хотелось. ПРи линковке, они скорее всего отпадут, но всё равно, некрасиво получается.
Нужно им написать, чтобы сделали ключь командной строки чтобы компилятор не выкидывал неиспользуемые но инициализированные данные в текущем файле. А мало ли где мне их нужно использовать в другом месте.

Добавлено (09.08.2023, 18:50)
---------------------------------------------
Ну чтобы было понятно что я хочу, ща кину примерную структуру. В первом сообщении я уже написал кусок кода male.bas.
Предположим, он у меня собрался с данными в male.o.
Далее есть заголовочник soundscript.bi со следующим содержимым:

Код
extern as const voice_t male
extern as const voice_t female


далее есть файл synth.bas, из которого вызывается soundscript.bi, и далее идёт строчка:

Код

  soundscript->voice = iif(ttscb->flags and USE_ALTERNATIVE_VOICE, @female, @male)


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

Добавлено (09.08.2023, 18:57)
---------------------------------------------
Такое поведение очень удобно использовать, когда ты переписываешь большой проект по кускам. Компилируешь совместно C и basic код. Переписал один файл, проверил. Выкинул C файл. Ну и так с последующими файлами, пока все не будут переписаны на FB.
У меня в одном make файле идёт сборка на gcc и FB.

 
zamabuvaraeuДата: Четверг, 10.08.2023, 09:19 | Сообщение # 2
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Если на данные в файле никто не ссылается — зачем их оставлять в екзешнике? Как вы собираетесь их получать, вы же в коде ни одну ссылку на такие данные не сделали.

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

Как это не используются. Используются. Получение указателя — это использование.

Итак. В заголовочном файле "male.bi" пишем такое:

Код
Extern male Alias "male" As Const voice_t


В файле реализации "male.bas" пишем такое:


Код
#include once "male.bi"

dim as const voice_t male = _
  ( _
    10000, /' Pitch factor '/ _
    _
    /' Sound offsets '/ _
    { _
      0, 101, 202, _
      303, 404, 505, _
      606, 707, 808, _
      909, 1010, 1111, _
      1212, 1313, 1414, _
      1515, 1616, 1717, _
      1818, 1919, 2020, _
      2121, 2222, 2323, _
} _
)


В файле который использует эти штуки пишем такое:

Код
#include once "male.bi"

soundscript->voice = iif(ttscb->flags and USE_ALTERNATIVE_VOICE, @female, @male)

Аналогично делаем для female.
 
electrikДата: Суббота, 12.08.2023, 05:48 | Сообщение # 3
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
Спасибо. Этот способ сработал. Короче в FB нужно делать extern там где ты написал, или в подключённом заголовочнике. В C ссылка на переменную может быть вообще фиг знает в каком файле.
Мда, сколько лет работаю с FB, а оказывается, очевидные вещи не все знаю.
 
DarkDemonДата: Среда, 16.08.2023, 21:26 | Сообщение # 4
Полковник
Группа: Друзья
Сообщений: 194
Репутация: -2
Статус: Offline
Цитата electrik ()
заголовочник в проекте вызывается из разных файлов

Так ONCE же есть? Или типа отдельный файл на это дело не хочется...

Насколько мне известно, если определить что-то и не использовать, компилер выдаст segmentation fault. (Если не FBLite)
Раньше так было, сейчас не знаю.
 
  • Страница 1 из 1
  • 1
Поиск: