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, по логике с инпута можно будет только стереть текст?
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,636
2,486
В чём смысл использовать ffi.sizeof(demo.textBuffer) - 1
imgui.new.char возвращает указатель на char, а указатели всегда 8 байтов
поэтому имгуи не может понять, какой у него размер, и его следует принудительно прописывать
sizeof(int*), sizeof(char*) всегда вернёт 8, в то время как sizeof(int) = 4 (действительно, int = 4 байта) и sizeof(char) = 1, можешь сам проверить

можно сделать обёртку для себя:
Lua:
local InputText = imgui.InputText

function imgui.InputText(name, input, size, flags)
    imgui.PushItemWidth(size or 0)
    local res = InputText(name, input, ffi.sizeof(input) - 1, (flags or 0))
    imgui.PopItemWidth()
    return res
end
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
А зачем тогда при создании переменной указывать значение в квадратный скобках.
Ты создаешь массив char'ов, Си требует указывать размерность при инициализации. А возвращатся тебе указатель, с него нельзя получить точный размер, поэтому и надо указывать размер вручную. Даже в сборке ImGui под Си тебе надо указывать длину строки.
 
  • Нравится
Реакции: Tema05

Tema05

Известный
Автор темы
1,443
403
Ты создаешь массив char'ов, Си требует указывать размерность при инициализации. А возвращатся тебе указатель, с него нельзя получить точный размер, поэтому и надо указывать размер вручную. Даже в сборке ImGui под Си тебе надо указывать длину строки.
Ок а зачем тогда из размера в InputText вычетать 1?
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,636
2,486
Особенность: в Lua массивы начинаются с одного, в Си с нуля, вот и разница.
Просто последний байт — это \0
Поэтому вычитают, поскольку туда уже нельзя записать новое, там конец
 

Tema05

Известный
Автор темы
1,443
403
Просто последний байт — это \0
Поэтому вычитают, поскольку туда уже нельзя записать новое, там конец
Ааа а всё понял теперь. В мун имгуи типо тоже когда указываешь 8 по факту можно ввести 7 символов
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,717
Указатель весит 4 байта.
x86 - 4 т.к. для хранения числа от 0x0 до 0xFFFFFFFF требуется 4 байта( 0xFFFFFFFF - 2^32)
x64 - 8 т.к. для числа 0xFFFFFFFFFFFFFFFF требуется 8 байт (2^64)
Это объяснения для остальных
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Теперь ещё понимать причём тут массивы... Буду пробовать понять на практике.
Язык программирования C предоставляет определенное число типов данных, которые можно использовать для написания своего кода, и какого-то определенного для инициализации строк выделить нельзя, потому что такого просто нет, но зато имеется тип char, который по сути хранит в себе байт, если говорить проще - символ, размер типа char - один байт. Соответственно, если нужно сохранить текст, можно организовать массив из этих самых однобайтовых char`ов и записывать данные.
C:
#include <stdio.h>

int main()
{
    char data[13] = "Hello world!";
    char* data_ptr = data;

    printf("%s | size: %d\n", data, (int)sizeof(data)); // Hello world | size: 13
    printf("%s | size: %d", data_ptr, (int)sizeof(data_ptr)); // Hello world | size: 8

    return 0;
}
 

Tema05

Известный
Автор темы
1,443
403
Язык программирования C предоставляет определенное число типов данных, которые можно использовать для написания своего кода, и какого-то определенного для инициализации строк выделить нельзя, потому что такого просто нет, но зато имеется тип char, который по сути хранит в себе байт, если говорить проще - символ, размер типа char - один байт. Соответственно, если нужно сохранить текст, можно организовать массив из этих самых однобайтовых char`ов и записывать данные.
C:
#include <stdio.h>

int main()
{
    char data[13] = "Hello world!";
    char* data_ptr = data;

    printf("%s | size: %d\n", data, (int)sizeof(data)); // Hello world | size: 13
    printf("%s | size: %d", data_ptr, (int)sizeof(data_ptr)); // Hello world | size: 8

    return 0;
}
А разве imgui не на C++ написан?
 

kin4stat

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

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
А разве imgui не на C++ написан?
C почти полностью обратно совместим с C++
Вообще C++ задумывался как улучшение для C, именно поэтому код C совместим с C++
Да и FFI работает с C, а не с C++, оттуда и отсутствие некоторых типов, доступных в C++.
Да, в C++ можно было бы использовать std::string, но в ImGUI он не используется.
А так, по сути C++ позволяет тебе помимо стандартного С-шного ФП использовать ООП.
 
  • Вау
Реакции: memir