Родились сегодня:
Rosiam


Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

724

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

326

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

279

Россия, Санкт-Петербург


ID: 325460

CradleA

Мастер-Эксперт

212

Беларусь, Минск


ID: 400815

alexleonsm

6-й класс

130


ID: 400669

epimkin

Профессионал

120


ID: 401888

puporev

Профессор

111

Россия, Пермский край


8.8.15

09.05.2021

JS: 2.8.21
CSS: 4.5.5
jQuery: 3.6.0
DataForLocalStorage: 2021-05-11 18:46:03-standard


Создание программ на языках C и C++.

Администратор раздела: CradleA (Мастер-Эксперт)

Консультация онлайн # 159833

Раздел: С / С++
Автор вопроса: Жилкин Сергей Анатольевич
Дата: 07.02.2009, 06:18 Консультация закрыта
Поступило ответов: 3

День добрый многоуважаемые господа эксперты.....Вопрос в следующем ... Имеется указатель на массив как по этому указателю опредилить количество элементов в массиве ?

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

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

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

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

}

Ответ # 243087 от Хватов Сергей
Здравствуйте, Жилкин Сергей Анатольевич!

Никак не узнать. Приходится либо количество элементов передавать отдельно и явно, либо придумывать дополнительное соглашение, например записывать 0 в конце, как в символьных строках.

Хватов Сергей

Академик
07.02.2009, 11:07
Ответ # 243093 от Kamerad
Здравствуйте, Жилкин Сергей Анатольевич!

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

return ArrayCount;
}

Kamerad

Посетитель
07.02.2009, 12:59
Ответ # 243216 от Сандров Алекс
Здравствуйте, Жилкин Сергей Анатольевич!

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

Но если это библиотека, например, то можно сделать следующее:
Проверяем адрес первого элемента массива. Статические и динамически созданные объекты лежат в разных кусках памяти, поэтому по адресу первого объекта можно понять, из кучи он или нет, если из кучи - _msize, если нет - sizeof/sizeof

Сандров Алекс

Посетитель
09.02.2009, 06:19
Мини-форум консультации # 159833
Micren

1

= общий =    09.02.2009, 23:13

Сандров Алекс, только вот насчет "если нет - sizeof/sizeof " так не получится. Поскольку sizeof(type*) равен на 32х битных системах 4байта, а sizeof(type) равен размеру типа но никак не массива на который указывает указатель. Остается явно передавать размер массива в функцию или организовать свой класс-массив в котором будут все эти проблемы решены либо использовать что либо из STL типа vector.

Сандров Алекс

2

= общий =    10.02.2009, 06:23

A a[10];

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

Micren

3

= общий =    10.02.2009, 06:42

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

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

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


Надо мыслить в контексте вопроса.

Сандров Алекс

4

= общий =    10.02.2009, 08:11

smile
Ну, по крайней мере, можно определить, динамический объект или нет, и если динамический - посчитать его длину.
А про стековый и глобальный... надо подуууумать... надо подуууумать...
Хотя дохлый номер. С точки зрения компилятора стековые объекты - сплошной кусок памяти. Код ассемблера на объявление и инициализацию памяти для двух интов совершенно идентичен коду для массива из двух интов. Грустно.

Micren

5

= общий =    10.02.2009, 13:02

sub esp,8
...
add esp,8
выхода нет.:)
хотя ничего грустного тут нет. В ООП сила.

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

CradleA

Мастер-Эксперт

Рейтинг: 212

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 81

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 73

Хватов Сергей

Академик

Рейтинг: 27

Степанов Иван /REDDS

4-й класс

Рейтинг: 1

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0