Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Datebailo
0 / 4 / 6
Регистрация: 13.05.2016
Сообщений: 58
#1

Передача массива в процедуру через функцию

20.11.2016, 02:44. Просмотров 856. Ответов 3
Метки нет (Все метки)

Необходимо чтобы пользователь вводил размер массива в нижепреведенном коде. Ошибку выбивает на процедурах:
C++
1
2
3
4
5
6
7
8
    /* initialize the data */
    init(data, rank);
 
    /* do the parallel odd/even sort */
    parallel_sort(data, rank, size);
 
    /* now print our data */
    print(data, rank);
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <string>
 
#include <mpi.h>
 
/* the number of data elements in each process */
//#define N 1000000
 
using namespace std;
 
int N;
 
int main(int argc, char** argv) {
    setlocale(LC_ALL, "Russian");
    cout << "Введите размер массива";
    cin >> N;
    /* our rank and size */
    int rank, size;
 
    /* our processes data */
    int* data = new int[N];
 
    /* initialize MPI */
    MPI_Init(&argc, &argv);
 
    /* get the rank (process id) and size (number of processes) */
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
 
    /* initialize the data */
    init(data, rank);
 
    /* do the parallel odd/even sort */
    parallel_sort(data, rank, size);
 
    /* now print our data */
    print(data, rank);
 
    /* quit MPI */
    MPI_Finalize();
    system("pause");
    return 0;
}
 
 
/* initialize the data to random values based on rank (so they're different) */
void init(int* data, int rank) {
    ofstream f("anime.txt");
    int i;
    srand(time(0));
    for (i = 0; i < N; i++) {
        data[i] = rand() % 100;
        f << data[i] << endl;
        //f.close;
    }
}
 
/* print the data to the screen */
void print(int* data, int rank) {
    ofstream f("animeSort.txt");
    int i;
    cout << "Запись в файл" << endl;
    for (i = 0; i < N; i++) {
    //printf("%d ", data[i]);
    f << data[i] << endl;
    }
    printf("\n");
}
 
/* comparison function for qsort */
int cmp(const void* ap, const void* bp) {
    int a = *((const int*)ap);
    int b = *((const int*)bp);
 
    if (a < b) {
        return -1;
    }
    else if (a > b) {
        return 1;
    }
    else {
        return 0;
    }
}
 
/* find the index of the largest item in an array */
int max_index(int* data) {
    int i, max = data[0], maxi = 0;
 
    for (i = 1; i < N; i++) {
        if (data[i] > max) {
            max = data[i];
            maxi = i;
        }
    }
    return maxi;
}
 
/* find the index of the smallest item in an array */
int min_index(int* data) {
    int i, min = data[0], mini = 0;
 
    for (i = 1; i < N; i++) {
        if (data[i] < min) {
            min = data[i];
            mini = i;
        }
    }
    return mini;
}
 
 
/* do the parallel odd/even sort */
void parallel_sort(int* data, int rank, int size) {
    int i;
 
    /* the array we use for reading from partner */
    int* other = new int[N];
 
    /* we need to apply P phases where P is the number of processes */
    for (i = 0; i < size; i++) {
        /* sort our local array */
        qsort(data, N, sizeof(int), &cmp);
 
        /* find our partner on this phase */
        int partener;
 
        /* if it's an even phase */
        if (i % 2 == 0) {
            /* if we are an even process */
            if (rank % 2 == 0) {
                partener = rank + 1;
            }
            else {
                partener = rank - 1;
            }
        }
        else {
            /* it's an odd phase - do the opposite */
            if (rank % 2 == 0) {
                partener = rank - 1;
            }
            else {
                partener = rank + 1;
            }
        }
 
        /* if the partener is invalid, we should simply move on to the next iteration */
        if (partener < 0 || partener >= size) {
            continue;
        }
 
        /* do the exchange - even processes send first and odd processes receive first
        * this avoids possible deadlock of two processes working together both sending */
        if (rank % 2 == 0) {
            MPI_Send(data, N, MPI_INT, partener, 0, MPI_COMM_WORLD);
            MPI_Recv(other, N, MPI_INT, partener, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        }
        else {
            MPI_Recv(other, N, MPI_INT, partener, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            MPI_Send(data, N, MPI_INT, partener, 0, MPI_COMM_WORLD);
        }
 
        /* now we need to merge data and other based on if we want smaller or larger ones */
        if (rank < partener) {
            /* keep smaller keys */
            while (1) {
                /* find the smallest one in the other array */
                int mini = min_index(other);
 
                /* find the largest one in out array */
                int maxi = max_index(data);
 
                /* if the smallest one in the other array is less than the largest in ours, swap them */
                if (other[mini] < data[maxi]) {
                    int temp = other[mini];
                    other[mini] = data[maxi];
                    data[maxi] = temp;
                }
                else {
                    /* else stop because the smallest are now in data */
                    break;
                }
            }
        }
        else {
            /* keep larger keys */
            while (1) {
                /* find the largest one in the other array */
                int maxi = max_index(other);
 
                /* find the largest one in out array */
                int mini = min_index(data);
 
                /* if the largest one in the other array is bigger than the smallest in ours, swap them */
                if (other[maxi] > data[mini]) {
                    int temp = other[maxi];
                    other[maxi] = data[mini];
                    data[mini] = temp;
                }
                else {
                    /* else stop because the largest are now in data */
                    break;
                }
            }
        }
    }
}
Прошу помощи
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2016, 02:44
Ответы с готовыми решениями:

Передача массива через указатель в шаблонную функцию
Здравствуйте. В общем есть шаблонный класс List, который является двусвязным...

Передача двумерного массива в функцию через указатели
поставлена такая задача - Реализовать функцию перемножения двумерных матриц...

Передача массива структур в функцию через указатель
вот пример куска кода, не могу понять почему ругается на: void Add(student...

Передача динамического двумерного массива в процедуру
Написал вот такой код для одномерного динамического массива #include...

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

3
marat_miaki
149 / 138 / 87
Регистрация: 08.04.2013
Сообщений: 557
20.11.2016, 07:53 #2
Лучший ответ Сообщение было отмечено Datebailo как решение

Решение

а прототипы функции объявить не пробовал?
C++
1
void init(int* , int); //Прототип функции
объявляется до main().
1
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,042
20.11.2016, 10:14 #3
Цитата Сообщение от Datebailo Посмотреть сообщение
Ошибку выбивает на процедурах:
В С++ нет процедур, одни функции.
0
Datebailo
0 / 4 / 6
Регистрация: 13.05.2016
Сообщений: 58
20.11.2016, 17:30  [ТС] #4
nd2, функции возвращают значение, процедуры нет, разве нет?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2016, 17:30

Передача двухмерного массива из функцию в функцию
Допустим у меня есть функция, в которой &quot;генерируется&quot; массив. Но нужно его...

Передача в функцию через указатели
Компилятор говорит, что что-то не так с передачей max и min. Что? #include...

Передача массива структур в функцию не указывая размера массива
Я читаю с командной строки файл в котором содержится массив структур. Есть...


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

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

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