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

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

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

Author24 — интернет-сервис помощи студентам
Имеется программа, суть которой - обработать массив с данными; основной рабочий кусок содержит две вложенных функции - 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2015, 18:19
Ответы с готовыми решениями:

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

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

Операции побитового сдвига - обработанный массив необходимо снова разложить на цвета
Имеется массив с побитовым сдвигом int colors = new int; В него записаны цвета RGB for...

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

9
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
01.08.2015, 19:11 2
me262, me262, у вас трехмерный массив, ну в списке параметров так и указывайте: void proc1(..., mas[][][], /* а вот здесь размеры измерений, это обязательно */). Возвращать ничего не надо: все изменения, сделанные в функции, сохраняются, поскольку компилятор неявно преобразует (вроде бы) массив в указатель.

Добавлено через 6 минут
Подождите чутка, кажется, это неверно
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
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
Заблокирован
01.08.2015, 20:04 5
C++
1
void procedure1( double arr[700][1000][1000] )
нормально отработает
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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
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
Заблокирован
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
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,698
02.08.2015, 08:19 9
Компилироваться то оно может и будет, но массив mas[700][1000][1000] в стек не поместиться и программа завершиться аварийно.
Объявите этот массив глобальным, тогда и проблемы со стеком не будет и передавать его в функции не надо.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
02.08.2015, 12:09 10
Цитата Сообщение от me262 Посмотреть сообщение
выдается ошибка синтаксиса
Я привёл кусок кода C++, а ты компилируешь его как Си код.
0
02.08.2015, 12:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2015, 12:09
Помогаю со студенческими работами здесь

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

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

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

Как заставить сайт написанный на 5.3 заставить работать на 5.6? Как принудительно включить register_globals?
Есть древний сайт. Работает на php 5.3. Как объяснил разработчик данного сайта - все дело в...


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

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

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