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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
cflood
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
#1

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

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

День добрый, подскажите столкнулся с такой проблемой:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 14:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Размер массива при передачи в функцию (C++):

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

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

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

Нюансы синтаксиса: наиболее правильный способ передачи массива в функцию - C++
Подскажите, пожалуйста, что считается более комильфошным, правильным: объявить указатели на массивы в main и потом передавать в функцию уже...

Функция поиска минимального и максимального элемента массива и их передачи в вызывающую функцию - C++
Дана целочисленная матрица размера 6x9. Определить функцию поиска значения и местоположения максимального и минимального элементов матрицы...

Куда именно копируется значения аргумента при передачи в функцию? - C++
Куда именно копируется значения аргумента при передачи в функцию? И куда(где:) ) деваются эти копии в этом частном случае? ...

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

Кстати, это значит что не зная размер массива я не могу передать его в функцию?
0
iv-a
15 / 15 / 0
Регистрация: 25.06.2013
Сообщений: 63
25.06.2013, 14:35 #4
cflood, у вас массив символов. и его размер можно узнать в функции через strlen(mass);
C++
1
int size = strlen(mass);
0
Thinker
Эксперт С++
4226 / 2200 / 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 Посмотреть сообщение
Кстати, это значит что не зная размер массива я не могу передать его в функцию?
а как будете обрабатывать массив, не зная сколько в нем элементов?!
0
cflood
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 37
25.06.2013, 14:43  [ТС] #6
Thinker, ну например внутри функции я могу подсчитать размер массива, как я и хотел.
0
Thinker
Эксперт С++
4226 / 2200 / 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 это не массив, а переменная-указатель
1
MarVaL
С++ Beginner
116 / 116 / 16
Регистрация: 28.02.2013
Сообщений: 246
25.06.2013, 14:48 #8
Цитата Сообщение от Thinker Посмотреть сообщение
не путайте массив с указателем. в функцию передайте адрес начала массива и его размерность
Вроде бы одно и то же. Там же фактически передаётся ссылка на первый элемент массива? &a[0]
0
Thinker
Эксперт С++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.06.2013, 14:51 #9
Цитата Сообщение от MarVaL Посмотреть сообщение
Вроде бы одно и то же.
смотрите
int a[10] - массив размера 10 * sizeof (int)
int *pa - переменная указатель (обычно, размера 4 байта)
2
MarVaL
С++ Beginner
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;
}
2
Thinker
Эксперт С++
4226 / 2200 / 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); // тоже самое ведь?
компилятор второе выражение преобразует в первое, так что одно и тоже
2
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
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
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 ибо они будут указывать количество повторений цикла.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.06.2013, 15:42 #14
Цитата Сообщение от cflood Посмотреть сообщение
Каким образом можно записать всё это дело в один массив?
Массив используется для хранения однотипных значений. Если нужно хранить пары, то используйте массив из std:air<char,int> элементов.
1
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 бы не вызвало затруднений такой массив или строку сделать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2013, 16:47
Привет! Вот еще темы с ответами:

Не работает вектор структур при передачи его в функцию-ошибки - C++
Написал такой код struct lol{ }; #include &lt;vector&gt; #include &lt;windows&gt; struct smth{ } void smthfun(vector &lt;smth&gt;...

Почему после передачи в функцию массива, выводятся случайные числа, если использовать *(uk++) во второй раз? - C++
Интересует такой вопрос: почему после передачи в функцию массива выводятся случайные числа из оперативной памяти, если использовать *(uk++)...

Передать в функцию размер массива указателей - C++
Всем привет. Есть массив указателей допустим char *array = { &quot;строка 1&quot;, &quot;строка 2&quot;... &quot;строка n&quot; } Нужно предать его размер (sizeof()) в...

Написать функцию, которая получает в качестве параметров адрес числового массива данных и его размер - C++
Функция выводит массив на экран. Как получить в качестве параметров адрес числового массива данных?как это написать?


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
25.06.2013, 16:47
Ответ Создать тему
Опции темы

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