Выделение памяти для массива - 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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д