Программе на C не удается правильно добавить целые числа к вектору

#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