FreeBasic
Главная
Вход
Регистрация
Среда, 10.06.2026, 03:30Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
LoadString для конкретного языка
zamabuvaraeuДата: Суббота, 09.05.2026, 16:43 | Сообщение # 1
Полковник
Группа: Друзья
Сообщений: 212
Репутация: 5
Статус: Offline
Стандартная функция LoadString загружает строку из ресурсов, однако она не может загрузить строку для языка, отличного по умолчанию. Устраняем это недоразумение LoadStringEx.bas:

Код
#include once "windows.bi"

Function LoadStringExW Alias "LoadStringExW"( _
      ByVal hInst As HINSTANCE, _
      ByVal uId As UINT, _
      ByVal lpBuffer As LPWSTR, _
      ByVal cchBufferMax As Long, _
      ByVal langId As UINT _
   ) As Long

   ' Convert the string ID into a bundle number
   Dim ResId As UInteger = CUInt(uId) \ 16 + 1
   Dim hRes As HRSRC = FindResourceEx( _
      hInst, _
      RT_STRING, _
      MAKEINTRESOURCE(ResId), _
      langId _
   )

   If hRes Then
      Dim hglob As HGLOBAL = LoadResource(hInst, hRes)

      If hglob Then

         Dim pData As Any Ptr = LockResource(hglob)

         If pData Then
            ' Now walk the string table

            Dim pwsz As LPWSTR = Cast(LPWSTR, pData)

            Dim pLength As UShort Ptr = Cast(UShort Ptr, pwsz)
            Dim Length As UShort = *pLength
            pwsz = @pwsz[1]

            Dim Index As Integer = CInt(uId) And 15
            For i As Integer = 1 To Index
               pwsz = @pwsz[CInt(Length)]

               pLength = Cast(UShort Ptr, pwsz)
               Length = *pLength

               pwsz = @pwsz[1]
            Next

            Dim LenMin As Integer = min(CInt(Length), CInt(cchBufferMax))

            If LenMin Then
               CopyMemory(lpBuffer, pwsz, LenMin * SizeOf(WCHAR))
            End If

            lpBuffer [LenMin]= 0

            Return LenMin
         End If
      End If
   End If

   lpBuffer[0] = 0

   Return 0

End Function

Function LoadStringExA Alias "LoadStringExA"( _
      ByVal hInst As HINSTANCE, _
      ByVal uId As UINT, _
      ByVal lpBuffer As LPSTR, _
      ByVal cchBufferMax As Long, _
      ByVal langId As UINT _
   ) As Long

   Dim pBuf As LPWSTR = Allocate((cchBufferMax + 1) * SizeOf(WCHAR))
   If pBuf = NULL Then
      lpBuffer[0] = 0
      Return 0
   End If

   Dim resLength As Long = LoadStringExW( _
      hInst, _
      uId, _
      pBuf, _
      cchBufferMax, _
      langId _
   )

   If resLength Then
      WideCharToMultiByte( _
         CP_ACP, _
         0, _
         pBuf, _
         resLength, _
         lpBuffer, _
         cchBufferMax, _
         NULL, _
         NULL _
      )
   End If

   Deallocate(pBuf)

   lpBuffer [resLength]= 0

   Return resLength

End Function
Заголовочный файл LoadStringEx.bi:

Код
#ifndef LOADSTRINGEX_BI
#define LOADSTRINGEX_BI

#include once "windows.bi"

Declare Function LoadStringExW( _
   ByVal hInst As HINSTANCE, _
   ByVal uId As UINT, _
   ByVal lpBuffer As LPWSTR, _
   ByVal cchBufferMax As Long, _
   ByVal langId As UINT _
) As Long

Declare Function LoadStringExA( _
   ByVal hInst As HINSTANCE, _
   ByVal uId As UINT, _
   ByVal lpBuffer As LPSTR, _
   ByVal cchBufferMax As Long, _
   ByVal langId As UINT _
) As Long

#ifdef UNICODE
   Declare Function LoadStringEx Alias "LoadStringExW"( _
      ByVal hInst As HINSTANCE, _
      ByVal uId As UINT, _
      ByVal lpBuffer As LPWSTR, _
      ByVal cchBufferMax As Long, _
      ByVal langId As UINT _
   ) As Long
#else
   Declare Function LoadStringEx Alias "LoadStringExA"( _
      ByVal hInst As HINSTANCE, _
      ByVal uId As UINT, _
      ByVal lpBuffer As LPSTR, _
      ByVal cchBufferMax As Long, _
      ByVal langId As UINT _
   ) As Long
#endif

#endif
Создадим  файл ресурсов, где будут две таблицы строк для русского и английского языка:
Код
#include "resources.rh"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

STRINGTABLE
BEGIN
   IDS_MESSAGE1             "Done"
   IDS_MESSAGE2             "Caption"
END

LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT

STRINGTABLE
BEGIN
   IDS_MESSAGE1             "Готово"
   IDS_MESSAGE2             "Заголовок"
END
Заголовочный файл ресурсов resources.rh:

Код
#define IDS_MESSAGE1 16
#define IDS_MESSAGE2 17
Использование:
Код
#include once "resources.rh"
#include once "LoadStringEx.bi"

' конструируем язык самостоятельно

Dim lngId As Long = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT)

Dim buf1(63) As TCHAR = Any
Dim StringLength1 As Long = LoadStringEx( _
    GetModuleHandle(NULL), _
    IDS_MESSAGE1, _
    @buf1(0), _
    63, _
    lngId _
)

Dim buf2(63) As TCHAR = Any
Dim StringLength2 As Long = LoadStringEx( _
    GetModuleHandle(NULL), _
    IDS_MESSAGE2, _
    @buf2(0), _
    63, _
    lngId _
)

MessageBox( _
    hWin, _
    @buf1(0), _
    @buf2(0), _
    MB_OK Or MB_ICONINFORMATION _
)


Сообщение отредактировал zamabuvaraeu - Суббота, 09.05.2026, 16:44
 
DarkDemonДата: Суббота, 09.05.2026, 23:23 | Сообщение # 2
Генерал-майор
Группа: Друзья
Сообщений: 333
Репутация: -1
Статус: Offline
Как понимаю что-то полезное для локализации.
А можно сразу архив с батником сборки через FBC? Хотел глянуть, но уже забыл как с ресурсами собирать.
Ну и для потомков лучше версию компиля всегда указывать.
 
zamabuvaraeuДата: Воскресенье, 10.05.2026, 21:11 | Сообщение # 3
Полковник
Группа: Друзья
Сообщений: 212
Репутация: 5
Статус: Offline
Компилятор последний 1.10.1
Обычная сборка, ничего примечательного: make_bloatware.cmd
Сборка без рантайма: make_barebone.cmd — обрати внимание на размер, как много всякой лишней ерунды удалено, которую хочет вставить компилятор.
Только поправим пути к компилятору в первых строках файлов.

В ресурсах три таблицы строк: для русского, английского и французского языков (переводил промтом, наверняка ошибки есть)

(для 32 бит не делал)
Прикрепления: AnyLanguage.zip (24.8 Kb)
 
DarkDemonДата: Понедельник, 11.05.2026, 05:55 | Сообщение # 4
Генерал-майор
Группа: Друзья
Сообщений: 333
Репутация: -1
Статус: Offline
Ну да твой файл 7 кб, а дефолтный - 27,5 кб. Фактически 3 / 4 - чего-то он туда напихал.
Сорц технологичный, BAT-ник тоже наворочен дай боже, хотя +/- в общих чертах понятно.

Не очень понятно что там делает манифест и некий mini-runtime с какими-то IFDEF под linux, ведь
код вроде под WinAPI. Французский текст у меня отображается английскими буквами, хотя по факту
в файле ресурса там юникодовые символы французские. Походу в винде надо ставить французский.
 
zamabuvaraeuДата: Понедельник, 11.05.2026, 07:18 | Сообщение # 5
Полковник
Группа: Друзья
Сообщений: 212
Репутация: 5
Статус: Offline
Манифест нужен чтобы стили XP показывать и корректно работать на мониторах с высоким DPI. Так как это диалоговая панель, а не простое окно, всю работу с автоматическим масштабированием берёт на себя менеджер диалоговых окон.
(В манифесте можно ещё другие штуки указывать, например, использовать COM без регистрации в реестре)
mini-runtime нужен чтобы не вставлять в программу стартовый код из си‐библиотек. В этой программе нет обращения к рантайму, поэтому си‐рантайм можно выкинуть и написать стартовый код самостоятельно. Линукс там потому что файл просто скопировал из другого проекта, но я не уверен в корректности этого кода.
Ну понятно что 20 килобайт в 2026 — это копейки, современные игры весят 100 гигабайт. Я предпочитаю не включать в программу даже эти 20 килобайт мёртвого кода.
 
haavДата: Понедельник, 11.05.2026, 08:20 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1475
Репутация: 50
Статус: Offline
Проект получился аксишный , экспортируются API для ASCII , соответственно французские символы отображаются неправильно. Надо указать #define UNICODE.
Хотя если оставить так , то у французов должно все отображаться правильно.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Понедельник, 11.05.2026, 10:46 | Сообщение # 7
Генерал-майор
Группа: Друзья
Сообщений: 333
Репутация: -1
Статус: Offline
Цитата haav ()
Надо указать #define UNICODE.

Точняк! Теперь как надо.
 
zamabuvaraeuДата: Понедельник, 11.05.2026, 20:23 | Сообщение # 8
Полковник
Группа: Друзья
Сообщений: 212
Репутация: 5
Статус: Offline
Диалоги тоже можно держать в ресурсах на нескольких языках и загружать нужный по мере необходимости:

Код
Private Function LoadResDialog( _
      ByVal hInst As HINSTANCE, _
      ByVal ResId As UINT, _
      ByVal langId As UINT _
   ) As DLGTEMPLATE Ptr

   Dim hRes As HRSRC = FindResourceEx( _
      hInst, _
      RT_DIALOG, _
      MAKEINTRESOURCE(ResId), _
      langId _
   )

   If hRes Then
      Dim hglob As HGLOBAL = LoadResource(hInst, hRes)

      If hglob Then

         Dim pData As DLGTEMPLATE Ptr = LockResource(hglob)

         Return pData
      End If
   End If

   Return NULL

End Function


Использование (на свой страх и риск):

Код
Dim hInst As HMODULE = GetModuleHandle(NULL)

' Диалог для конкретного языка
Dim templ As DLGTEMPLATE Ptr = LoadResDialog( _
   hInst, _
   IDD_DLG_MAIN, _
   MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) _
)
If templ = NULL Then
   End(1)
End If

Dim DialogBoxParamResult As INT_PTR = DialogBoxIndirectParam( _
   hInst, _
   templ, _
   NULL, _
   @MainFormDialogProc, _
   параметр _
)
If DialogBoxParamResult = -1 Then
   End(1)
End If


Сообщение отредактировал zamabuvaraeu - Понедельник, 11.05.2026, 20:24
 
DarkDemonДата: Вторник, 12.05.2026, 20:01 | Сообщение # 9
Генерал-майор
Группа: Друзья
Сообщений: 333
Репутация: -1
Статус: Offline
zamabuvaraeu, а ты пробовал код большего объёма? Т.е. компиль всегда пихает 3 / 4 лишнего, или это он пихает
какую-то базу, а дальше уже идёт код без этих надбавок?

Тут парадокс в чём, понятно что это самый правильный и экономичный путь для создания компактных прог под винду,
но по факту им пользуются два динозавра из 90-х. Причин много, одна из причин что нормальной интегрированной
среды к FB нет. Да как бы FbEdit позволяет всё это делать, даже какой-то интерфейс создавать, но оно выглядит
как костыль. Вторая причина это необходимость дробиться ещё на файл ресурса. Не всегда это удобно и приятно.
И не всегда он в принципе нужен, хотя в него можно много чего запихать. Третья причина - развитие SSD,
которые не дают современным программистам понять боль загрузки их толстого ПО с винчестера. По чисто экономич.
причинам обычные харды будут ещё долго на рынке, но люди это уже давно не учитывают.
Четвёртая причина: как бы это голый WinAPI, я не против когда идёт взаимодействие с какими-либо нутрами ОС,
доступ, например, к хукам или MME, но для интерфейса руками это требует кучи времени на MSDN и не меньшей
кучи уже готовых компетенций. Плюс по факту: чтобы это делать быстро нужно какое-то нормальное руководство.
Потому все эти вонючие NET фреймворки, а также 4GL языки с их WYSIWYG и стали так популярны.
Ну и последняя причина, это порог вхождения. Я например не умею выпиливать "рантайм"(т.е. отделять конструкции
ЯП от того, что к ним не относится), как и большинство программистов на FB.
Мне проще даже перейти на голый ASM и писать те же копеечные программы в пару килобайт, т.к. там заведомо
ясно что в бинарник ничего лишнего не идёт и вот там подход с ресурсами - это прям в разы более востребованная
фича, потому что по другому проще - никак. Но опять же 7 кб и 27, условно 2 кластера и 7. Для запуска с дискеты
наверное - надо, но дискетами уже лет 20 люди не пользуются, кроме любителей ретро. Это кстати было клёвое
время, когда реально на дискету пытались умещать кучу ПО...

Тут дело то не только в локализации, то что ты расколупал это и показал нам - конечно круто. А тем более ещё и
как собирать без рантаймов. Но СЛОЖНО. Я всегда за то чтобы самому понимать каждую фичу которую используешь,
т.е. не втупую у кого-либо взять, ну и вышеописанное по поводу недостаточной автоматизации этого процесса,
тут достаточно взять условный VB и мы поймём "относительность".
 
zamabuvaraeuДата: Среда, 13.05.2026, 13:58 | Сообщение # 10
Полковник
Группа: Друзья
Сообщений: 212
Репутация: 5
Статус: Offline

Цитата
Т.е. компиль всегда пихает 3 / 4 лишнего, или это он пихает
какую-то базу, а дальше уже идёт код без этих надбавок?


Компилятор берёт не все функции, а только то, что используется. Но только функциями раздувание не ограничивается, есть ещё Shared переменные, статические строки, таблицы релокаций, версия компилятора. Задача не в том, чтобы это удалять. Задача в том, чтобы это добавлять в список линковщика. И вот что он добавляет:

Си‐библиотеки:
crt2.o 48 кбайт
crtbegin.o 1 кбайт
crtend.o 1 кбайт

Библиотеки фрибесика:
fbrt0.o 1 кбайт
libfb.a 560 кбайт

Графика:
libfbgfx.a 233 кбайт

Многопоточные:
libfbgfxmt.a 229 кбайт
libfbmt.a 579 кбайт

Библиотеки GCC:
libgcc.a 8 мегабайт
libgcc_eh.a 150 кбайт
libmingw32.a 424 кбайт
libmingwex.a 2,69 мегабайт
libmoldname.a 1 килобайт

Хотя бы одна Shared или Common переменная потянет за собой секцию .bss.
Массив тянет за собой создание дескриптора массива, будет много избыточного кода, поэтому массивы запихиваем внутрь структуры.
Строки String небезопасны: в рантайме нет проверки на успешное выделение памяти для строки, программа может показать крах, невозможно написать надёжную программу со строками. И даже если бы она там была… То кто делает эти проверки? В файле на 1000 строк исходного кода тип String может использоваться сотни раз.


Цитата
Вторая причина это необходимость дробиться ещё на файл ресурса. Не всегда это удобно и приятно.

А как делать? Одна программа — один файл? Годится только для HelloWorld. В одном файле даже на тысячу строк кода уже сложно ориентироваться. Интерфейс должен быть отделён от логики, логика не должна зависеть от интерфейса, поэтому его выносят куда‐нибудь в ресурсы.
В 2026 у любой программы должен быть манифест в ресурсах, чтобы на современном мониторе с высоким DPI глаза радовались, а не вытекали из орбит.
Посмотрим на игры: никто там не рисует все эти кубы, сферы и треугольники, не натягивают на них текстуры, вместо этого готовые модельки загружают из файлов, по сути те же ресурсы.
Также и с GUI: диалоги в ресурсах это уже скомпилированные модельки окошек.

А без ресурсов что будет: писать руками сотни CreateWindowEx для GUI.
Гораздо проще нарисовать диалог в редакторе ресурсов мышкой, и потом в коде один раз сделать DialogBoxParam, возложив задачу отрисовки на менеджер диалоговых окон.
Можно без редактора править файл ресурсов самостоятельно, благо формат простой и топорный как пять бурлей. Единственная сложность — это вычислить положение контролов чтобы GUI выглядел профессионально.

На фрибесиковом рантайме GUI не создать. В любом случае придётся использовать какую‐то библиотеку.
 
DarkDemonДата: Четверг, 14.05.2026, 04:40 | Сообщение # 11
Генерал-майор
Группа: Друзья
Сообщений: 333
Репутация: -1
Статус: Offline
Цитата zamabuvaraeu ()
Массив тянет за собой создание дескриптора массива, будет много избыточного кода, поэтому массивы запихиваем внутрь структуры.


Массив в структуре и просто массив это не одно и то же. Ни по смыслу, ни по реализации.
Это проблема не кодера, а конкретной реализации BASIC.

Цитата zamabuvaraeu ()
Строки String небезопасны: в рантайме нет проверки на успешное выделение памяти для строки, программа может показать крах, невозможно написать надёжную программу со строками.


Тогда это проблема рантайма и в целом FB.
Безопасность к "краху" проги я бы тоже относить не стал, режим защищённый, программы друг от друга изолированы
(если конечно другой софт не лезет в наш процесс с помощью OpenProcess и WriteProcessMemory).

Сейчас очень много говорят про безопасность, но никто не говорит что т.н. безопасные указатели и прочее это
по сути подмена понятий, т.е. херня. Крах софта не влияет на безопасность, винда завершает работу нормально,
а вот кривая работа механизмов софта - именно она влияет.

Т.к. если на указателе не крешнулось(не полезло в защищённый диапазон памяти), это не значит что прога
не может начать делать то, что нужно злоумышленнику, чего он и добивался.
Безопасность это когда твоя прога формализована, и делает только то, что ей предначертано.
(Пр. Преображенский оперирует только в операционной, а не в парадной и не в детской happy )

И это всё не касается прог на которых не оказано внешнее влияние или прог без использования сети и прочих
коммуникаций. Это не проблема строк. Проверка на выделение - это абсурдная мера(оно по идее опционально
должно быть). Т.к. если памяти нет, то и программа никак не отработает. Да есть там все эти виртуальные
механизмы и прочее, но большинство прог работают строго с тем, что могут оттяпать у системы.
Т.е. это вопросы к ненасытности пользователя, а если баг имеет место быть, то так даже проще понять что он есть.

Цитата zamabuvaraeu ()
А как делать? Одна программа — один файл? Годится только для HelloWorld.


Не согласен, что только для сосунковых. Если мне, прогеру ниже середняка было доступно(когда форма ещё была)
вполне осознанно манипулировать кодом в 3,5k строк, то другой человек по сути сможет и больше причём намного,
до 5k точно... Мне нравится такой подход при прототипировании, когда софт ещё не готов и нужно раскидать
общую логику "сверху вниз" просто заглушками. А так без модульности в любом случае - никуда.

И по модулям никогда не поздно раскидать. Дело не в этом. У res свой отдельный синтаксис и его надо изучать.
Но претензия не к этому, а к автоматизации, это тянет за собой обслуживание в виде WinAPI,
ручное перебивание ID-шников, ручной по сути контроль. Это тебе не обвёл прямоугольник и "выросла форма"
c кнопками, где сразу и генерится код и ресурс и всё само связывается, считаю что так и должно быть в нормальной
BASIC среде, чего пока не имеем. А надо это всё колупать и шаг влево\вправо, потребуется чуть больше чем
в редакторе FBEdit - начнутся сложности с документацией.

Файлы ресурсов они же не только для GUI, по сути это механизм вложения любых файлов.
Т.е вопрос использовать их или не использовать - это часть архитектуры софта. Раньше их использовали для
Portable прог, чтобы не таскать рядом с exe директории с data файлами. Это неудобно прогеру, но удобно юзеру.
На ASM-е же оно существенно упрощало(парадоксально, что на BASIC-е оно усложняет) создание GUI.

Цитата
В 2026 у любой программы должен быть манифест в ресурсах

Это всё понятно и разговоры про кривое отображение были(так понимаю это на 2k,4k мониках с увеличением
масштабирования в винде), хоть лично такие артефакты и не наблюдал, но как бы верю, что надо.
Понимаешь, BASIC кодер вообще этого видеть не должен, компиль должен сам эти "пилюли" вклёвывать в бинарник.
А выходит что в папке болтается ещё и это...

Цитата zamabuvaraeu ()
А без ресурсов что будет: писать руками сотни CreateWindowEx для GUI.


Без ресурсов - самое простое это Window9 + PureForm. Но это не 7 килобайт. Это плата за "проще".
Для меня важно другое, скорость загрузки софта. Она не всегда зависит от объёма кода.

Цитата
На фрибесиковом рантайме GUI не создать.


Всю жизнь на примитивах делаю, нигде не жмёт вроде. Оконный редко использую(чаще для настроек).
Например так: https://docs.google.com/documen....tab=t.0

Добавлено (14.05.2026, 04:46)
---------------------------------------------
Цитата zamabuvaraeu ()
Также и с GUI: диалоги в ресурсах это уже скомпилированные модельки окошек.

А без ресурсов что будет: писать руками сотни CreateWindowEx для GUI.

Кстати, чисто теоретически разницы в объёме кода(бинарника) между этими вариантами быть не должно.


Сообщение отредактировал DarkDemon - Четверг, 14.05.2026, 04:46
 
zamabuvaraeuДата: Суббота, 16.05.2026, 15:48 | Сообщение # 12
Полковник
Группа: Друзья
Сообщений: 212
Репутация: 5
Статус: Offline

Цитата
Кстати, чисто теоретически разницы в объёме кода(бинарника) между этими вариантами быть не должно.


Разница будет.
Вручную создавать окно — это регистрация класса, создание и расстановка дочерних окон, навигация по стрелочкам и клавишам TAB, это вручную всё прописывать надо, меню, горячие клавиши…
Диалоговое окно — оно уже скомпилировано, тут окно одним вызовом DialogBoxParam. Менеджер диалоговых окон берёт на себя всю грязную работу.
(диалоговые окна — это не панацея, они предназначены только для окон которые не изменяют размер)


Цитата
Это всё понятно и разговоры про кривое отображение были(так понимаю это на 2k,4k мониках с увеличением
масштабирования в винде)


Добавлено (16.05.2026, 15:50)
---------------------------------------------
Вот пример масштабирования без мыла, текст чёткий, не расплывчатый на всех масштабах
https://rutube.ru/video....GJBzjNQ

Добавлено (16.05.2026, 16:47)
---------------------------------------------
К сожалению, многие программисты небрежно относятся к проверке указателей, а иногда сознательно не проверяют, удалось ли выделить память или нет. Их логика следующая:



Цитата
Если функция Allocate не смогла выделить память, то вряд ли моя программа продолжит функционировать должным образом. Скорее всего, памяти будет не хватать и для других операций, поэтому можно вообще не заморачиваться об ошибках выделения памяти. В результате программа упадёт, что меня устраивает. Раз нет памяти, то и нечего мучаться


И это неправда. Вот почему.

1. Память — это динамический ресурс. Сейчас нет — это не значит что памяти нет навсегда. Память мочет через секунду появиться: пользователь закроет хром, ворд, ексель — и память появится.
2. Отсутствие памяти — это штатная ситуация, такая же как и «Не могу создать файл». Это не повод для падений.
3. А теперь представим, что пользователь проделал многочасовую работу в Microsoft Word, копирует большую картинку и пытается вставить… И тут программа берёт и падает, вместо того, чтобы штатно обработать нехватку памяти. Замечательно? Вся многочасовая работа потеряна. При правильной обработке ошибок мы просто выйдем с ошибкой из функции, показав пользователю понятное сообщение и дав ему сохранить имеющуюся работу.
4. Отсутствие проверки на NULL — это уязвимость типа «отказ в обслуживании». Мы не можем говорить о надёжности программы, которую можно уничтожить дудосом. Надёжный сервер не должен падать, он просто временно не принимает новые соединения.
5. Такое поведение в принципе недопустимо для библиотек.
6. Из-за ошибки программиста программа просить выделить ОЧЕНЬ большой буфер, которого нет. Allocate вернёт 0. Что программа сделает? Упадёт, а могла бы штатно обработать эту ситуацию.


Сообщение отредактировал zamabuvaraeu - Суббота, 16.05.2026, 15:54
 
DarkDemonДата: Суббота, 16.05.2026, 17:54 | Сообщение # 13
Генерал-майор
Группа: Друзья
Сообщений: 333
Репутация: -1
Статус: Offline
zamabuvaraeu,
Ты не думай, не топлю за то чтобы программы падали. Креш для меня как индикатор дебага.
И указатели(и доступн. память) по хорошему НАДО проверять, если софт действительно серьёзный
и должен держать многочасовые сеансы работы с ценными данными.

Но 6 - тут есть нюансы. Одно дело прога, для которой работа(операции) не являются зависимыми и стекообразующими.
Если софт не редактор со свободным редактированием и требует линейной отработки - тут всё сложнее.
Т.е. прям сильно сложнее, я про то, что, наверное, правильно в таком случае сделать деинициализации,
выдать MessageBox - что нет памяти и вырубиться. Просто на стадии проектировки всё это втыкать, когда
желательно видеть (на 100% наличия памяти) как всё это работает. Т.е. всё сначала проверить, а потом
уже втыкать эти проверки.

Ещё нужно иметь в виду что иниц. и деиниц - может быть долго.
Например, FBSound инициализируется и выгружается по секунде.

А так да, но то что имеем сейчас: Gimp 2.8 - при отжоре больше 1,6 Гб - падает, браузер Vivaldi на движке
chromium при наличии кучи свободных гигабайт оперативы - намертво зависает(теряя последнюю вкладку).
Davinci resolve - падает каждые 5-10 минут.

Такие сейчас разрабы. Но мы то лучше?
 
zamabuvaraeuДата: Суббота, 16.05.2026, 18:23 | Сообщение # 14
Полковник
Группа: Друзья
Сообщений: 212
Репутация: 5
Статус: Offline

Цитата
Понимаешь, BASIC кодер вообще этого видеть не должен, компиль должен сам эти "пилюли" вклёвывать в бинарник.
Пытаться спрятать кишки не выйдет.
Компилятор не умеет определять на какой системе будет запущена программа. На Win95 нет функций и библиотек, которые есть в WinXP.
Некоторые контролы (Всплывающие подсказки с картинками и значками) работают только при включённых визуальных стилях.
Ещё и потому что начнут говорить «Бесик это несерьёзно, хотите писать на профессиональном инструменте, где можно контролировать всё самостоятельно, — берите Си».
 
DarkDemonДата: Воскресенье, 17.05.2026, 00:47 | Сообщение # 15
Генерал-майор
Группа: Друзья
Сообщений: 333
Репутация: -1
Статус: Offline
Цитата zamabuvaraeu ()
На Win95 нет функций и библиотек, которые есть в WinXP.

Это и является первоочередной проблемой. 95\98 выбирают только хардкорщики,
любители острых ощущений. Для этого нужна высокая квали. Большинство, включая меня
могли бы просто взять компилятор старой версии FB, это позволяет без особых проблем
что-то писать. Совместимость как вперёд так и назад - это очень трудно. Это сейчас
можно потестить, раньше то что написано было на старых - как правило имело проблемы
на новых, например банальный текс. ред Bred2 зачастую имеет проблемы на Win10.

Думаешь кто-то сейчас будет углубляться в историю и делать компиль под Win95\98 ?
Это настолько старые системы, что под них нужно делать отдельный компиль.
Задача сложна сама по себе и нюансов много.

На мой взгляд совместимость с 2000\XP - это ещё приемлемо сейчас, а вот с 95\98 - это
будет сильно ограничивать, тут в любом случае сверху вниз просто так не портируешь,
потребуется половину софта переписывать.

Про Win98, которая не падает(оригинал падал), не дерёт диск и имеет самый продуманный и
минималистичный интерфейс на планете - конечно можно только помечтать.
Хорошо что хоть кто-то помнит эти системы. Хотя большинство - забыли и их не коробит
унылый интерфейс Android-а с нулевой эргономикой...

Цитата
Компилятор не умеет определять на какой системе будет запущена программа.

Компилятор мог бы это делать. Начиная с Win 2000 - без особых проблем. Но этого
не требуется, хватило бы и опции target. Задать руками никогда не проблема.
Т.е. по поводу кишок: целевой EXE не обязан быть на все системы. Делать отдельный
launcher, который определяет ОС и запускает нужный EXE - нормальная практика.

У подавляющего большинства прогеров в одном файле - это не получится, т.к.
объёмы тестирования воистину огромны (ME, XP, XPx64, VISTA, VISTAx64, 7, 7x64, 8.1, 8.1x64,
10, 10x64, и теперь ещё 11x64). Нужно иметь 12(!!!) тестовых компов у себя.

Это пишу для тех кто возможно захочет написать компиль. Для FB это не актуально,
там разрабы чем-то другим заняты.


Сообщение отредактировал DarkDemon - Воскресенье, 17.05.2026, 00:57
 
  • Страница 1 из 1
  • 1
Поиск: