Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Социальные группы  
 
 
Рейтинг 4.84/55: Рейтинг темы: голосов - 55, средняя оценка - 4.84
25.06.2013, 14:26

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

25.06.2013, 14:26. Показов 10818. Ответов 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
 Аватар для IT_Exp
IT_Exp
34794
25.06.2013, 14:26
Ответы с готовыми решениями:

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

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

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

26
 Аватар для Thinker
4267
25.06.2013, 14:28
не путайте массив с указателем. в функцию передайте адрес начала массива и его размерность
0
cflood  [ТС]
0
25.06.2013, 14:31
Thinker, подскажи по синтаксису как в функцию передать адрес с размерностью.

Кстати, это значит что не зная размер массива я не могу передать его в функцию?
0
 Аватар для iv-a
15
25.06.2013, 14:35
cflood, у вас массив символов. и его размер можно узнать в функции через strlen(mass);
C++
1
int size = strlen(mass);
0
 Аватар для Thinker
4267
25.06.2013, 14:38
Цитата Сообщение от 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
25.06.2013, 14:43
Thinker, ну например внутри функции я могу подсчитать размер массива, как я и хотел.
0
 Аватар для Thinker
4267
25.06.2013, 14:47
Цитата Сообщение от 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
120
25.06.2013, 14:48
Цитата Сообщение от Thinker Посмотреть сообщение
не путайте массив с указателем. в функцию передайте адрес начала массива и его размерность
Вроде бы одно и то же. Там же фактически передаётся ссылка на первый элемент массива? &a[0]
0
 Аватар для Thinker
4267
25.06.2013, 14:51
Цитата Сообщение от MarVaL Посмотреть сообщение
Вроде бы одно и то же.
смотрите
int a[10] - массив размера 10 * sizeof (int)
int *pa - переменная указатель (обычно, размера 4 байта)
2
 Аватар для MarVaL
С++ Beginner
120
25.06.2013, 14:53
Цитата Сообщение от 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
4267
25.06.2013, 14:55
Цитата Сообщение от MarVaL Посмотреть сообщение
Нет ну понятно просто в функцию когда передаём массив можно:
C++
1
2
void f(int * arr, int n) // или
void f2(int arr[], int n); // тоже самое ведь?
компилятор второе выражение преобразует в первое, так что одно и тоже
2
2022
25.06.2013, 15:11
Цитата Сообщение от 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
25.06.2013, 15:30
Благодарю, подскажите пожалуйста еще с такой задачкой

Есть массив 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
25.06.2013, 15:42
Цитата Сообщение от cflood Посмотреть сообщение
Каким образом можно записать всё это дело в один массив?
Массив используется для хранения однотипных значений. Если нужно хранить пары, то используйте массив из std:air<char,int> элементов.
1
cflood  [ТС]
0
25.06.2013, 16:47
Tulosba, можешь пример накидать? был бы очень благодарен.
Кстати pair можно хранить в массиве? чтобы в конечном итоге получить массив типа
a 2
b 3
c 4
e 1

???

Вообще я теряюсь немного от своей неопытности, вроде такая задача простая, в php/javasript бы не вызвало затруднений такой массив или строку сделать.
0
:)
4773
25.06.2013, 17:04
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
cflood  [ТС]
0
25.06.2013, 17:38
Еще один вопросик, есть у нас функция

C++
1
2
3
4
void testfunc (int size)
{
     int numbers[size]; // ошибка
}
Как можно внутри функции создать массив размером с передаваемое в переменной size число?
0
:)
4773
25.06.2013, 17:48
Цитата Сообщение от cflood Посмотреть сообщение
Как можно внутри функции создать массив размером с передаваемое в переменной size число?
Если не использовать гццшные variable-length array, то только выделяя память динамически. Например так:
C++
1
2
3
4
void testfunc (int size)
{
     int* numbers = new int[size];
}
P.S. Потом главное не забыть освободить память.
1
 Аватар для Catstail
Супер-модератор
38210
25.06.2013, 18:04
С одномерным массивом все прозрачно. А вот как рационально передавать двумерный массив (или более высокой размерности)?
0
:)
4773
25.06.2013, 18:12
@Catstail, что для Вас значит "рационально" в данном контексте?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 Аватар для BasicMan
BasicMan
29316
25.06.2013, 18:12

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

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

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

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

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


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

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

Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru