mimgui new

Tema05

Известный
Автор темы
1,443
403
Версия MoonLoader
.026-beta
Хотел уточнить некоторые детали. Есть в mimgui переменная текста new.char[256]()
Как я понял в квадратных скобках размер переменной.
В круглых скобках можно задать значение переменной.
Lua:
imgui.InputText('##input', demo.textBuffer, ffi.sizeof(demo.textBuffer) - 1)
1 Если длинна уже указана при создании переменной зачем 3 параметр который подписан как размер буфера?
2 В чём смысл использовать ffi.sizeof(demo.textBuffer) - 1, по логике с инпута можно будет только стереть текст?
 

Tema05

Известный
Автор темы
1,443
403
Просто последний байт — это \0
Поэтому вычитают, поскольку туда уже нельзя записать новое, там конец
Я убрал вычитание 1 и всё прекрасно работает. Если вычитать то в буффер можно вписать 2 символа, если не вычитать можно вписать 3 символа. Если всё даже без вычитания работает то зачем оно?
Я уже привык что количество вводимых символов в импуте на 1 меньше чем размер буфера, зачем ещё единицу вычитать?
Lua:
local imgui = require 'mimgui'
local ffi = require 'ffi'
local vk = require 'vkeys'

local imgui_example = false
local buffer = imgui.new.char[4]()

imgui.OnFrame(function() return imgui_example end,
function()
    imgui.Begin("Hello, world!")
    if imgui.InputText('##input', buffer, ffi.sizeof(buffer)) then
        print(ffi.sizeof(buffer))
    end
    imgui.Text(buffer)
    imgui.End()
end)

function main()
    while true do
        wait(0)
        if wasKeyPressed(vk.VK_1) then
            imgui_example = not imgui_example
        end
    end
end
Более того, можно добавить +1 и тогда можно будет ввести 4 символа как это логически и должно было быть.
 
Последнее редактирование:

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,717
Я убрал вычитание 1 и всё прекрасно работает. Если вычитать то в буффер можно вписать 2 символа, если не вычитать можно вписать 3 символа. Если всё даже без вычитания работает то зачем оно?
Я уже привык что количество вводимых символов в импуте на 1 меньше чем размер буфера, зачем ещё единицу вычитать?
Lua:
local imgui = require 'mimgui'
local ffi = require 'ffi'
local vk = require 'vkeys'

local imgui_example = false
local buffer = imgui.new.char[4]()

imgui.OnFrame(function() return imgui_example end,
function()
    imgui.Begin("Hello, world!")
    if imgui.InputText('##input', buffer, ffi.sizeof(buffer)) then
        print(ffi.sizeof(buffer))
    end
    imgui.Text(buffer)
    imgui.End()
end)

function main()
    while true do
        wait(0)
        if wasKeyPressed(vk.VK_1) then
            imgui_example = not imgui_example
        end
    end
end
Потому что строки в C - костыль на массиве char(символов) идущих подряд, а \0 это «индикатор» конца строки , тебе просто так повезло, что у тебя были нули в памяти
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,636
2,486
Что за нули?
Можно и дальше юзать без вычитания или это может вызвать проблемы у некоторых пользователей?

окажется мусор в инпуте, если повезёт то просто будут лишние каракули, если не повезёт то пиздец какой-то программе
в целом, если ты не отнимешь 1 от размера инпута то да, это вызовет проблемы по-любому
 
Последнее редактирование:

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,717

Tema05

Известный
Автор темы
1,443
403
окажется мусор в инпуте, если повезёт то просто будут лишние каракули, если не повезёт то пиздец какой-то программе
в целом, если ты не отнимешь 1 от размера инпута то да, это вызовет проблемы по-любому
Вот есть переменная с размером 4. ffi.sizeof(buffer) будет равен 4. ffi.sizeof(buffer)-1=3. Так почему же в input вводится 2 символа вместо 3?
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,636
2,486
Никому пиздец не может настать кроме тебя. ОС просто по руках очень сильно стукнет, скажет Segmentation fault и убьет
Неправильно выразился, "какой-то программе" = какой-то пиздец твоей программе
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,717
Вот есть переменная с размером 4. ffi.sizeof(buffer) будет равен 4. ffi.sizeof(buffer)-1=3. Так почему же в input вводится 2 символа вместо 3?
Имя массива - фактически - указатель на начало массива.
Указатель это переменная хранящая адрес другой переменной в памяти.
Поэтому ты получаешь 4, а не 2.
 

Tema05

Известный
Автор темы
1,443
403
Конечно спасибо за ответы на вопросы но я мало чего понял.
Как же будет неудобно. Вот например нужно ввести капчу из 4 чисел. И при создании буфура нужно указывать вместо 4, 6
 
Последнее редактирование: