Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
borisov_01
3 / 3 / 0
Регистрация: 08.03.2015
Сообщений: 18
1

Как найти количество элементов массива, зная лишь адрес первого элемента и тип?

03.05.2015, 13:53. Просмотров 889. Ответов 10
Метки нет (Все метки)

Где-то в коде объявлен массив, кол-во элементов неизвестно, имеется ссылочная переменная на этот массив и все, назовем ее (А), как узнать кол-во элементов в массиве?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2015, 13:53
Ответы с готовыми решениями:

Найти произведение и количество элементов массива, расположенных до первого отрицательного элемента
Народ помогите построить программу Задание такое: Найти произведение и...

Найти количество элементов массива, расположенных после первого нулевого элемента
Задан массив целых чисел Х(n). Найти количество элементов массива,...

Найти произведение и количество элементов массива, расположенных до первого отрицательного элемента
окунулся в с++ буквально неделю назад и много ещё не понимаю. может кто помочь....

Найти сумму и количество элементов массива, расположенных после первого положительного элемента
Добрый день! Подскажите как мне найти количество элементов расположенных после...

Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив равны.
Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели...

10
nmcf
6277 / 5578 / 2539
Регистрация: 14.04.2014
Сообщений: 23,471
03.05.2015, 13:56 2
Никак.
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
03.05.2015, 15:49 3
Цитата Сообщение от borisov_01 Посмотреть сообщение
Где-то в коде объявлен массив
Динамически объявлен?
0
borisov_01
3 / 3 / 0
Регистрация: 08.03.2015
Сообщений: 18
03.05.2015, 16:17  [ТС] 4
Попробую задать иначе: есть ссылочная переменная содержащая адрес первого элемента массива (объявленного статически), тип данных массива соответственно можно узнать, ведь у нас есть ссылка на него, необходимо найти количество элементов массива
0
Iridiscent
18 / 18 / 10
Регистрация: 20.04.2015
Сообщений: 108
03.05.2015, 16:22 5
если массив char то последним элементом должен быть '\0' (если он не двумерный)
0
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
03.05.2015, 16:27 6
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от borisov_01 Посмотреть сообщение
Попробую задать иначе: есть ссылочная переменная содержащая адрес первого элемента массива (объявленного статически), тип данных массива соответственно можно узнать, ведь у нас есть ссылка на него, необходимо найти количество элементов массива
никак.

если бы у вас была ссылка на сам массив - бес проблем.

но у вас только адрес первого элемента.
указатели такую информацию не хранят.

если бы данные были бы расположены в динамической памяти,
тогда можно было бы узнать размер используя нестандартные расширения компиляторов.

но у вас обычный статический массив.

так что - никак.
1
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
03.05.2015, 16:30 7
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от borisov_01 Посмотреть сообщение
есть ссылочная переменная содержащая адрес первого элемента массива (объявленного статически),
Если имеется ввиду, имя массива, то варианты такие:
C++
1
cout << sizeof(A) / sizeof(int) << endl; // тип массива int
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// N - количество элементов (вычисляется автоматически, в зависимости от переданного массива)
template<class T, size_t N>  
size_t view (const T (&ar)[N] )   //<--- передача по ссылке    
{   
    return N;
}
 
int main()
{
    int ar1[]={ 1, 2, 3, 4, 5, 6, 7, 8, 9};
    
    float ar2[]={ 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f, 7.5f };
    
    size_t N = view(ar1);
    cout << N << endl;
    N = view(ar2);
    cout << N << endl;
 
}
1
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
03.05.2015, 16:32 8
Цитата Сообщение от Iridiscent Посмотреть сообщение
если массив char то последним элементом должен быть '\0' (если он не двумерный)
никому он ничего не должен.
это сильно зависит от способа использования.

например, техника boost::optional<T> под капотом использует массив для аллокации объекта.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//--- сильно упрощено
//--- реальная реализация сложнее
//--- учитывает выравнивание, и тп.
 
//--- хранилище данных способное вместить в себя объект типа some
char buf[ sizeof(some) ];
 
//--- аллоцируем объект в хранилище
new (buf) some; //<--- и что по вашему теперь содержит чаровый буфер?
 
//--- доступ к объекту, расположенному в хранилище
some* ptr = reinterpret_cast<some*>(buf); 
 
ptr->work();
1
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
03.05.2015, 16:43 9
Цитата Сообщение от borisov_01 Посмотреть сообщение
Попробую задать иначе:
Всегда лучше пример привести, чем на словах объяснять.
0
borisov_01
3 / 3 / 0
Регистрация: 08.03.2015
Сообщений: 18
04.05.2015, 00:59  [ТС] 10
массив типа GLuint (из библиотеки GLUT) необходимо передать в функцию? и в функции определить кол-во его элементов, лично у меня(раздел для новичков) получается передать в функцию только ссылку на массив, поэтому такой вопрос), я понимаю то что можно передать независимо в функцию кол-во элементов sizeof(mas)/sizeof(GLuint) и много чего еще, НО меня интересуют именно возможности при передачи ссылки на массив.

Добавлено через 5 минут
void XXX(GLuint* mas)

Добавлено через 4 минуты
Если я туплю то заранее прошу меня извинить, можно конечно сделать так void XXX(sizeof(mas)/sizeof(GLuint)), но это очевидно, а меня интересует все таки void XXX(GLuint* mas)
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
04.05.2015, 01:07 11
Цитата Сообщение от borisov_01 Посмотреть сообщение
НО меня интересуют именно возможности при передачи ссылки на массив.
Добавлено через 5 минут
void XXX(GLuint* mas)
Не путай понятия.Передача ссылки на массив это вот такое:
C++
1
void XXX(GLuint (&mas)[10]);
У тебя просто указатель.

Добавлено через 3 минуты
Сделай функцию шаблонной (пример в 7 посте), передавай туда имя массива, размер там автоматически определяется (если только массив статически создан).

Добавлено через 2 минуты
Насчёт передачи просто указателя, уже написали выше.
1
04.05.2015, 01:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2015, 01:07

Вычислить количество элементов массива целых M [15] больших квадрата первого элемента этого массива
Помогите пожалуйста решить. Вычислить количество элементов массива целых M ...

Адрес первого элемента массива
1. Написать функцию, принимающую в качестве параметра количество строк и...

Найти количество перемещений первого элемента заданного массива
Помогите пожалуйста найти количество перемещений первого элемента Я не понимаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru