Консультация № 159833
07.02.2009, 06:18
0.00 руб.
0 8 3
День добрый многоуважаемые господа эксперты.....Вопрос в следующем ... Имеется указатель на массив как по этому указателю опредилить количество элементов в массиве ?

_msize(*p) не подходит так как не всегда указатель ссылается на динамический массив, а если воспользоваться им для статики сразу КРАХ . . .

vector тоже не подходит по ряду причин . . .

Да по большому счету есть функция вида ->

unsigned int function(type *Array)
{
----//----
return ArrayCount;

}

Обсуждение

давно
Академик
20764
1861
07.02.2009, 11:07
общий
это ответ
Здравствуйте, Жилкин Сергей Анатольевич!

Никак не узнать. Приходится либо количество элементов передавать отдельно и явно, либо придумывать дополнительное соглашение, например записывать 0 в конце, как в символьных строках.
Неизвестный
07.02.2009, 12:59
общий
это ответ
Здравствуйте, Жилкин Сергей Анатольевич!

может быть вот так...
unsigned int function(type *Array)
{
unsigned int ArrayCount=0;
while(*Array)
{
ArrayCount++;
}

return ArrayCount;
}
Неизвестный
09.02.2009, 06:19
общий
это ответ
Здравствуйте, Жилкин Сергей Анатольевич!

Ну, по идее, надо всегда "помнить", кто статический, а кто динамический массив и применять к ним соответсвующие функции.

Но если это библиотека, например, то можно сделать следующее:
Проверяем адрес первого элемента массива. Статические и динамически созданные объекты лежат в разных кусках памяти, поэтому по адресу первого объекта можно понять, из кучи он или нет, если из кучи - _msize, если нет - sizeof/sizeof
Неизвестный
09.02.2009, 23:13
общий
Сандров Алекс, только вот насчет "если нет - sizeof/sizeof " так не получится. Поскольку sizeof(type*) равен на 32х битных системах 4байта, а sizeof(type) равен размеру типа но никак не массива на который указывает указатель. Остается явно передавать размер массива в функцию или организовать свой класс-массив в котором будут все эти проблемы решены либо использовать что либо из STL типа vector.
Неизвестный
10.02.2009, 06:23
общий
A a[10];

if((sizeof a/sizeof A) == 10)
MessageBox(NULL, "Прав!", "Сандров Алекс", 0);

Неизвестный
10.02.2009, 06:42
общий
Сандров Алекс, Имеется указатель на массив как по этому указателю опредилить количество элементов в массиве и по большому счету есть функция вида
unsigned int function(type *Array)

Поэтому не правы.

Код:

type A[10];
type *iptr=A;
if(sizeof(*iptr)!=10*sizeof(type))
MessageBoxA(NULL, "Прав!", "Micren ;)", 0);


Надо мыслить в контексте вопроса.
Неизвестный
10.02.2009, 08:11
общий

Ну, по крайней мере, можно определить, динамический объект или нет, и если динамический - посчитать его длину.
А про стековый и глобальный... надо подуууумать... надо подуууумать...
Хотя дохлый номер. С точки зрения компилятора стековые объекты - сплошной кусок памяти. Код ассемблера на объявление и инициализацию памяти для двух интов совершенно идентичен коду для массива из двух интов. Грустно.
Неизвестный
10.02.2009, 13:02
общий
sub esp,8
...
add esp,8
выхода нет.:)
хотя ничего грустного тут нет. В ООП сила.
Форма ответа