мусор в буфере (mimgui)

RedHolms

Известный
Автор темы
Проверенный
619
366
Версия MoonLoader
.026-beta
Есть подобный код:
Lua:
local ImGui = require 'mimgui'

local ImNew = ImGui.new

local sizeof = ffi.sizeof
local countof = function(c) return sizeof(c)/sizeof(c[0]) end

local CFG_SBIV_TYPES = {
   "Анимация",
   "Программно"
}

local ImGuiData = {
   iSbivType = ImNew.int(0),
    aszSbivTypes = ImNew["const char*"][#CFG_SBIV_TYPES](CFG_SBIV_TYPES)
}

do
   local self = {}
   self.enabled = ImNew.bool()
   self.menu_selected = 1
   self.menus = {
      {
         title = "Для Гетто",
         draw = function()
             ImGui.Combo("Тип сбива", ImGuiData.iSbivType, ImGuiData.aszSbivTypes, countof(ImGuiData.aszSbivTypes))
         end
      }
   }

-- ниже возможно ненужный код
   self.frame = ImGui.OnFrame(
      function() return self.enabled[0] end,
      function(pl)
         local ImIO = ImGui.GetIO()
         local ImStyle = ImGui.GetStyle()

         ImGui.SetNextWindowPos(ImVec2(ImIO.DisplaySize.x / 2, ImIO.DisplaySize.y / 2), ImGui.Cond.Once, ImVec2(0.5, 0.5))
         ImGui.SetNextWindowSize(ImVec2(800, 600), ImGui.Cond.Once)

         ImGui.Begin(...)
         do
            ImGui.PushStyleVarVec2(ImGui.StyleVar.ButtonTextAlign, ImVec2(0.5, 0.05))
            ImGui.MoveCursorPos(ImVec2(ImGuiStyles.MenuSelectionFirstButtonOffset, 0))
                for i, v in pairs(self.menus) do
                    if i == self.menu_selected then
                        ImGui.PushStyleColor(ImGui.Col.Button, ImStyle.Colors[ImGui.Col.ChildBg])
                        ImGui.PushStyleColor(ImGui.Col.ButtonHovered, ImStyle.Colors[ImGui.Col.ChildBg])
                        ImGui.PushStyleColor(ImGui.Col.ButtonActive, ImStyle.Colors[ImGui.Col.ChildBg])
                    else
                        ImGui.PushStyleColor(ImGui.Col.Button, ImGui.SubVec4(ImStyle.Colors[ImGui.Col.ChildBg], ImVec4(0.03, 0.03, 0.03, 0)))
                        ImGui.PushStyleColor(ImGui.Col.Button, ImGui.SubVec4(ImStyle.Colors[ImGui.Col.ChildBg], ImVec4(0.03, 0.03, 0.03, 0)))
                        ImGui.PushStyleColor(ImGui.Col.Button, ImGui.SubVec4(ImStyle.Colors[ImGui.Col.ChildBg], ImVec4(0.03, 0.03, 0.03, 0)))
                    end

               do
                  local button_width = ImGui.CalcTextSize(v.title).x + (ImStyle.FramePadding.x * 2) + (ImStyle.ItemInnerSpacing.x * 2)

                  if ImGui.Button(v.title, ImVec2(button_width, ImGuiStyles.MenuSelectionButtonHeight * 2)) then
                     self.menu_selected = i
                  end
               end
                    ImGui.SameLine()

                    ImGui.PopStyleColor(3)
                end
            ImGui.PopStyleVar()

            ImGui.SetCursorPos(ImVec2(ImStyle.WindowPadding.x, ImStyle.WindowPadding.y + ImGuiStyles.MenuSelectionButtonHeight + ImGui.GetTitleBarHeight()))
            ImGui.BeginChild("MenuContent", ImGui.MaxSize(), true)
            do
               if self.menus[self.menu_selected] then
                  self.menus[self.menu_selected].draw()
               end
            end
            ImGui.EndChild()
         end
         ImGui.End()
      end
   )

   ImGuiFrames.MainMenu = self
end

по итогу в Combo появляется мусор (знаки вопроса и другие несуществующие символы)
 
  • Нравится
  • Грустно
Реакции: Andrinall и Z3roKwq
Решение
покаж скрин
может потому что строка нулем не кончается '\0'
1666507551837.png


Дело не в строке. Несколько секунд показывает нормально - потом начинается мусор.

Странная магия, но когда я поменял countof(ImGuiData.aszSbivTypes) на #CFG_SBIV_TYPES (в вызове imgui.Combo)- перестало выбивать мусор, хотя вывод одинаковый - 2
1666508292437.png

а вообще, я тут глянул свои старые скрипты и понял, почему не сталкивался с таким - юзал imgui.Selectable
1666508182865.png

RedHolms

Известный
Автор темы
Проверенный
619
366
покаж скрин
может потому что строка нулем не кончается '\0'
Не в этом дело
Это именно мусор, как будто память освободилась, по началу нормальная строка, а потом знаки вопроса вместо строки (неизвестные символы)
 

Andrinall

Известный
702
518
покаж скрин
может потому что строка нулем не кончается '\0'
1666507551837.png


Дело не в строке. Несколько секунд показывает нормально - потом начинается мусор.

Странная магия, но когда я поменял countof(ImGuiData.aszSbivTypes) на #CFG_SBIV_TYPES (в вызове imgui.Combo)- перестало выбивать мусор, хотя вывод одинаковый - 2
1666508292437.png

а вообще, я тут глянул свои старые скрипты и понял, почему не сталкивался с таким - юзал imgui.Selectable
1666508182865.png
 
Последнее редактирование:
  • Нравится
Реакции: whyega52 и RedHolms

RedHolms

Известный
Автор темы
Проверенный
619
366
Посмотреть вложение 174217

Дело не в строке. Несколько секунд показывает нормально - потом начинается мусор.

Странная магия, но когда я поменял countof(ImGuiData.aszSbivTypes) на #CFG_SBIV_TYPES (в вызове imgui.Combo)- перестало выбивать мусор, хотя вывод одинаковый - 2
Посмотреть вложение 174220
а вообще, я тут глянул свои старые скрипты и понял, почему не сталкивался с таким - юзал imgui.SelectableПосмотреть вложение 174219
Скорее всего понял, проблема FFI
Когда передаешь CDATA в countof, то новый поинтер не создаётся, и при выходе из функции вызывается __gc, в котором данные освобождаются
Это уже проблема только FFI)
 
  • Нравится
Реакции: Andrinall