Взятие 2D-массива и объединение его в один - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь выяснить, как объединить двумерный массив в один.

У меня есть 2D-массив, который выглядит следующим образом:

#include <stdio.h>

#define ROW 2
#define COL 10

int
main(void)
{
  int array[ROW][COL] = {2,6,12,18,23,55,57,58,59,60} , {1,3,5,9,11,19,27,28,31,56};
}

Я пытался использовать вложенный цикл for, но безуспешно.

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Сделайте это:

#include <string.h> /* for memcpy() */

#define ROW (2)
#define COL (10)

int main(void)
{
  int array[ROW][COL] = {
    {  2,  6, 12, 18, 23, 55, 57, 58, 59, 60}, 
    {  1,  3,  5,  9, 11, 19, 27, 28, 31, 56}
  };

  int array1D[ROW*COL];
  memcpy(array1D, array, ROW*COL * sizeof(int));
}

В массиве C элементы гарантированно размещаются в памяти последовательно (без заполнения!). Так что просто копирование памяти должно сделать.

0 голосов
/ 12 июля 2019
/* merge nbyA bytes of data in a with nbyB bytes of data in b. Return result. */
void *merge(const void *a, size_t nbyA, const void *b, size_t nbyB)
{
    void *buf = malloc(nbyA + nbyB);
    if (buf) {
        memcpy(buf, a, nbyA);
        memmove(buf + nbyA, b, nbyB);
    }

    return buf; /* caller must free */
}

К a Пасс array[0];to b pass array[1].

Преимущество этого решения заключается в том, что у вас есть обобщенная функция merge, которую можно использовать не только для объединения двух подмассивов двумерного массива, но и для объединения любыхдва блока данных.

0 голосов
/ 12 июля 2019

memcpy не гарантированно работает. Технически вы создаете массив массивов, и в зависимости от того, как выделяется память для каждого отдельного «линейного» массива, memcpy может работать или не работать. Вероятно, будет в зависимости от того, как вы его распределили, но это не гарантировано.

Это то, что вы пытались сделать.

#include <stdio.h>

#define ROW 2
#define COL 10

int
main(void)
{
  int array[ROW][COL] ={ {2,6,12,18,23,55,57,58,59,60} , {1,3,5,9,11,19,27,28,31,56}};

  int i,j;

  int array1D[ROW*COL];

  for (i=0; i<ROW; i++){
        for (j=0; j<COL; j++){
            array1D[i*COL+j]=array[i][j];
        }
   }

   for (i=0; i<ROW*COL; i++){
      printf("%d ",array1D[i]);
   }

}

Обратите внимание, что здесь i представляет строку, а j - столбец. Чтобы получить доступ к индивидуальному int и сохранить «2d» природу, индекс будет row #*column length+column #. Или i*COL+j

...