1 / 1 / 0
Регистрация: 07.04.2016
Сообщений: 66
1

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

26.06.2016, 00:34. Показов 3295. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем нужно передать массив в качестве аргумента без указания его размера, чтобы в дальнейшем присвоить все его содержимое другому массиву)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
       char a[] = "abcd";
       int i = 2;
       printf(%s, sc_m(a, i));
       return 0;
}
char sc_m (char a[], int i)
{
       char a_l[] = a[];               //нужно, чтобы без указания размера присвоили массиву a_l[]
                                            //содержимое массива a[]
                                            //которого передали в качестве аргумента
       for (int j = 0; j<sizeof(a_l); j++)
       {
            a_l[j] = j+i;  
       }
       return a_l[]; //возвращаем содержимое массива
}
Как изменить этот код, чтобы он работал так, как указано в комментариях
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2016, 00:34
Ответы с готовыми решениями:

Передача двумерного массива в качестве аргумента функции
Подскажите пожалуйста что не так? (Подчёркивает вот тут вот index(A); аргумент функции). Объясните...

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

Передача функции в качестве аргумента массив
Помогите пожалуйста! есть некая рекурсивная функция N которая принимает 2 целочисленные переменные...

Передача объекта в качестве аргумента функции (метода)
На &quot;Интуите&quot; имеем код: class Complex { public: int real; // вещественная часть int...

15
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.06.2016, 00:37 2
Использовать std::vector. Без вектора еще как-то можно извернуться с передачей массива в функцию (сделав ее шаблонной), но вот для возврата массива из функции придется лепить аналог вектора.
1
1 / 1 / 0
Регистрация: 07.04.2016
Сообщений: 66
26.06.2016, 00:40  [ТС] 3
А можно просто содержимое массива присвоить переменной String и возвратить ее значение, мне нужно просто вернуть содержимое массива, чтобы в дальнейшем вывести на экран
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.06.2016, 00:42 4
Цитата Сообщение от java_user Посмотреть сообщение
А можно просто содержимое массива присвоить переменной String?)))
C++
1
std::string str(array,array+size);
Если у вас там сишная строка, то прям так и писать str="1234";.
1
76 / 50 / 26
Регистрация: 22.02.2015
Сообщений: 306
26.06.2016, 00:45 5
java_user, а в чём проблема через указатели вернуть ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstring>
 
char* sc_m (char* a, int i)
{
    char* a_l = new char[strlen(a)];
 
    for (int j = 0; j<strlen(a_l); j++)
        a_l[j] = j+i;  
 
    return a_l;
}
 
int main()
{
    char a[] = "abcdacv";
    int i = 2;
    printf("%s\n", sc_m(a, i));
    system("pause");
    return 0;
}
1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
26.06.2016, 00:48 6
Цитата Сообщение от java_user Посмотреть сообщение
нужно передать массив в качестве аргумента без указания его размера, чтобы в дальнейшем присвоить все его содержимое другому массиву
Кликните здесь для просмотра всего текста
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
#include <cstdio>
#include <array>
 
template <size_t N>
std::array<char, N> sc_m(char const (& a)[N], int i);
 
int main()
{
    char a[] = "abcd";
    int i = 2;
    printf("%s", sc_m(a, i).data());
    return 0;
}
 
template <size_t N>
std::array<char, N> sc_m(char const (& a)[N], int i)
{
    std::array<char, N> a_l;
    std::copy(std::begin(a), std::end(a), a_l.begin());
    
    for(size_t j = 0; j < a_l.size(); j++)
    {
        a_l[j] += j + i;  
    }
    return a_l;
}

http://rextester.com/OBBD78174
1
1 / 1 / 0
Регистрация: 07.04.2016
Сообщений: 66
26.06.2016, 00:49  [ТС] 7
Код который написан выше это пример, мне нужно ввести текст в консоль и присвоить содержимое массиву, потом создать функцию которой передать массив в качестве аргумента, суть функции в том, что каждый символ в массиве будет заменен на другой, к примеру
C++
1
2
3
4
       for (int j = 0; j<sizeof(Array); j++)
       {
            Array[j] = A;  
       }
Дальше мне нужно возвратить уже измененный массив, и в дальнейшем вывести его на экран.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.06.2016, 00:54 8
Цитата Сообщение от DUMP Посмотреть сообщение
java_user, а в чём проблема через указатели вернуть ?
Указатели память за собой не чистят. Можно, конечно, использовать умный указатель, но не лучше ли сразу вектор/стринг взять?

Добавлено через 4 минуты
Цитата Сообщение от java_user Посмотреть сообщение
Дальше мне нужно возвратить уже измененный массив, и в дальнейшем вывести его на экран.
Плюсы, кстати, поддерживают передачу по ссылке, так что возвращать что-то не обязательно.
C++
1
2
3
4
5
6
7
8
9
10
void test(std::string&str)
{
    str+="test test test";
}
int main()
{
    std::string str="это тест. ";
    test(str);
    cout<<str;//выйдет "это тест. test test test"
}
1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
26.06.2016, 01:02 9
java_user, там в моем примере проблема с нуль-символом (его нет). Если массив потом планируется использовать как строку, то это нужно учесть.
1
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
26.06.2016, 01:22 10
Цитата Сообщение от java_user Посмотреть сообщение
нужно передать массив в качестве аргумента без указания его размера, чтобы в дальнейшем присвоить все его содержимое другому массив
Это невозможно в языках C и C++, потому что по соглашению этих языков вместо массива передаётся указатель на его 1-й элемент.

Любые косвенные решения - это уже будет не масиив.
Все изыски на этот счёт - это уже извращения.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.06.2016, 02:06 11
Цитата Сообщение от Olej Посмотреть сообщение
Это невозможно в языках C и C++, потому что по соглашению этих языков вместо массива передаётся указатель на его 1-й элемент.
Вы просто не умете их готовить.
C++
1
2
3
4
5
6
7
8
void test(char(&array)[10]){}//функция принимает массив из десяти элементов
int main()
{
    char str1[10];
    char str2[20];
    test(str1);//работает - массив из десяти элементов
    test(str2);//не работает - массив из двадцати элементов, а надо из десяти
}
Но при этом размер массива прописывается на стадии компиляции. Так что если надо чтоб он был произвольным, придется шаблон лепить.
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
26.06.2016, 02:17 12
Цитата Сообщение от Renji Посмотреть сообщение
Вы просто не умете их готовить.
кому и когда может понадобится не тип данных массив, но вместо него тип данных массив фиксированной длины?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.06.2016, 02:26 13
Цитата Сообщение от Olej Посмотреть сообщение
(кому и когда может понадобится не тип данных массив, но вместо него тип данных массив фиксированной длины?)
Когда надо символы по табличке преобразовать.
C++
1
wchar_t from8bitToUnicode(char c,const wchar_t (&table)[256]){return table[unsigned char(c)];}
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
26.06.2016, 02:49 14
Цитата Сообщение от Renji Посмотреть сообщение
Когда надо символы по табличке преобразовать
mbtowc() ... wctomb() ... стандарты POSIX, IEEE, OpenGroup ... UTF-8 ...
Не? Не слышал?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.06.2016, 02:51 15
Цитата Сообщение от Olej Посмотреть сообщение
mbtowc() ... wctomb() ... POSIX ... UTF-8 ...
Еще раз, в системных библиотеках реализующих mbtowc лежит все та же таблица преобразований или волшебный гномик сидит?
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
26.06.2016, 02:54 16
Цитата Сообщение от java_user Посмотреть сообщение
В общем нужно передать массив в качестве аргумента без указания его размера,
В общем, java_user, оставьте эту дурную идею:
- без контейнерных классов STL в C++ такое не делается;
- в тысячах образцах кода когда такое нужно в функцию передаётся 2 параметра: массив (указатель на 1-й элемент) и целочисленный размер массива;
0
26.06.2016, 02:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2016, 02:54
Помогаю со студенческими работами здесь

Передача объекта ifstream в качестве аргумента функции
Как решить данную проблему? vector&lt;DataPerson&gt; GetVector() { ifstream file(&quot;input.txt&quot;); if...

Передача двухмерного массива в качестве аргумента
Здравствуйте. Имеется код, метод print_matrix() выводит матрицу на печать. Всё работает, когда я...

Передача символьного массива в качестве аргумента
#include &lt;iostream&gt; using namespace std; void mazeTraverse( char maze ); int main() { ...

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


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

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

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