Изменение размера массива по ходу программы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго дня. Надо изменять размерность массива по ходу выполнения программы. Хотел, по наивности, сделать так:
Листинг программы
  1. volatile uint16_t testarray[1];
  2. int main(void)
  3. {
  4. ///
  5. if ( param = 1 )
  6. {
  7. testarray[20];
  8. }
  9. else if ( param = 0 )
  10. {
  11. testarray[1];
  12. }
  13. ///
  14. }
, где /// - опущенные ненужные строки кода. Но не прокатило. Подсказали про функции malloc, realloc и free. Но компилятор даёт кучу ошибок (см. вложение), когда я пытаюсь состряпать хотя бы создание массива. Пробовал так:
Листинг программы
  1. volatile uint16_t *testarray;
  2. testarray = (uint16_t *) malloc (sizeof (uint16_t) * 20);
Если кому не трудно, то напишите, пожалуйста: а) как правильно создать нужный массив; б) как правильно изменить его размерность.

Решение задачи: «Изменение размера массива по ходу программы»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4.  
  5. // old_size - старый размер
  6. // new_size - новый размер
  7.  
  8. int* Resize(int *Arr, int old_size, int new_size)
  9. {
  10.      int i,k;
  11.      k=(old_size<new_size)?old_size:new_size;
  12.      int *r=calloc(new_size,sizeof(int));
  13.      for (i=0; i<k; i++) r[i]=Arr[i];
  14.      free(Arr);
  15.      return r;
  16. }    
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20.  
  21.   int *A;
  22.   int i;
  23.  
  24.   A=calloc(20,sizeof(int)); // массив из 20 эл-тов
  25.  
  26.   for (i=0; i<20; i++) A[i]=i; // заполняем
  27.  
  28.   printf("Initial Arr="); // печатаем
  29.   for (i=0; i<20; i++) printf(" %d",A[i]);
  30.   printf("\n");
  31.  
  32.   A=Resize(A,20,30); // ресайзируем
  33.  
  34.   printf("After resizing ="); // печатаем
  35.   for (i=0; i<30; i++) printf(" %d",A[i]);
  36.   printf("\n");
  37.  
  38.   free(A); // удаляем
  39.  
  40.   system("PAUSE"); 
  41.   return 0;
  42. }

Объяснение кода листинга программы

  1. Объявлены две функции: Resize и main.
  2. В функции Resize определены три переменные: i, k, r. Значение k будет использоваться для контроля цикла.
  3. Значение new_size проверяется на максимальное значение old_size, чтобы избежать переполнения.
  4. Выделен новый массив r с помощью функции calloc.
  5. В цикле копируются элементы из старого массива Arr в новый массив r.
  6. Функция free используется для освобождения памяти, выделенной для старого массива Arr.
  7. Возвращается адрес нового массива r.
  8. В функции main объявлены две переменные: A и i.
  9. Выделен массив A с помощью функции calloc размером 20 элементов.
  10. В цикле заполняются элементы массива A значениями от 0 до 19.
  11. Выводится сообщение Initial Arr= и значения элементов массива A.
  12. Массив A передается в функцию Resize для изменения размера.
  13. Выводится сообщение After resizing = и значения элементов нового массива A.
  14. Массив A освобождается с помощью функции free.
  15. Запускается команда PAUSE для приостановки выполнения программы.
  16. Возвращается значение 0, указывающее на успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы