5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
1

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

06.03.2012, 16:55. Показов 64019. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно терроризировал вчера весь гугль, ничего кроме такого метода нахождения длины не нашел
C++
1
sizeof(massiv)/sizeof(massiv_typ)
но данная конструкция как-то коряво работает, если массив передавать в функцию, и в гугле нашел, что так работать не будет с массивами которые передаются как параметры функциям

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

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

Кстати все примеры которые видел, с передачей, там передается не только сам массив, но еще и его размер вторым параметром...
Может в этом кроется какой-то своеобразный смысл? Но как по привычке паскалевской, думаю так же узнать размер, нужно для цикла считающего до конца массива...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2012, 16:55
Ответы с готовыми решениями:

Определить среднюю длину непрерывных участков отрицательных значений элементов массива
в массиве A определить среднюю длину непрерывных участков отрицательных значений элементов буду...

Определить длину и позицию слова, которое имеет наименьшую длину в строке
Определить длину и позицию слова, которое имеет наименьшую длину в строке. Строки Пожалуйста...

Определить длину самой упорядоченной части массива
Проверить упорядочен ли массив b(n) по возрастанию или убыванию элементов. Если массив не...

Определить длину вектора, сформированного из элементов массива
Еще одна проблема помогите пожалуйста.. Масив: Z = {−2; 9; 10; −2; 9; 1; 14; 9;...

19
45 / 10 / 3
Регистрация: 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;
}
1
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
06.03.2012, 17:06  [ТС] 3
ммм, я имел ввиду про стандартные методы, даже не стандартные, а простые, просто не от меня зависит то, что и как я бы это использовал, имеются ограничения при решении задач

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

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

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

sizeof(<тип элементов массива>) * <количество элементов>
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
06.03.2012, 17:19 6
Цитата Сообщение от go Посмотреть сообщение
В С++ используется std::vector
ну или std::array
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
06.03.2012, 17:30  [ТС] 7
Цитата Сообщение от primuspd Посмотреть сообщение
длинна массива по количеству элементов определяется при объявлении
а если это динамический массив?, извините если я говорю сленгом паскаля, может тут не так оно называется...
Цитата Сообщение от primuspd Посмотреть сообщение
sizeof(<тип элементов массива>) * <количество элементов>
нужно только обратная операция... найти кол-во элементов
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
06.03.2012, 17:39 8
Цитата Сообщение от Arcor Посмотреть сообщение
а если это динамический массив?, извините если я говорю сленгом паскаля, может тут не так оно называется...
А вы, когда память выделяете разве не указываете то самое количество памяти?
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
06.03.2012, 17:49  [ТС] 9
Цитата Сообщение от fasked Посмотреть сообщение
А вы, когда память выделяете разве не указываете то самое количество памяти?
Цитата Сообщение от Arcor Посмотреть сообщение
если массив передавать в функцию
а если я например хочу скажем функцией сосчитать сумму элементов, и отвязать функцию от конкретных размерностей, что массив будет равен 2 элементам, или будет равен 1 000 000 элементам - функция должна будет мне сосчитать... вот и нужно мне же будет в функции моей досчитать до скольки-то, и перебор сложить меж собой. А массив который я передам он будет иметь конкретный размер уже
0
277 / 150 / 25
Регистрация: 05.11.2011
Сообщений: 429
Записей в блоге: 1
06.03.2012, 17:50 10
Arcor, делайте так
C
1
int func(int array[], int lenght) {...}
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
06.03.2012, 17:52 11
Цитата Сообщение от Arcor Посмотреть сообщение
А массив который я передам он будет иметь конкретный размер уже
Только так
C++
1
2
for ( auto &i : arr )
   total += i;
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 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));
нужно нечто, что не привязывало бы функцию к конкретному размеру!
0
277 / 150 / 25
Регистрация: 05.11.2011
Сообщений: 429
Записей в блоге: 1
06.03.2012, 17:58 13
Arcor, и в чем проблема передать вторым параметром размер массива, а в цикле указать этот самый размер. Точно также получится.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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/... cc76c08079

Добавлено через 2 минуты
Arcor, а вообще для подсчета суммы есть std::accumulate
1
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
06.03.2012, 18:09  [ТС] 15
такое чувство, выше писаный текст никто не читал ...
ладно, раз нету таких примудростей, будем передавать вторым параметром размер... Все же получается привязка, и размер везде, не одном месте придется задавать ручками
не удобно зная один язык, писать в другом тянет постоянно на лад того что знаешь

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

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

Добавлено через 45 секунд
Цитата Сообщение от go Посмотреть сообщение
Arcor, а вообще для подсчета суммы есть std::accumulate
да подсчет суммы был просто пример
0
Заблокирован
Автор 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(...){} блоком, т.е. ловить первый выход за пределы отведенной памяти
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
06.03.2012, 18:56 17
Цитата Сообщение от Arcor Посмотреть сообщение
А массив который я передам он будет иметь конкретный размер уже
Видимо Вы передаете указатель, а не массив
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
06.03.2012, 19:43 18
Arcor, в Ваших постах есть ответы, на Ваши же вопросы. Ничего нового сказать я не могу.
По поводу передачи массива в функцию. Как отметил fasked, Вы передаете не массив, а указатель на его первый элемент. И в самой функции Вы определить размер выделенной памяти, наверное, уже не сможете. Поэтому всегда передается и размер массива, как параметр(или итератор на начало и конец, как во всех функция STL).
Но! Можно всегда выкрутиться.
C++
1
2
3
4
5
template<typename Iterator>
void fun(Iterator first, Iterator last) 
{
   /* ... */
}
Но все-таки у меня возникает вопрос: зачем писать на С++, но использовать Си-массивы?
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
06.03.2012, 19:47  [ТС] 19
Цитата Сообщение от go Посмотреть сообщение
Но все-таки у меня возникает вопрос: зачем писать на С++, но использовать Си-массивы?
Спроси лучше у моего профессора, если получишь внятное объяснение, расскажешь мне

Как по мне я бы вообще ему сдавал бы программы хоть на дельфи написанные, программа все равно выполняет требуемые действия в конечном итоге...
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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/... 488fea32d0
Но все же лучше этого варианта
Цитата Сообщение от go
Но! Можно всегда выкрутиться.
Код C++
1
2
3
4
5
template<typename Iterator>
void fun(Iterator first, Iterator last)
{
/* ... */
}
я еще не встречал.
0
06.03.2012, 20:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2012, 20:24
Помогаю со студенческими работами здесь

Определить минимальную длину последовательности ненулевых элементов массива
Задан массив четырехбайтовых чисел, содержащий нулевые элементы. Определить минимальную длину...

Как определить длину отдельного элемента двумерного массива
Доброго времени суток! Хотел бы кое-что узнать, по скольку в поиске не нашел ответа: Как...

Найти произведение элементов массива.Определить длину самого короткого слова.
1)Дан квадратный массив размерностью 5х5. Найти произведение элементов массива, расположенных в...

invalid qualifier при попытке определить длину массива внутри функции
Задача не суть важна. При попытке нажать кнопку, программа исправно работает до вызова функции,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru