Разделение массива для чередования 4 элементов в c

#arrays #c #split

#массивы #c #разделение

Вопрос:

Допустим, a=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

тогда я хочу, чтобы x = [1,2,3,4,9,10,11,12] y = [5,6,7,8,13,14,15,16]

Я мог бы сделать это

 #include <stdio.h>

int main()
{
int array[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int *firstHalf = malloc(8 * sizeof(int));
int *secondHalf = malloc(8 * sizeof(int));

memcpy(firstHalf, array, 4 * sizeof(int));
memcpy(secondHalf, array   4,4 * sizeof(int));
memcpy(firstHalf 4, array 8, 4 * sizeof(int));
memcpy(secondHalf 4, array   12,4 * sizeof(int));
for (int i=0;i<8;i  )
{
    printf("First %dn",firstHalf[i]);
}  for (int i=0;i<8;i  )
{
    printf("Second %dn",secondHalf[i]);
}
}
  

Я сделал это, но мне нужно решение, чтобы поместить его в цикл for, чтобы сделать его расширяемым

Пожалуйста, подскажите мне, как это можно сделать

Комментарии:

1. Я не понимаю, почему вы начинаете с копирования 8 элементов, когда вам нужно только 4. Скопируйте 4 элемента в первый массив, скопируйте следующие 4 элемента в другой массив и повторите, следя за конечным условием и неполными наборами в конце.

Ответ №1:

Получил ответ, но если у вас есть лучшее предложение, дайте мне знать

 #include <stdio.h>

int main()
{
int array[32] = {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};
int *firstHalf = malloc(16 * sizeof(int));
int *secondHalf = malloc(16 * sizeof(int));
//for (int h=0;h<9;h =4)
for (int l=0,h=0;l<33,h<16;l=l 8,h=h 4)
{
    memcpy(firstHalf h, array l, 4 * sizeof(int));
memcpy(secondHalf h, array   4 l,4 * sizeof(int));
}
for (int i=0;i<16;i  )
{
    printf("First %dn",firstHalf[i]);
}  for (int i=0;i<16;i  )
{
    printf("Second %dn",secondHalf[i]);
}
}
  

Ответ №2:

Я не совсем уверен, какой это параметр, который вы хотите расширить, поэтому я воссоздал ваш код с двумя параметрами N = 2 — это количество векторов, которые вы хотите в конце, M = 4 — это размер фрагментов, которые вы хотите скопировать вместе:

 #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define N 2 // split in N=2 arrays
#define M 4 // always copy M=4 items together

int main()
{
int array[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int *parts[N];
for (int i=0;i<N;i  )
{
    parts[i] = malloc(16 * sizeof(int) / N);
}
for (int i=0;i<16/N/M;i  )
{
    for (int j=0;j<N;j  )
    {
        memcpy(parts[j] i*M, array   i*M*N   j*M, M * sizeof(int));
    }
}
for (int i=0;i<8;i  )
{
    printf("First %dn",parts[0][i]);
}  for (int i=0;i<8;i  )
{
    printf("Second %dn",parts[1][i]);
}
}
  

Вам обязательно следует изменить M, N на значимые имена и вставить имена для M * N и т.д. в соответствии с контекстом и уделять особое внимание, если ваши числа не делятся, как в этом примере.