Похоже, я нашел решение.
Я обновил демо (это только PoC) https://github.com/tomo0613/3d-animated-char-test
первым (в блендере): [116 ]
, то есть код JS:
Мне все еще любопытно, есть ли какой-нибудь намеренный / или лучший способ сделать это ??
Нет, Вы не можете. Компилятор не знает то, на что указывает указатель. Существуют приемы, как окончание массива с известным внеполосным значением и затем подсчетом размера вплоть до того значения, но это не использует sizeof.
Другой прием является тем, упомянутым Zan, который должен спрятать размер где-нибудь. Например, если Вы динамично выделяете массив, выделяете блок один интервал, больше, чем тот, Вы нуждаетесь, прячете размер в первом интервале и возвращаете ptr+1 как указатель на массив. Когда Вы нуждаетесь в размере, постепенно уменьшаете указатель и быстрый взгляд на спрятавшее значение. Просто не забудьте освобождать целый блок, запускающийся с начала и не только массива.
Для динамических массивов ( malloc или C++ новый ) необходимо сохранить размер массива, как упомянуто другими или возможно создать структуру менеджера по массиву, которую дескрипторы добавляют, удаляют, считают, и т.д. К сожалению, C не делает этого почти, а также C++, так как в основном необходимо создать его для каждого различного типа массива, который Вы храните, который является громоздким, если у Вас есть несколько типов массивов, которыми необходимо управлять.
Для статических массивов, таких как тот в Вашем примере, существует общий макрос, используемый для получения размера, но это не рекомендовано , поскольку он не проверяет, является ли параметр действительно статическим массивом. Макрос используется в реальном коде, хотя, например, в заголовках ядрa Linux, хотя это может немного отличаться, чем то ниже:
#if !defined(ARRAY_SIZE)
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
#endif
int main()
{
int days[] = {1,2,3,4,5};
int *ptr = days;
printf("%u\n", ARRAY_SIZE(days));
printf("%u\n", sizeof(ptr));
return 0;
}
можно погуглить по причинам опасаться макросов как это. Будьте осторожны.
, Если возможно, C++ stdlib, такой как вектор, который намного более безопасен и легче использовать.
Ответ, "Нет".
то, Что делают программисты C, сохранить размер массива где-нибудь. Это может быть часть структуры, или программист может обмануть немного и malloc () больше памяти, чем требуемый для хранения значения длины перед запуском массива.