Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/32: Рейтинг темы: голосов - 32, средняя оценка - 4.50
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
1

Передать динамический массив в функцию

23.05.2009, 11:14. Просмотров 5773. Ответов 18
Метки нет (Все метки)

Имеется динамический массив, который надо передать в функцию. Число элементов массива заранее не известно. Какие есть варианты на этот счет??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2009, 11:14
Ответы с готовыми решениями:

Передать в функцию динамический массив
void sort_vstavk(int* a, int size) { int i, j, te; for (i = 0; i <...

Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла
задача: передать динамический массив в функцию, и записать в каждый элемент...

Как передать динамический массив в функцию?
Помогите пожалуйста передать динамический массив в функцию. #include...

Как передать в функцию двумерный динамический массив?
#include <iostream> #include<time.h> #include<cstdlib> using namespace...

Передать в функцию динамический двухмерный массив с динамическими размерами
Как передать динамический двухмерный массив с динамическими размерами?...

18
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
23.05.2009, 11:31 2
Динамический массив из ниоткуда не береться, он в каком то месте программы объявляется и при его создании указывается размер - вот его и надо запомнить и передавать в функцию вместе с массивом.
1
BullDogoff
10 / 10 / 1
Регистрация: 16.05.2009
Сообщений: 30
23.05.2009, 11:36 3
Если размер массива изменяется динамически, можно, например, при изменении дополнительно загонять в конец значение-признак конца массива, и потом в функции вычислять длину.
1
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 11:58  [ТС] 4
Массив получается из строки. У меня есть функция func(arg[0], arg[1], и т.д.), где arg[] -собственно динамический массив. Как мне передать его в фукцию если я не знаю сколько элементов у этого массива??

Добавлено через 33 секунды
Приведите пример если можно.
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
23.05.2009, 12:01 5
Если массив содержит строку то в конце должен содержаться нулевой элемент '\0', тогда делаешь обработку массива пока не встретися нулевой элемент.
1
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 12:08  [ТС] 6
НЕее. Элементы массива - это слова полученные из строки(дроблением). Как мне вызвать функцию func(arg[0], arg[1] и т.д.)?? Как мне это конкретно записать??

Добавлено через 1 минуту 30 секунд
То что массив можно обработать и посчитать и записать признак конца массива это я понимаю(хотя бы в теории). Меня интересует синтаксис передачи динамического массива в функцию
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
23.05.2009, 12:11 7
<Type1>Function(<Type2> *array);
1
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 12:13  [ТС] 8
Воооо. Спасибо)))

Добавлено через 1 минуту 5 секунд
Т.е. если массив строк то будет выглядеть так:
void func(char *arg)
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
23.05.2009, 12:17 9
Цитата Сообщение от toxxin Посмотреть сообщение
Т.е. если массив строк то будет выглядеть так:
void func(char *arg)
не, строка, то есть массив charов.
0
Monte-Cristo
2796 / 1383 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
23.05.2009, 12:18 10
Цитата Сообщение от toxxin Посмотреть сообщение
void func(char *arg)
нет..это массив символов
0
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 12:20  [ТС] 11
Ну тогда пример в студию... пожалуйста
0
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
23.05.2009, 12:20 12
Цитата Сообщение от toxxin
Имеется динамический массив, который надо передать в функцию. Число элементов массива заранее не известно. Какие есть варианты на этот счет??
всегда передаётся только адрес первого элемента массива (даже если укажешь размер, он не будет передан, потому что в функцию пойдёт только копия адреса начала массива)

Код
    func(arg);
это &arg[0], дальше, внутри функции через этот адрес будет получаться доступ к любому элементу массива
если не контролировать длину, можно вылезти за край массива, в запрещённую память и получится segmentation fault (особенно когда в него пишешь)
так что, можно пометить конец массива в нём самом, или передать его размер рядом через sizeof
Код
    func(arg, sizeof arg / sizeof arg[0]);
передаст количество элементов в массиве (общее число байт, поделённое на число байт в одном элементе)
1
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 12:24  [ТС] 13
У меня последний элемент массива равен "end"(прям слово)...

Добавлено через 34 секунды
Делалось специально. Как чувствовал не ладное))

Добавлено через 1 минуту 11 секунд
Спасибо. Сознание восприняло))
0
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
23.05.2009, 12:25 14
когда arg - это массив строк, он может быть массивом масивов, а может быть массивом указателей
char (*s)[длина массива]
char **s
1
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
23.05.2009, 12:30 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void PrintWord(char *);
 
void main();
{
   char arr[256], buf;
   cout << "Введите предложение: ";
   cin.getline(arr, 256);
   cout << "Отдельные слова предложеня: " << endl;
   buf = strtok(arr, " ");
   PrintWord(buf);
   while (buf != NULL)
   {
      strtok(NULL, " ");
      PrintWord(buf);
   }
}
 
void PrintWord(char *arg)
{
   while (*arg != '\0')
   {
      cout << *arg;
      arg++;
   }
   cout << endl;
}
1
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 12:44  [ТС] 16
всем большое спасибо!!!
0
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
23.05.2009, 12:44 17
вот ещё пример, это через void *
их удобно передавать и возвращать, так как по стандарту эти указатели гарантируют сохранность данных при передаче, и не нужно следить за типом, все преобразования проводятся после передачи или возврата, а не во время
1
Вложения
Тип файла: zip print_by_void.zip (512 байт, 33 просмотров)
Evg
Эксперт CАвтор FAQ
19288 / 7147 / 528
Регистрация: 30.03.2009
Сообщений: 19,997
Записей в блоге: 30
23.05.2009, 16:27 18
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void
my_func (char *arr[], int num)
{
  int i;
  for (i = 0; i < n; i++)
    printf ("arr[%d]=%s\n", num, arr[num]);
}
 
int
main (void)
{
  {
    char *a[3];
    a[0] = "abc";
    a[1] = "cde";
    a[2] = "1234";
    my_func (a, 3);
  }
 
  // Случай с той самой нарезкой командной строки на параметры
  {
    char *args[100]; // Работаем максимум с 100 параметрами
    char cmd[1000];
    char *p = &(cmd[0]);
 
    // В этом месте ты с сокета типа прочёл команду
    strcpy (cmd, "ls param1 param2 param3");
 
    // Здесь типа осуществил нарезку. Т.е. массив указателей будет смотреть
    // на начала аргументов в буффере, а на места пробелов мы влепим нули, чтобы
    // образовались подстроки
    args[0] = p;
    p[2] = 0;
    args[1] = p+3;
    p[9] = 0;
    args[2] = p+10;
    p[16] = 0;
    args[3] = p+17;
    // за последним параметром и так стоит ноль, можно его и не писать
 
    my_func (args, 4); // массив у нас на 100 жлементов, но сообщим что заполнено только 4
  }
}
Добавлено через 2 минуты 13 секунд
kazak, вариант с strtok ему не подойдёт. Ему нужно сразу иметь все слова в одном вызове, а не вызывать функцию на каждое слово
1
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 22:45  [ТС] 19
Спасибо большое
0
23.05.2009, 22:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2009, 22:45

Как передать динамический массив в функцию, чтобы он изменился?
Через указатель не изменяется:(

Как передать динамический массив из функции в другую функцию
Здравствуйте.Не могу передать массив из функции в функцию сортировки....

Как передать в функцию двухмерный динамический массив по ссылке?
как передать в функцию двухмерный динамический массив по ссылке?


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

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

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