Как инициализировать массив с определенными значениями? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь подготовить список значений. Кратко:

int x = 5;
int y = 9;
int z = 43;

int myarray[80] = {x, y, z};

Но, как вы знаете, это ошибка. У меня слишком много ценности, и у них особый порядок. Массив выглядит следующим образом:

int x = 5;
int y = 9;
int z = 43;

int myarray[80];

myarray[1] = x;
myarray[2] = y;
myarray[3] = z;

, когда я хочу вставить значение между y и z, мне нужно изменить порядок всех значений на плюс 1 после z .

Ответы [ 5 ]

0 голосов
/ 30 января 2020

Если ваше максимальное значение меньше 80, вы можете использовать индекс массива для хранения флага 0/1 (присутствует / не присутствует)

unsigned char myarray[80];
memset(myarray,0,sizeof(myarray));

myarray[x]=1;
myarray[y]=1;
myarray[z]=1;
/* x,y,z... must be <80 */

Таким образом, массив всегда сортируется без перемещения элементов массива.

0 голосов
/ 30 января 2020

Прежде всего, что вы подразумеваете под вставкой. Если при вставке размер массива изменяется (с 80 до 81), то вам
1) необходимо использовать динамические c выделенные для памяти массивы: int * myarray = (int *) mallo c ( 80 * sizeof (int)) ;
2) перед вставкой необходимо увеличить размер: myarray = (int *) reallo c (myarray, 81 * sizeof (int)) ;
3) затем переместите содержимое памяти: начните с 81 - вниз


Если вы хотите сохранить размер вашего массива до 80, то go к шагу 3.

0 голосов
/ 30 января 2020

Если вы хотите «вставить» новые элементы в ваш массив, вам нужно освободить место для него. Это означает, что вам нужно переместить последние элементы на один шаг «вверх» в массиве.

Вы можете сделать это, используя al oop подобно

for (size_t i = 79; // Index of last element
     i > 2; // The index of the element you want to insert *before*
     ++i)
{
    myarray[i] = myarray[i - 1];  // Move previous element up one step
}

Тогда вы можете " вставить «новое значение в требуемую позицию

myarray[2] = new_value;

Вместо явного l oop вы также можете использовать memmove:

// Move element 2 to become element 3, element 3 will become element 4, etc.
memmove(&myarray[3], &myarray[2], sizeof myarray - sizeof myarray[0] * 2);

myarray[2] = new_value;

[Обратите внимание, что вышеупомянутый memmove вызов написан без тестирования, я мог ошибиться в размере]

Независимо от того, что вы делаете, явный l oop или вызов memmove, вы потеряете последний элемент в массиве (по индексу 79 для массива из 80 элементов).


Если вы собираетесь многократно выполнять вставки, или если вы если вы не хотите потерять какие-либо элементы, то массив, вероятно, имеет неправильный тип контейнера. Связанный список будет намного лучше.

0 голосов
/ 30 января 2020

В C вы не можете добавить или удалить элемент из массива. Вам нужно написать свои собственные функции, такие как

void insert(void *arr, void *val, size_t pos, size_t arraySize, size_t elemSize)
{
    char *startRef = (char *)arr + pos * elemSize;

    memmove(startRef + elemSize, startRef, (arraySize - pos - 1) * elemSize);
    memcpy(startRef, val, elemsize);
}
0 голосов
/ 30 января 2020

Это правильный синтаксис для инициализации массива со значениями: var a = new int[] {x, y, z};

...