#arrays #c #vector #multidimensional-array #integer
#массивы #c #вектор #многомерный-массив #целое
Вопрос:
У меня есть программа на C, в которой я хочу разделить 2D-массив между процессами, где работа с массивом не делится точно на количество процессов. Однако это моя небольшая программа, в которой я вычисляю начальные индексы x и y большого 2D-массива, которые будут выделены каждому процессу (а также количество строк и столбцов, которые получит каждый процесс) и добавляю результаты к векторам. Существует проблема с добавлением элементов к векторам (я распечатал выходные данные программы для векторов i_start и j_start). Я не уверен, что я делаю неправильно, но любая помощь была бы отличной. Спасибо.
#include <stdio.h>
#include <math.h>
int main() {
int K = 10;
int L = 10;
int P = 8;
double pco = sqrt(P);
int pcol = (int)pco;
while((P % pcol) != 0) {
pcol--;
}
int prow = P/pcol;
int KL = K*L;
int coldiv = K/pcol;
int rowdiv = L/prow;
int colrem = K % pcol;
int rowrem = L % prow;
int map[L][K];
int count = 1;
for(int i=0; i < L; i ) {
for(int j=0; j < K;j ) {
map[i][j] = count;
count ;
}
}
int i_start[P];
int j_start[P];
int n_rows[P];
int n_cols[P];
int start;
int num_cols = 0;
int count1 = 0;
// appending to vector here
for(int j = 0; j < prow; j ) {
for(int i = 0; i < pcol; i ) {
if(i < colrem) {
start = (i*(coldiv i));
num_cols = coldiv 1;
printf("col index start: %dn", i*(coldiv i));
printf("col index finish: %dn", i*(coldiv i) coldiv 1);
}
else {
start = (i*coldiv colrem);
num_cols = coldiv;
printf("col index start: %dn", i*coldiv colrem);
printf("col index finish: %dn", i*coldiv colrem coldiv);
}
i_start[count1] = start;
n_cols[count1] = num_cols;
count1 ;
}
}
int count2 = 0;
for(int j = 0; j < pcol; j ) {
for(int i = 0; i < prow; i ) {
int start, num_rows;
if(i < rowrem) {
int start = i*(rowdiv i);
num_rows = rowdiv 1;
printf("row index start: %dn", i*(rowdiv i));
printf("row index finish: %dn", i*(rowdiv i) rowdiv 1);
j_start[count2] = start;
}
else {
int start = i*rowdiv rowrem;
num_rows = rowdiv;
printf("row index start: %dn", i*rowdiv rowrem);
printf("row index finish: %dn", i*rowdiv rowrem rowdiv);
j_start[count2] = start;
}
n_rows[count2] = num_rows;
count2 ;
}
}
// error: printing vectors
for(int i = 0; i < P; i ) {
printf("i: %dn", i);
printf("i start: %dn",i_start[P]);
printf("j start: %dn",j_start[P]);
}
}
Вывод программы:
col index start: 0
col index finish: 5
col index start: 5
col index finish: 10
col index start: 0
col index finish: 5
col index start: 5
col index finish: 10
col index start: 0
col index finish: 5
col index start: 5
col index finish: 10
col index start: 0
col index finish: 5
col index start: 5
col index finish: 10
row index start: 0
row index finish: 3
row index start: 3
row index finish: 6
row index start: 6
row index finish: 8
row index start: 8
row index finish: 10
row index start: 0
row index finish: 3
row index start: 3
row index finish: 6
row index start: 6
row index finish: 8
row index start: 8
row index finish: 10
i: 0
i start: 1
j start: 0
i: 1
i start: 1
j start: 0
i: 2
i start: 1
j start: 0
i: 3
i start: 1
j start: 0
i: 4
i start: 1
j start: 0
i: 5
i start: 1
j start: 0
i: 6
i start: 1
j start: 0
i: 7
i start: 1
j start: 0
Ответ №1:
Если я понял ваши намерения, вы просто печатаете неверный вывод.
for(int i = 0; i < P; i ) {
printf("i: %dn", i);
printf("i start: %dn",i_start[P]);
printf("j start: %dn",j_start[P]);
}
Здесь вы печатаете для i_start
и j_start
всегда один и тот же индекс с P
вместо i
.
Изменение на:
for(int i = 0; i < P; i ) {
printf("i: %dn", i);
printf("i start: %dn",i_start[i]);
printf("j start: %dn",j_start[i]);
}
ваш вывод станет:
col index start: 0
col index finish: 5
col index start: 5
col index finish: 10
col index start: 0
col index finish: 5
col index start: 5
col index finish: 10
col index start: 0
col index finish: 5
col index start: 5
col index finish: 10
col index start: 0
col index finish: 5
col index start: 5
col index finish: 10
row index start: 0
row index finish: 3
row index start: 3
row index finish: 6
row index start: 6
row index finish: 8
row index start: 8
row index finish: 10
row index start: 0
row index finish: 3
row index start: 3
row index finish: 6
row index start: 6
row index finish: 8
row index start: 8
row index finish: 10
i: 0
i start: 0
j start: 0
i: 1
i start: 5
j start: 3
i: 2
i start: 0
j start: 6
i: 3
i start: 5
j start: 8
i: 4
i start: 0
j start: 0
i: 5
i start: 5
j start: 3
i: 6
i start: 0
j start: 6
i: 7
i start: 5
j start: 8