Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.65/49: Рейтинг темы: голосов - 49, средняя оценка - 4.65
Fidyum4yk
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 40
1

Как определить количество элементов массива?

12.11.2012, 19:23. Просмотров 9262. Ответов 24
Метки нет (Все метки)

Добрый день!
Пишу в Atmel Studyo6 на Си, опыта не много. Прошу, подскажите функцию которая возвращает количество элементов массива:
Вариант№1: unsykned char mas1[5] -собственно функция должна вернуть число 6.
Вариант№2: unsykned char mas2[] - скажем если заранее кол-во нам неизвестно, только тип массива, а формируется он в процессе выполнения программы.
Вариант№3: unsykned char mas3[3]={A,B,C} - собственно массив символьный(или строковый не знаю как точнее) функция должна вернуть значение 3.

Хочу запустить цикл скажем от 0 до кол-ва элементов в массиве.
Гугл что-то не помогает, вопрос вроде бы плевый.

И еще, может есть у кого справка с описанием функций стандартных подключаемых библиотек??? А то во встроенной справке чет ниче поэтому поводу нет (
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2012, 19:23
Ответы с готовыми решениями:

количество четных элементов одномерного массива до числа равному а, Определить количество нечетных элементов двумерного массива
1.Найти количество четных элементов одномерного массива до первого встреченного числа равного...

Как определить количество элементов массива в заданном диапазоне?
Как найти количество элементов больше заданного значения я знаю: #include "stdafx.h" #include...

Записать положительные элементы массива X подряд в массив Y. Определить k – количество положительных элементов. Вычислит сумму элементов массива Y
Записать положительные элементы массива X=(x1,x2,…, xn) подряд в массив Y=(y1,y2,…, yk)....

Определить количество тех элементов массива, значения которых меньше среднего арифметического элементов массива
Помогите составить программу Массив содержит 8 действительных чисел. Определить количество тех...

24
vystor.s
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 168
12.11.2012, 19:49 2
sizeof(mas1)

а почему в первом случае Вы ожидаете получить 6 а не 5?
0
Fidyum4yk
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 40
12.11.2012, 19:56 3
Цитата Сообщение от vystor.s
sizeof(mas1)

а почему в первом случае Вы ожидаете получить 6 а не 5?
Да, извиняюсь, результат 5. Элененты от 0 до 4... Поторопился.
0
Fidyum4yk
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 40
12.11.2012, 20:16 4
Цитата Сообщение от vystor.s
sizeof(mas1)
Насколько я понимаю это покажет кол-во байт в памяти, которое занимает массив, и да, в случае с типом char все верно. А если будет другой тип массива??? Например int? результат делить пополам? с long... на 4 и т.д.???
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
12.11.2012, 20:19 5
Если более правильно (то есть именно количество элементов, а не размер в байтах), то sizeof(mas1)/sizeof(mas1[0]). Но это только для случаев 1 и 3.

А лучше это даже задефайнить:

Код
#define countof(array) (sizeof(array)/sizeof(array[0]))

А уж потом использовать

countof(mas1)
Но, во втором случае, когда mas2[] -

- Вы не сможете объявить такой массив, можно только объявить char * mas2;
- Элененты придётся где-то считать и где-то хранить, либо договориться с собой от терминальном символе, например 0 (не печатный 0, а нулевой символ).
0
Fidyum4yk
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 40
12.11.2012, 20:30 6
Огромное спасибо. Теперь все ясно!
0
kytikot
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
12.11.2012, 21:46 7
В самом общем случае массив в Си не является особымтипом, и нельзя вычислить размер массива. Потому что массив - это просто последовательность данных.
Возможно, современные компиляторы следят за размерами массивов типа const... но всегда надеяться на это нельзя. Прагриннист в Си должен сам следить за размерами массивов.

А функция sizeof(mas) скорее всего выдаст размер указателя.
0
Sysorsky
0 / 0 / 0
Регистрация: 24.12.2010
Сообщений: 279
13.11.2012, 00:24 8
В Си массив это ВСЕГДА только указатель на первый (нулевой по индексу) элемент! Вы говорите про динамический массив, которого в Си (стандарте) нет. Поэтому и размер его вернуть нельзя.
Но работать с размером массива можно. Надо в начеле сделать #define MyArraySize 10, а потом везде где работаешь с массивом используешь только константу MyArraySize. Если размер массива меняешь, поправь константу.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
13.11.2012, 01:35 9
Цитата Сообщение от kytikot
В самом общем случае массив в Си не является особымтипом, и нельзя вычислить размер массива. Потому что массив - это просто последовательность данных.
Возможно, современные компиляторы следят за размерами массивов типа const... но всегда надеяться на это нельзя. Прагриннист в Си должен сам следить за размерами массивов.

А функция sizeof(mas) скорее всего выдаст размер указателя.
sizeof всегда выдает размер объекта. Если хотите иметь размер указателя на данный объект, то надо так и писать sizeof (*mas) Или нет?
0
kytikot
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
13.11.2012, 02:30 10
Потому что mas - это НЕ массив. Это УКАЗАТЕЛЬ на первый элемент массива.
В Си НЕТ типа данных "массив". Массив в Си это удобная форма организации данных, но она подчиняется основным ограничениям самого языка Си.
Запись объявления типа
int mas[]; - это всего лишь другая форма записи int *mas;

И поэтому sizeof не может вернуть размер массива, потому что массив - это НЕ объект, даже в отличие от структуры.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
13.11.2012, 02:42 11
Цитата Сообщение от kytikot
Потому что mas - это НЕ массив. Это УКАЗАТЕЛЬ на первый элемент массива.
В Си НЕТ типа данных "массив". Массив в Си это удобная форма организации данных, но она подчиняется основным ограничениям самого языка Си.
Запись объявления типа
int mas[]; - это всего лишь другая форма записи int *mas;

И поэтому sizeof не может вернуть размер массива, потому что массив - это НЕ объект, даже в отличие от структуры.
я вам советую внимательно перечитать руководство по языку Си. Тогда вы почувствуете разницу между
Код
char mas[10];
и
Код
char *mas;
Или нет?
http://www.hittoworld.ru/texts/somp/lang/c/c2/book010.htm
http://vilimpoc.org/risiorsh/snippets/sizeof-test/
0
disototor
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 523
13.11.2012, 02:43 12
Здается мне, ТС не в те дебри полез.
ТС, зачем вам это определение размера так сказать, вы не контролируете написания текста программы?
А вообще вот так
<Изображение удалено>
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
13.11.2012, 02:45 13
Цитата Сообщение от kytikot
А функция sizeof(mas) скорее всего выдаст размер указателя.
Не путайте холодное с мокрым! Всё зависит от того, что, где и как описано!

Если описывается char mas[MyArraySize] - это массив, к которому применим макрос countof, который я описал выше. Его внутренний тип (для компилятора) - const (char *), а sizeof() равен занимаемому размеру памяти.
Почему const? Да потому, что нельзя сделать операцию mas++ или mas = ptr. Нельзя "переместить" массив в памяти. Но, как только мы передаём массив в функцию - он становится обычным указателем и countof не применим. Размер нужно передавать другим способом.

То есть количество элементов массива можно определить только там, где он описан со скобками [].

В формальных параметрах функций записи char * mas и mas[] абсолютно (на 99% - зависит от компилятора) эквивалентны. То есть передавая массив, мы передаём указатель на него.
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
13.11.2012, 02:48 14
Цитата Сообщение от disototor
ТС, зачем вам это определение размера так сказать, вы не контролируете написания текста программы?
Это очень удобная фича!

Код
static const char * colors[] =
{
"red",
"kriim",
"blue"
....
}

for ( i=0; i< countof(colors); i++ )
{
prymtf("color %s\n", colors[i]);
}
0
disototor
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 523
13.11.2012, 02:50 15
Отфиксил свое сообщение выше.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
13.11.2012, 02:54 16
Цитата Сообщение от THI BIOST
В формальных параметрах функций записи char * mas и mas[] абсолютно (на 99% - зависит от компилятора) эквивалентны. То есть передавая массив, мы передаём указатель на него.
Они эквивалентны на 100%, ибо это определяется стандартом языка. Могу добавить, что я обычно использую запись типа mas[] в тех случаях, когда хочу подчеркнуть, что данный аргумент является массивом.
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
13.11.2012, 02:59 17
Цитата Сообщение от Bytt
Они эквивалентны на 100%, ибо это определяется стандартом языка.
И тараканами в головах разработчиков компиляторов. Формально mas[] - нельзя изменять!, а * mas - можно.

Цитата Сообщение от Bytt
Могу добавить, что я обычно использую запись типа mas[] в тех случаях, когда хочу подчеркнуть, что данный аргумент является массивом.
Я тоже использую.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
13.11.2012, 04:25 18
Цитата Сообщение от THI BIOST
Формально mas[] - нельзя изменять!, а * mas - можно.
Это почему?
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
13.11.2012, 04:41 19
Нельзя изменять не элементы массива, а сам указатель. По сути, mas[] это тот же массив, только объявленный в формальных параметрах функции. Это по логике. И есть такие компиляторы (не помню, но у меня есть пометка о таком поведении).

Но, к сожалению, это (как и многое другое) в стандартах прописано нечётко либо не прописано совсем. Зависит от парсера типов в компиляторе.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
13.11.2012, 08:38 20
Цитата Сообщение от THI BIOST
Нельзя изменять не элементы массива, а сам указатель. По сути, mas[] это тот же массив, только объявленный в формальных параметрах функции. Это по логике. И есть такие компиляторы (не помню, но у меня есть пометка о таком поведении).

Но, к сожалению, это (как и многое другое) в стандартах прописано нечётко либо не прописано совсем. Зависит от парсера типов в компиляторе.
Я опять ничего не понял. Растолкуйте непонятливому. Спасибо.
0
13.11.2012, 08:38
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 08:38

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Определить количество элементов массива, меньших среднего арифметиче-ского значений элементов этого массива
Времени нет , только ещё учу . нужно сделать срочно работы . углубился в учебник пока , но не...

Определить количество четных элементов массива и количество элементов, оканчивающихся а цифру 5
Одномерные массивы. Дан массив целых чисел. Определить количество четных элементов и количество...

Определить количество четных элементов массива и количество элементов, оканчивающихся на цифру 5
помогите очень надо. 3.Одномерные массивы. Дан массив целых чисел. Определить количество четных...

Определить сумму указанных элементов, количество нечетных элементов и среднее арифметическое четных элементов массива
Дан двумерный массив целых чисел. Определить: 1. Сумму элементов массива, больших 30 2....


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

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

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