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

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

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

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

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
/*
array index shifts
ТОЛЬКО для ознакомления в учебных целях.
В реальных проектах не повторять и все такое.
Комментировать не буду.
*/
int*** ptr_make(int iz, int jz, int kz) {
    int*** ptr;
    size_t jj;
    ptr = (int***)malloc(iz*sizeof(int**));
    while(iz) {
        --iz;
        ptr[iz] = (int**)malloc(jz*sizeof(int*));
        jj = jz;
        while(jj) {
            --jj;
            ptr[iz][jj] = (int*)malloc(kz*sizeof(int));
        }
    }
    return ptr;
}
void ptr_free(int*** ptr, int iz, int jz, int kz) {
    while(iz) {
        --iz;
        kz = jz;
        while(kz) {
            --kz;
            free(ptr[iz][kz]);
        }
        free(ptr[iz]);
    }
    free(ptr);
}
int*** ptr_shift(int*** ptr,
                 int iz, int jz, int kz,
                 int i, int j,int k) {
    while(iz) {
        --iz;
        kz = jz;
        while(kz) {
            --kz;
            ptr[iz][kz]-= k;
        }
        ptr[iz]-= j;
    }
    ptr -= i;
    return ptr;
}
 
int*** ptr_unshift(int*** ptr,
                 int iz, int jz, int kz,
                 int i, int j,int k) {
    ptr += i;
    while(iz) {
        --iz;
        ptr[iz]+= j;
        kz = jz;
        while(kz) {
            --kz;
            ptr[iz][kz]+= k;
        }
    }
    return ptr;
}
void ptr_test() {
    int*** a;
    const int iz = 3, jz = 4, kz = 5; // размеры
    const int is = 3,js = -3, ks = 3; // сдвиги(по фазе[/sarcasm])
    int ***i, **j, *k;
 
    a = ptr_make(iz, jz, kz);
    a = ptr_shift(a, iz, jz, kz, is, js, ks);
 
    // я не хочу использовать ТАКИЕ индексы, поэтому через указатели
    for(i = a + is; i != (a + is + iz); ++i) {
        for(j = *i + js; j != (*i + js + jz); ++j) {
            for(k = *j + ks; k != (*j + ks + kz); ++k) {
                *k = rand()%100;
            }
        }
    }
    // Вывод делать лень
    a = ptr_unshift(a, iz, jz, kz, is, js, ks);
    ptr_free(a, iz, jz, kz);
}
int main(void) {
    ptr_test();
    return 0;
}

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


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

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

10   голосов , оценка 4.2 из 5
Похожие ответы