Форум программистов, компьютерный форум CyberForum.ru

Определить длину массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 5.00
Arcor
 Аватар для Arcor
4766 / 1767 / 153
Регистрация: 20.11.2009
Сообщений: 5,583
Записей в блоге: 1
06.03.2012, 16:55     Определить длину массива #1
Собственно терроризировал вчера весь гугль, ничего кроме такого метода нахождения длины не нашел
C++
1
sizeof(massiv)/sizeof(massiv_typ)
но данная конструкция как-то коряво работает, если массив передавать в функцию, и в гугле нашел, что так работать не будет с массивами которые передаются как параметры функциям

кто знаком с паскалем, там есть функция узнать длину массива обычных стандартных типов это
Pascal
1
Length(massiv)
нужно что-то подобное мне и в с++

Как такое чудо можно организовать?

Кстати все примеры которые видел, с передачей, там передается не только сам массив, но еще и его размер вторым параметром...
Может в этом кроется какой-то своеобразный смысл? Но как по привычке паскалевской, думаю так же узнать размер, нужно для цикла считающего до конца массива...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Новенький
44 / 9 / 2
Регистрация: 03.03.2009
Сообщений: 254
06.03.2012, 17:00     Определить длину массива #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <vector>
#include <iostream>
 
int main( )
{
   using namespace std;   
   vector <int> v1;
   vector <int>::size_type i;
   
   v1.push_back( 1 );
   i = v1.size( );
   cout << "Vector length is " << i << "." << endl;
 
   v1.push_back( 2 );
   i = v1.size( );
   cout << "Vector length is now " << i << "." << endl;
}
Arcor
 Аватар для Arcor
4766 / 1767 / 153
Регистрация: 20.11.2009
Сообщений: 5,583
Записей в блоге: 1
06.03.2012, 17:06  [ТС]     Определить длину массива #3
ммм, я имел ввиду про стандартные методы, даже не стандартные, а простые, просто не от меня зависит то, что и как я бы это использовал, имеются ограничения при решении задач

Но все равно спасибо
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
06.03.2012, 17:16     Определить длину массива #4
Arcor, В С++ используется std::vector
Тогда размер vector::size
primuspd
4 / 4 / 0
Регистрация: 11.08.2011
Сообщений: 62
06.03.2012, 17:18     Определить длину массива #5
что значит "длину массива"?

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

А если тебе надо узнать, сколько байт занимает массив, то

sizeof(<тип элементов массива>) * <количество элементов>
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.03.2012, 17:19     Определить длину массива #6
Цитата Сообщение от go Посмотреть сообщение
В С++ используется std::vector
ну или std::array
Arcor
 Аватар для Arcor
4766 / 1767 / 153
Регистрация: 20.11.2009
Сообщений: 5,583
Записей в блоге: 1
06.03.2012, 17:30  [ТС]     Определить длину массива #7
Цитата Сообщение от primuspd Посмотреть сообщение
длинна массива по количеству элементов определяется при объявлении
а если это динамический массив?, извините если я говорю сленгом паскаля, может тут не так оно называется...
Цитата Сообщение от primuspd Посмотреть сообщение
sizeof(<тип элементов массива>) * <количество элементов>
нужно только обратная операция... найти кол-во элементов
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.03.2012, 17:39     Определить длину массива #8
Цитата Сообщение от Arcor Посмотреть сообщение
а если это динамический массив?, извините если я говорю сленгом паскаля, может тут не так оно называется...
А вы, когда память выделяете разве не указываете то самое количество памяти?
Arcor
 Аватар для Arcor
4766 / 1767 / 153
Регистрация: 20.11.2009
Сообщений: 5,583
Записей в блоге: 1
06.03.2012, 17:49  [ТС]     Определить длину массива #9
Цитата Сообщение от fasked Посмотреть сообщение
А вы, когда память выделяете разве не указываете то самое количество памяти?
Цитата Сообщение от Arcor Посмотреть сообщение
если массив передавать в функцию
а если я например хочу скажем функцией сосчитать сумму элементов, и отвязать функцию от конкретных размерностей, что массив будет равен 2 элементам, или будет равен 1 000 000 элементам - функция должна будет мне сосчитать... вот и нужно мне же будет в функции моей досчитать до скольки-то, и перебор сложить меж собой. А массив который я передам он будет иметь конкретный размер уже
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
06.03.2012, 17:50     Определить длину массива #10
Arcor, делайте так
C
1
int func(int array[], int lenght) {...}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
06.03.2012, 17:52     Определить длину массива #11
Цитата Сообщение от Arcor Посмотреть сообщение
А массив который я передам он будет иметь конкретный размер уже
Только так
C++
1
2
for ( auto &i : arr )
   total += i;
Arcor
 Аватар для Arcor
4766 / 1767 / 153
Регистрация: 20.11.2009
Сообщений: 5,583
Записей в блоге: 1
06.03.2012, 17:54  [ТС]     Определить длину массива #12
вот пример паскалевкого универсального кода...
сама функция подсчета суммы массива любой длины целых чисел
может так будет быстрее понять мою мысль
Delphi
1
2
3
4
5
6
function Sum(A: Array of Integer): Integer;
var i: Integer;
begin
  for i := 0 to Length(A) - 1 do
    Result := Result + A[i]
end;
далее использую функцию

Delphi
1
2
3
4
5
var Massiv: Array[0..99999] of Integer;
begin
// Тут где-то заполняю массив каким-либо методом...
// и вызываю функцию и вставляю в него свой массив, и вывожу результат на экран
WriteLn(Sum(Massiv));
нужно нечто, что не привязывало бы функцию к конкретному размеру!
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
06.03.2012, 17:58     Определить длину массива #13
Arcor, и в чем проблема передать вторым параметром размер массива, а в цикле указать этот самый размер. Точно также получится.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
06.03.2012, 18:05     Определить длину массива #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main()
{
   int arr[5] = {1, 2, 3, 4, 5}; 
   
   int sum = 0;
   
   for ( auto &i: arr )
      sum += i;
      
   std::cout << sum << std::endl;
}
Добавлено через 3 минуты
Цитата Сообщение от Arcor Посмотреть сообщение
вот пример паскалевкого универсального кода...
Вот пример С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
#include <numeric>
 
template<typename T>
T total(std::vector<T> arr)
{
   return std::accumulate(std::begin(arr), std::end(arr), 0);
}      
 
int main()
{
   std::vector<int> v = { 1, 2, 3, 4, 5 };
      
   std::cout << total(v) << std::endl;
}
http://liveworkspace.org/code/be5eb0...ea52cc76c08079

Добавлено через 2 минуты
Arcor, а вообще для подсчета суммы есть std::accumulate
Arcor
 Аватар для Arcor
4766 / 1767 / 153
Регистрация: 20.11.2009
Сообщений: 5,583
Записей в блоге: 1
06.03.2012, 18:09  [ТС]     Определить длину массива #15
такое чувство, выше писаный текст никто не читал ...
ладно, раз нету таких примудростей, будем передавать вторым параметром размер... Все же получается привязка, и размер везде, не одном месте придется задавать ручками
не удобно зная один язык, писать в другом тянет постоянно на лад того что знаешь

если у кого-то еще есть идеи, которых нету сверху - просьба выложить

заранее спасибо, и спасибо всем, пытавшимся мне помочь

Добавлено через 45 секунд
Цитата Сообщение от go Посмотреть сообщение
Arcor, а вообще для подсчета суммы есть std::accumulate
да подсчет суммы был просто пример
-=ЮрА=-
Заблокирован
Автор FAQ
06.03.2012, 18:13     Определить длину массива #16
Arcor, при желании можно 0 элементом массива передавать его размер, а все его данные будут начинаться с индекса 1.
Цитата Сообщение от Arcor Посмотреть сообщение
sizeof(massiv)/sizeof(massiv_typ)
- такая конструкция работает только для статических массивов!Т.е. здесь

Цитата Сообщение от go Посмотреть сообщение
int main()
{
* *int arr[5] = {1, 2, 3, 4, 5};
- размер массива можно было бы получить посредством
C++
1
int n = sizeof(arr)/sizeof(arr[0]);
Но для динамического массива такой способ не подходит. Проще со строками у них вконце всегда идёт 0-терминатор поєтому для строк можно не передавать в функцию их длинну

Добавлено через 2 минуты
Arcor, для нечаровских динамических массивов отловить маркер его конца можно наверно только с try{}catch(...){} блоком, т.е. ловить первый выход за пределы отведенной памяти
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.03.2012, 18:56     Определить длину массива #17
Цитата Сообщение от Arcor Посмотреть сообщение
А массив который я передам он будет иметь конкретный размер уже
Видимо Вы передаете указатель, а не массив
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
06.03.2012, 19:43     Определить длину массива #18
Arcor, в Ваших постах есть ответы, на Ваши же вопросы. Ничего нового сказать я не могу.
По поводу передачи массива в функцию. Как отметил fasked, Вы передаете не массив, а указатель на его первый элемент. И в самой функции Вы определить размер выделенной памяти, наверное, уже не сможете. Поэтому всегда передается и размер массива, как параметр(или итератор на начало и конец, как во всех функция STL).
Но! Можно всегда выкрутиться.
C++
1
2
3
4
5
template<typename Iterator>
void fun(Iterator first, Iterator last) 
{
   /* ... */
}
Но все-таки у меня возникает вопрос: зачем писать на С++, но использовать Си-массивы?
Arcor
 Аватар для Arcor
4766 / 1767 / 153
Регистрация: 20.11.2009
Сообщений: 5,583
Записей в блоге: 1
06.03.2012, 19:47  [ТС]     Определить длину массива #19
Цитата Сообщение от go Посмотреть сообщение
Но все-таки у меня возникает вопрос: зачем писать на С++, но использовать Си-массивы?
Спроси лучше у моего профессора, если получишь внятное объяснение, расскажешь мне

Как по мне я бы вообще ему сдавал бы программы хоть на дельфи написанные, программа все равно выполняет требуемые действия в конечном итоге...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2012, 20:24     Определить длину массива
Еще ссылки по теме:

Определить длину каждого слова в предложении C++
Как определить длину строки C++
C++ Определить длину строки

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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
06.03.2012, 20:24     Определить длину массива #20
Цитата Сообщение от Arcor Посмотреть сообщение
function Sum(A: Array of Integer): Integer;
В данном случае передается копия массива. И в Паскале Вам бы пришлось указать размер этого массива самостоятельно

Добавлено через 35 секунд
Цитата Сообщение от Arcor Посмотреть сообщение
Спроси лучше у моего профессора, если получишь внятное объяснение, расскажешь мне
Цитата Сообщение от go Посмотреть сообщение
Но! Можно всегда выкрутиться.
Тогда только так.

Добавлено через 36 минут
Arcor, единственное, что приходит на ум, так для того чтобы не передавать вторым параметром размер массива в функцию при использовании Си-массивов, так это использовать вместо них, связный список, например.

Еще один способ менее универсальный, так это использовать какой-нибудь признак конца массива(значение, которое никогда не встретится в вашем массиве). Т.е., например, значение INT_MIN
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <climits>
 
int sum(int* arr)
{
   int total = 0;
   
   while(*arr++ != INT_MIN)
      total += *(arr - 1);
   return total;
}
 
int main()
{
   int arr[5] = {1, 2, 3, 4};
   arr[4] = INT_MIN;
   std::cout << sum(arr) << std::endl;
}
http://liveworkspace.org/code/bb6393...94d8488fea32d0
Но все же лучше этого варианта
Цитата Сообщение от go
Но! Можно всегда выкрутиться.
Код C++
1
2
3
4
5
template<typename Iterator>
void fun(Iterator first, Iterator last)
{
/* ... */
}
я еще не встречал.
Yandex
Объявления
06.03.2012, 20:24     Определить длину массива
Ответ Создать тему
Опции темы

Текущее время: 13:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru