Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/335: Рейтинг темы: голосов - 335, средняя оценка - 4.96
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1

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

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

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

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

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

Кстати все примеры которые видел, с передачей, там передается не только сам массив, но еще и его размер вторым параметром...
Может в этом кроется какой-то своеобразный смысл? Но как по привычке паскалевской, думаю так же узнать размер, нужно для цикла считающего до конца массива...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2012, 16:55
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

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

Как по мне я бы вообще ему сдавал бы программы хоть на дельфи написанные, программа все равно выполняет требуемые действия в конечном итоге...
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
06.03.2012, 20:24
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2012, 20:24
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru