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

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

Восстановить пароль Регистрация
 
 
cflood
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
25.06.2013, 14:26     Размер массива при передачи в функцию #1
День добрый, подскажите столкнулся с такой проблемой:
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, в чём может быть дело?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.06.2013, 14:28     Размер массива при передачи в функцию #2
не путайте массив с указателем. в функцию передайте адрес начала массива и его размерность
cflood
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
25.06.2013, 14:31  [ТС]     Размер массива при передачи в функцию #3
Thinker, подскажи по синтаксису как в функцию передать адрес с размерностью.

Кстати, это значит что не зная размер массива я не могу передать его в функцию?
iv-a
 Аватар для iv-a
15 / 15 / 0
Регистрация: 25.06.2013
Сообщений: 63
25.06.2013, 14:35     Размер массива при передачи в функцию #4
cflood, у вас массив символов. и его размер можно узнать в функции через strlen(mass);
C++
1
int size = strlen(mass);
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 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 Посмотреть сообщение
Кстати, это значит что не зная размер массива я не могу передать его в функцию?
а как будете обрабатывать массив, не зная сколько в нем элементов?!
cflood
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
25.06.2013, 14:43  [ТС]     Размер массива при передачи в функцию #6
Thinker, ну например внутри функции я могу подсчитать размер массива, как я и хотел.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 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 это не массив, а переменная-указатель
MarVaL
С++ Beginner
 Аватар для MarVaL
116 / 116 / 16
Регистрация: 28.02.2013
Сообщений: 246
25.06.2013, 14:48     Размер массива при передачи в функцию #8
Цитата Сообщение от Thinker Посмотреть сообщение
не путайте массив с указателем. в функцию передайте адрес начала массива и его размерность
Вроде бы одно и то же. Там же фактически передаётся ссылка на первый элемент массива? &a[0]
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.06.2013, 14:51     Размер массива при передачи в функцию #9
Цитата Сообщение от MarVaL Посмотреть сообщение
Вроде бы одно и то же.
смотрите
int a[10] - массив размера 10 * sizeof (int)
int *pa - переменная указатель (обычно, размера 4 байта)
MarVaL
С++ Beginner
 Аватар для MarVaL
116 / 116 / 16
Регистрация: 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;
}
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 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); // тоже самое ведь?
компилятор второе выражение преобразует в первое, так что одно и тоже
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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;
}
но работать это будет только для простых статических массивов(к тому же для каждой размерности массива будет создана собственная версия данной функции).
cflood
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 ибо они будут указывать количество повторений цикла.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.06.2013, 15:42     Размер массива при передачи в функцию #14
Цитата Сообщение от cflood Посмотреть сообщение
Каким образом можно записать всё это дело в один массив?
Массив используется для хранения однотипных значений. Если нужно хранить пары, то используйте массив из std:air<char,int> элементов.
cflood
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 бы не вызвало затруднений такой массив или строку сделать.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
cflood
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 число?
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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. Потом главное не забыть освободить память.
Catstail
Модератор
 Аватар для Catstail
21425 / 10210 / 1664
Регистрация: 12.02.2012
Сообщений: 17,082
25.06.2013, 18:04     Размер массива при передачи в функцию #19
С одномерным массивом все прозрачно. А вот как рационально передавать двумерный массив (или более высокой размерности)?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2013, 18:12     Размер массива при передачи в функцию
Еще ссылки по теме:

C++ Функция поиска минимального и максимального элемента массива и их передачи в вызывающую функцию
Правильный способ передачи вектора в функцию C++
Способы передачи параметров в функцию C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.06.2013, 18:12     Размер массива при передачи в функцию #20
@Catstail, что для Вас значит "рационально" в данном контексте?
Yandex
Объявления
25.06.2013, 18:12     Размер массива при передачи в функцию
Ответ Создать тему
Опции темы

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