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

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

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

Как заставить подфункцию выдать обработанный массив? - C++

01.08.2015, 18:19. Просмотров 212. Ответов 9
Метки нет (Все метки)

Имеется программа, суть которой - обработать массив с данными; основной рабочий кусок содержит две вложенных функции - procedure1 и procedure2:


Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void procedure1 (параметры)
{
...
}
 
void procedure2 (параметры)
{
double mas[700][1000][1000];
...
[I]здесь массив mas еще не обработан[/I]
   for (j=a;j<b;j++)
   {
   procedure1(..., mas, j);
   }
[I]здесь mas должен быть уже переделан функцией procedure1[/I]
 
   for (...)
   {
[I]здесь должны производиться действия уже над обработанным x раз функцией procedure1 массивом mas[/I]
   }
 
}
Существо вопроса: как правильно указать используемый массив в заголовке procedure1, чтобы функция приняла его в обработку? Чтобы получить при ее работе уже обработанный массив обратно, я должен использовать команду return?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 18:19     Как заставить подфункцию выдать обработанный массив?
Посмотрите здесь:

как заставить С++ и С# работать вместе? C++
C++ Как заставить CEdit реагировать на ' ' ?
C++ Как заставить консоль писать кириллицей?
Как заставить работать <algorithm> C++
Как заставить отобразиться символы?! C++
C++ Увидеть обработанный препроцессором код
C++ Выполнить пузырьковую сортировку массива по возрастанию и вывести исходный массив обработанный на экран
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,245
Завершенные тесты: 3
01.08.2015, 19:11     Как заставить подфункцию выдать обработанный массив? #2
me262, me262, у вас трехмерный массив, ну в списке параметров так и указывайте: void proc1(..., mas[][][], /* а вот здесь размеры измерений, это обязательно */). Возвращать ничего не надо: все изменения, сделанные в функции, сохраняются, поскольку компилятор неявно преобразует (вроде бы) массив в указатель.

Добавлено через 6 минут
Подождите чутка, кажется, это неверно
castaway
Эксперт С++
4873 / 3012 / 370
Регистрация: 10.11.2010
Сообщений: 11,062
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 19:18     Как заставить подфункцию выдать обработанный массив? #3
C++
1
2
3
4
template <size_t K, size_t N, size_t M>
void foo( double (&arr)[K][N][M] ) {
    ... работаем с arr ...
}
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,245
Завершенные тесты: 3
01.08.2015, 19:29     Как заставить подфункцию выдать обработанный массив? #4
Если верить Страуструпу, такк многомерные массивы передавать нельзя. Сделайте так:
C++
1
2
3
4
5
6
7
void proc(..., int* mas, int one, int two, int three)
{
   ...
   for(int i = 0; i < ...)
      for(int j = 0; j < ...)
         for(int k = 0; k < ...)
            mas[i * one * one + j * two + k] = ...   // вот так к элементу обращайтесь
Добавлено через 10 минут
Поправка: в индексации наоборот пишите. Т.е. mas[i * three * three + j * two + k]. Попробуйте оба варианта, на всякий случай
MansMI
1132 / 929 / 239
Регистрация: 08.01.2012
Сообщений: 3,345
01.08.2015, 20:04     Как заставить подфункцию выдать обработанный массив? #5
C++
1
void procedure1( double arr[700][1000][1000] )
нормально отработает
hoggy
6008 / 2448 / 437
Регистрация: 15.11.2014
Сообщений: 5,424
Завершенные тесты: 1
01.08.2015, 20:50     Как заставить подфункцию выдать обработанный массив? #6
http://rextester.com/CARS96696

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
44
45
46
47
48
49
50
#include <iostream>
 
 
// --- синтаксис передачи массива в функцию.
template<class T, size_t N>
void Fill( T (&arr)[N] )   
{
    for(size_t i=0;i<N;++i )
        arr[i] = i;
        
}
 
// --- синтаксис возвращения массива из функции
template<class T, size_t N>
T ( &Get() )[N]
{
    static T arr[N];
    return arr;
}
 
 
// --- синтаксис функции, которая принимает массив по ссылке
// и возвращает массив по ссылке
template<class T, size_t N>
T (&Example( T (&arr)[N] )   )[N]
{
    Fill(arr);
    
    auto& dst = Get<T,N>();
    
    for(size_t i=0;i<N;++i ) 
        dst[i]= arr[i]*10;
    
    return dst; 
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    int a[10] = {};
    
    const auto& result = Example(a);
    
    std::cout<<"int result[10] = {";
    for(const auto& i: result)
        std::cout<< i <<", ";
    std::cout <<"};\n";
    
}
me262
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 2
02.08.2015, 05:33  [ТС]     Как заставить подфункцию выдать обработанный массив? #7
castaway

В ответ на такой код

C++
1
2
3
4
template <size_t K, size_t N, size_t M>
void foo( double (&arr)[K][N][M] ) {
    ... работаем с arr ...
}
выдается ошибка синтаксиса:
C:\test\test.c(19) : error C2143: syntax error : missing '{' before '<'
C:\test\test.c(19) : error C2059: syntax error : '<'

P.S. И еще, пожалуйста когда пишете код - хоть чуть-чуть пояснений что есть что. Например, в случае с template я не понял, К N M - это конкретные размеры моего масива - 700 1000 1000, arr - имя массива, а foo - название моей функции?

tnk500

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void procedure1(int ip1, double float1, double floatmas1[10])
{
    for (iint=0;iint<10; iint++){
    floatmas1[iint]=0.5+iint;
    printf("Mas=%lf\n",floatmas1[iint]);
    getch();
    }
}
 
 
main()
{
int i,ip1,iint;
double float1;
double floatmas1[10];
float1=0.5;
ip1=1;
procedure1(ip1,float1, floatmas1[10]);
for (i=0;i<10; i++){
    printf("Mas=%lf\n",floatmas1[i]);
    }
getch();
Я получаю ошибку
C:\test\test.c(36) : error C2115: 'function' : incompatible types
MansMI
1132 / 929 / 239
Регистрация: 08.01.2012
Сообщений: 3,345
02.08.2015, 05:51     Как заставить подфункцию выдать обработанный массив? #8
оба способа передачи/"возврата" массива работают
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
void mul2(int a[2][3][4])
{
    int i,j,k;
    for(i=0; i<2; i++)
        for(j=0; j<3; j++)
            for(k=0; k<4; k++) a[i][j][k]*=2;
}
void add1(int *a)
{
    int i,j,k;
    for(i=0; i<2; i++)
        for(j=0; j<3; j++)
            for(k=0; k<4; k++) a[i*3*4+j*4+k]++;
}
void main(int argc,char* argv[])
{
    int i,j,k,n=0,a[2][3][4];
 
    for(i=0; i<2; i++)
        for(j=0; j<3; j++)
            for(k=0; k<4; k++) a[i][j][k]=++n;
    
    mul2(a);
    add1(a);
 
    for(i=0; i<2; i++)
        for(j=0; j<3; j++)
            for(k=0; k<4; k++) printf("%d\n",a[i][j][k]);
 
    system("pause");
}
zss
Модератор
Эксперт С++
6192 / 5795 / 1877
Регистрация: 18.12.2011
Сообщений: 14,805
Завершенные тесты: 1
02.08.2015, 08:19     Как заставить подфункцию выдать обработанный массив? #9
Компилироваться то оно может и будет, но массив mas[700][1000][1000] в стек не поместиться и программа завершиться аварийно.
Объявите этот массив глобальным, тогда и проблемы со стеком не будет и передавать его в функции не надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2015, 12:09     Как заставить подфункцию выдать обработанный массив?
Еще ссылки по теме:

C++ не знаю как заставить работать
Если массив заканчивается нулѐм, выдать соответствующее сообщение C++
Как заставить работать do while C++
C++ Не получается вывести обработанный массив
C++ Как заставить массив превратиться в указатель?

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4873 / 3012 / 370
Регистрация: 10.11.2010
Сообщений: 11,062
Записей в блоге: 10
Завершенные тесты: 1
02.08.2015, 12:09     Как заставить подфункцию выдать обработанный массив? #10
Цитата Сообщение от me262 Посмотреть сообщение
выдается ошибка синтаксиса
Я привёл кусок кода C++, а ты компилируешь его как Си код.
Yandex
Объявления
02.08.2015, 12:09     Как заставить подфункцию выдать обработанный массив?
Ответ Создать тему
Опции темы

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