Выделение памяти для массива - C (СИ)

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

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

на вид все просто, а на деле что то не очень =( Выделить память для трехмерного массива а[3][4][5]. Изменить индексы начального элемента массива на [3][-3][3]. Протестировать программу.

Решение задачи: «Выделение памяти для массива»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*
  4. array index shifts
  5. ТОЛЬКО для ознакомления в учебных целях.
  6. В реальных проектах не повторять и все такое.
  7. Комментировать не буду.
  8. */
  9. int*** ptr_make(int iz, int jz, int kz) {
  10.     int*** ptr;
  11.     size_t jj;
  12.     ptr = (int***)malloc(iz*sizeof(int**));
  13.     while(iz) {
  14.         --iz;
  15.         ptr[iz] = (int**)malloc(jz*sizeof(int*));
  16.         jj = jz;
  17.         while(jj) {
  18.             --jj;
  19.             ptr[iz][jj] = (int*)malloc(kz*sizeof(int));
  20.         }
  21.     }
  22.     return ptr;
  23. }
  24. void ptr_free(int*** ptr, int iz, int jz, int kz) {
  25.     while(iz) {
  26.         --iz;
  27.         kz = jz;
  28.         while(kz) {
  29.             --kz;
  30.             free(ptr[iz][kz]);
  31.         }
  32.         free(ptr[iz]);
  33.     }
  34.     free(ptr);
  35. }
  36. int*** ptr_shift(int*** ptr,
  37.                  int iz, int jz, int kz,
  38.                  int i, int j,int k) {
  39.     while(iz) {
  40.         --iz;
  41.         kz = jz;
  42.         while(kz) {
  43.             --kz;
  44.             ptr[iz][kz]-= k;
  45.         }
  46.         ptr[iz]-= j;
  47.     }
  48.     ptr -= i;
  49.     return ptr;
  50. }
  51.  
  52. int*** ptr_unshift(int*** ptr,
  53.                  int iz, int jz, int kz,
  54.                  int i, int j,int k) {
  55.     ptr += i;
  56.     while(iz) {
  57.         --iz;
  58.         ptr[iz]+= j;
  59.         kz = jz;
  60.         while(kz) {
  61.             --kz;
  62.             ptr[iz][kz]+= k;
  63.         }
  64.     }
  65.     return ptr;
  66. }
  67. void ptr_test() {
  68.     int*** a;
  69.     const int iz = 3, jz = 4, kz = 5; // размеры
  70.     const int is = 3,js = -3, ks = 3; // сдвиги(по фазе[/sarcasm])
  71.     int ***i, **j, *k;
  72.  
  73.     a = ptr_make(iz, jz, kz);
  74.     a = ptr_shift(a, iz, jz, kz, is, js, ks);
  75.  
  76.     // я не хочу использовать ТАКИЕ индексы, поэтому через указатели
  77.     for(i = a + is; i != (a + is + iz); ++i) {
  78.         for(j = *i + js; j != (*i + js + jz); ++j) {
  79.             for(k = *j + ks; k != (*j + ks + kz); ++k) {
  80.                 *k = rand()%100;
  81.             }
  82.         }
  83.     }
  84.     // Вывод делать лень
  85.     a = ptr_unshift(a, iz, jz, kz, is, js, ks);
  86.     ptr_free(a, iz, jz, kz);
  87. }
  88. int main(void) {
  89.     ptr_test();
  90.     return 0;
  91. }

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


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

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

10   голосов , оценка 4.2 из 5

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

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

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