Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/47: Рейтинг темы: голосов - 47, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
1

Размер массива при передачи в функцию

25.06.2013, 14:26. Показов 9574. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
День добрый, подскажите столкнулся с такой проблемой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void masssize (char mass[])
{
        int size = sizeof(mass)/sizeof(mass[0]);
        cout << size;
}
 
int main ()
{
        char data[] = {'a','a','b','b','b','c','b','c'};
        int size = sizeof(data)/sizeof(data[0]);
        cout << size;
        masssize(data);
        int wait;
        cin >> wait;
}
Если массив не передан в функцию то выводит размер как 8, а когда передан, то 4, в чём может быть дело?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2013, 14:26
Ответы с готовыми решениями:

В чем ошибка при передачи статического массива в функцию
Не кидайте камни за использование глобальных переменных и статических двумерных массивов. Вроде...

Почему при передачи параметра(динамического массива) нельзя установить его размер через SetLength
procedure TFilter.CreateMassCheckBox(Var NameMass : array of TCheckBoxTransparent; Parent:...

Ошибка передачи массива в функцию
Доброго времени суток. Есть массив и функция,в которой этот массив используется. В 14 строке...

Каков синтаксис передачи массива в функцию?
Объясните пожалуйста синтаксис передачи массива в функцию Ps function f (mas:array of integer...

26
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.06.2013, 14:28 2
не путайте массив с указателем. в функцию передайте адрес начала массива и его размерность
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
25.06.2013, 14:31  [ТС] 3
Thinker, подскажи по синтаксису как в функцию передать адрес с размерностью.

Кстати, это значит что не зная размер массива я не могу передать его в функцию?
0
15 / 15 / 8
Регистрация: 25.06.2013
Сообщений: 63
25.06.2013, 14:35 4
cflood, у вас массив символов. и его размер можно узнать в функции через strlen(mass);
C++
1
int size = strlen(mass);
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.06.2013, 14:38 5
Цитата Сообщение от cflood Посмотреть сообщение
Thinker, подскажи по синтаксису как в функцию передать адрес с размерностью.
C++
1
2
3
4
5
6
7
8
9
10
11
int Print(int *a, int n)
{
   for(int i = 0; i < n; ++i)
      cout << a[i];
}
 
int main()
{
   int a[100];
   Print(a, 100);
}
Цитата Сообщение от cflood Посмотреть сообщение
Кстати, это значит что не зная размер массива я не могу передать его в функцию?
а как будете обрабатывать массив, не зная сколько в нем элементов?!
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
25.06.2013, 14:43  [ТС] 6
Thinker, ну например внутри функции я могу подсчитать размер массива, как я и хотел.
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.06.2013, 14:47 7
Цитата Сообщение от cflood Посмотреть сообщение
Thinker, ну например внутри функции я могу подсчитать размер массива, как я и хотел.
нет, не сможете, так как передаете адрес начала массива, который будет храниться в переменной-указателе. вы просто размер указателя делите на размер первого элемента массива.

Добавлено через 2 минуты
Цитата Сообщение от cflood Посмотреть сообщение
C++
1
2
3
4
5
void masssize (char mass[])
{
        int size = sizeof(mass)/sizeof(mass[0]);
        cout << size;
}
компилятор преобразует это в
C++
1
2
3
4
5
void masssize (char *mass)
{
        int size = sizeof(mass)/sizeof(*mass);
        cout << size;
}
так что mass это не массив, а переменная-указатель
1
С++ Beginner
120 / 120 / 77
Регистрация: 28.02.2013
Сообщений: 246
25.06.2013, 14:48 8
Цитата Сообщение от Thinker Посмотреть сообщение
не путайте массив с указателем. в функцию передайте адрес начала массива и его размерность
Вроде бы одно и то же. Там же фактически передаётся ссылка на первый элемент массива? &a[0]
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.06.2013, 14:51 9
Цитата Сообщение от MarVaL Посмотреть сообщение
Вроде бы одно и то же.
смотрите
int a[10] - массив размера 10 * sizeof (int)
int *pa - переменная указатель (обычно, размера 4 байта)
2
С++ Beginner
120 / 120 / 77
Регистрация: 28.02.2013
Сообщений: 246
25.06.2013, 14:53 10
Цитата Сообщение от Thinker Посмотреть сообщение
смотрите
int a[10] - массив размера 10 * sizeof (int)
int *pa - переменная указатель (обычно, размера 4 байта)
Нет ну понятно просто в функцию когда передаём массив можно:
C++
1
2
void f(int * arr, int n) // или
void f2(int arr[], int n); // тоже самое ведь?
Добавлено через 35 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <conio.h>
 
void print(int *arr, int n) {
  for(int i = 0; i != n; ++i)
    std::cout << arr[i] << " ";
}
 
void print_too(int arr[], int n) {
  for(int i = 0; i != n; ++i)
    std::cout << arr[i] << " ";
}
 
int main() {
  const int n = 5;
  int arr[n] = {0};
  print(&arr[0], n);
  std::cout << std::endl;
  print_too(&arr[0], n);
  _getch();
  return 0;
}
2
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.06.2013, 14:55 11
Цитата Сообщение от MarVaL Посмотреть сообщение
Нет ну понятно просто в функцию когда передаём массив можно:
C++
1
2
void f(int * arr, int n) // или
void f2(int arr[], int n); // тоже самое ведь?
компилятор второе выражение преобразует в первое, так что одно и тоже
2
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
25.06.2013, 15:11 12
Цитата Сообщение от cflood Посмотреть сообщение
подскажи по синтаксису как в функцию передать адрес с размерностью.
Можно передать не указатель, а ссылку
C++
1
2
3
4
5
6
7
template <std::size_t N>
void print_arr(int (&arr)[N])
{
    for(std::size_t i = 0; i < N; ++i)
        std::cout << arr[i] << ' ';
    std::cout << std::endl;
}
но работать это будет только для простых статических массивов(к тому же для каждой размерности массива будет создана собственная версия данной функции).
2
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
25.06.2013, 15:30  [ТС] 13
Благодарю, подскажите пожалуйста еще с такой задачкой

Есть массив mass[] = {'a','a','b','b','b','c','c','c','c','e'}
также есть счётчик повторений - recurring_count, который считает сколько подряд идёт одинаковых букв
size - размер массива

Всё это дело выводиться на экран в цикле

C++
1
2
3
4
5
6
7
8
9
10
11
12
        int recurring_count = 0;
        for (int i = 0; i < size; i++)
        {
            if (mass[i] != mass[i+1])
            {
                recurring_count++;
                cout << mass[i] << recurring_count;
                recurring_count = 0;
            } else {
                recurring_count++;
            }
        }
на выходе получаем:

C++
1
a2b3c4e1
Каким образом можно записать всё это дело в один массив? Ведь буквы типа char а цифры int, в один массив их не поместить, надо создавать два массива один под char с буквами другой под int с цифрами? Может есть решение поудобнее. Кстати в дальнейшем предполагается использовать цифры как int ибо они будут указывать количество повторений цикла.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.06.2013, 15:42 14
Цитата Сообщение от cflood Посмотреть сообщение
Каким образом можно записать всё это дело в один массив?
Массив используется для хранения однотипных значений. Если нужно хранить пары, то используйте массив из std:air<char,int> элементов.
1
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
25.06.2013, 16:47  [ТС] 15
Tulosba, можешь пример накидать? был бы очень благодарен.
Кстати pair можно хранить в массиве? чтобы в конечном итоге получить массив типа
a 2
b 3
c 4
e 1

???

Вообще я теряюсь немного от своей неопытности, вроде такая задача простая, в php/javasript бы не вызвало затруднений такой массив или строку сделать.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.06.2013, 17:04 16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <utility>
#include <vector>
 
int main() {
    
    using LetterNumber = std::pair<char, int>;
    std::vector<LetterNumber> v;
    
    v.push_back( std::make_pair('a',2) );
    v.push_back( std::make_pair('b',3) );
    v.push_back( std::make_pair('c',4) );
    
    for( const auto& e : v )
    {
        std::cout << e.first << " : " << e.second << std::endl;
    }
 
    return 0;
}
https://ideone.com/ZgXoN6
1
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
25.06.2013, 17:38  [ТС] 17
Еще один вопросик, есть у нас функция

C++
1
2
3
4
void testfunc (int size)
{
     int numbers[size]; // ошибка
}
Как можно внутри функции создать массив размером с передаваемое в переменной size число?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.06.2013, 17:48 18
Цитата Сообщение от cflood Посмотреть сообщение
Как можно внутри функции создать массив размером с передаваемое в переменной size число?
Если не использовать гццшные variable-length array, то только выделяя память динамически. Например так:
C++
1
2
3
4
void testfunc (int size)
{
     int* numbers = new int[size];
}
P.S. Потом главное не забыть освободить память.
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
25.06.2013, 18:04 19
С одномерным массивом все прозрачно. А вот как рационально передавать двумерный массив (или более высокой размерности)?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.06.2013, 18:12 20
@Catstail, что для Вас значит "рационально" в данном контексте?
0
25.06.2013, 18:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2013, 18:12
Помогаю со студенческими работами здесь

Отличие способов передачи массива в функцию
В чем отличие: double sum(double x) от double sum(double *x) ?

Все способы передачи статического массива в функцию
Здравствуйте уважаемые форумчане. Предлагаю выложить сюда все способы передачи СТАТИЧЕСКИХ массивов...

Приведите любые пример(ы) передачи строкового массива в функцию
Приведите любые пример(ы) передачи строкового массива в функцию. Например, (), где ??? -...

Пример передачи двумерного массива в процедуру или функцию
Собственно напишите любой пример, я никак не могу найти, как это делается.


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

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