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

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

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

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

01.08.2015, 18:19. Просмотров 223. Ответов 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?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 18:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как заставить подфункцию выдать обработанный массив? (C++):

Не получается вывести обработанный массив - C++
Преобразовать массив, умножив элементы каждого столбца на минимальный элемент этого столбца //определение минимального значение...

Выполнить пузырьковую сортировку массива по возрастанию и вывести исходный массив обработанный на экран - C++
Выполнить пузырьковую сортировку массива по возрастанию и вывести исходный массив обработанный на экран.

Как заставить массив превратиться в указатель? - C++
Привет! Как известно, при передаче массива в функцию он превращается в указатель. Также хорошо известной особенностью C++ является...

Увидеть обработанный препроцессором код - C++
Как увидеть обработанный препроцессором код? (например, хочу своими глазами увидеть как слово inline в определении методов влияет на...

Если массив заканчивается нулѐм, выдать соответствующее сообщение - C++
Если массив заканчивается нулѐм, выдать соответствующее сообщение.

Вывести обработанный массив на экран - Pascal
program focstrot; TYPE focstr=record name : string; marc : string ; count : string ; cena : string ; kol : string ; end; ...

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

Добавлено через 6 минут
Подождите чутка, кажется, это неверно
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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 ...
}
0
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,283
Завершенные тесты: 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]. Попробуйте оба варианта, на всякий случай
0
MansMI
1227 / 997 / 261
Регистрация: 08.01.2012
Сообщений: 3,640
01.08.2015, 20:04 #5
C++
1
void procedure1( double arr[700][1000][1000] )
нормально отработает
0
hoggy
Нарушитель
6565 / 2746 / 474
Регистрация: 15.11.2014
Сообщений: 6,094
Завершенные тесты: 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";
    
}
0
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
0
MansMI
1227 / 997 / 261
Регистрация: 08.01.2012
Сообщений: 3,640
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");
}
0
zss
Модератор
Эксперт С++
6381 / 5946 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
02.08.2015, 08:19 #9
Компилироваться то оно может и будет, но массив mas[700][1000][1000] в стек не поместиться и программа завершиться аварийно.
Объявите этот массив глобальным, тогда и проблемы со стеком не будет и передавать его в функции не надо.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
02.08.2015, 12:09 #10
Цитата Сообщение от me262 Посмотреть сообщение
выдается ошибка синтаксиса
Я привёл кусок кода C++, а ты компилируешь его как Си код.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2015, 12:09
Привет! Вот еще темы с ответами:

Операции побитового сдвига - обработанный массив необходимо снова разложить на цвета - C#
Имеется массив с побитовым сдвигом int colors = new int; В него записаны цвета RGB for (int y = 0; y &lt; L.Height; y++) ...

Как сохранить обработанный текст в один файл? - Python
Здравствуйте,проблема у меня такая.Собрал программу из кусочков кода,но вышло так,что проверку на совпадение строк сохраняет в один файл,а...

Как сохранить обработанный текст из файла в другой файл? - C#
Здравствуйте форумчане,Шарп ещё плохо знаю но кое какой код написал,который обрабатывает строки из файла по обеим сторонам,но проблема...

как заставить писиспикер заставить хоть чтото проскрипеть? - Visual Basic
помогите дураку как заставить писиспикер заставить хоть чтото проскрипеть??? в бэйсике с этим не каких проблем не было а вот в...


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

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

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