Как найти 'sizeof' (указатель, указывающий на массив)?

Похоже, я нашел решение.

Я обновил демо (это только PoC) https://github.com/tomo0613/3d-animated-char-test

первым (в блендере): [116 ]

  • добавить кости к обуви, которые должны двигаться вместе с персонажем. (Я полагаю, что они должны иметь одинаковые кости [позиции, повороты, размеры]; в демонстрации есть различия)

, то есть код JS:

  • добавить туфлю (вся сетка) как дочерняя сетка к кости ноги.
  • перед каждым рендерингом копируйте свойства костей персонажей в свойства костей обуви [position & amp; кватернион]

Мне все еще любопытно, есть ли какой-нибудь намеренный / или лучший способ сделать это ??

288
задан Jonathan Leffler 17 January 2017 в 14:30
поделиться

3 ответа

Нет, Вы не можете. Компилятор не знает то, на что указывает указатель. Существуют приемы, как окончание массива с известным внеполосным значением и затем подсчетом размера вплоть до того значения, но это не использует sizeof.

Другой прием является тем, упомянутым Zan, который должен спрятать размер где-нибудь. Например, если Вы динамично выделяете массив, выделяете блок один интервал, больше, чем тот, Вы нуждаетесь, прячете размер в первом интервале и возвращаете ptr+1 как указатель на массив. Когда Вы нуждаетесь в размере, постепенно уменьшаете указатель и быстрый взгляд на спрятавшее значение. Просто не забудьте освобождать целый блок, запускающийся с начала и не только массива.

250
ответ дан Community 23 November 2019 в 01:46
поделиться

Для динамических массивов ( 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, такой как вектор, который намного более безопасен и легче использовать.

45
ответ дан Peter Mortensen 23 November 2019 в 01:46
поделиться

Ответ, "Нет".

то, Что делают программисты C, сохранить размер массива где-нибудь. Это может быть часть структуры, или программист может обмануть немного и malloc () больше памяти, чем требуемый для хранения значения длины перед запуском массива.

78
ответ дан Zan Lynx 23 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: