Выделение динамической памяти для двумерного массива с посдедующим изменением его размера - C (СИ)
Формулировка задачи:
Имеется вопрос по поводу реализации. Как это сделать без циклов и многомерных указателей, если это вообще возможно?
У меня имется вот это:
double **d = (double **)calloc(n, sizeof(double *));// создаём матрицу for(int i=0;i<n;i++) d[i] = (double *)calloc(n, sizeof(double)); printf("Write elements of array:\n");// вводим элементы матрицы for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%lf", &d[i][j]);
__int16 i, j, l = 0, Min = numeric_limits<__int16>::max(), Max = numeric_limits<__int16>::min(); int SizeW = 0, SizeH = 0, SizeX = 0; __int16 * Arr = NULL, * ArrX = NULL; srand((unsigned int)time(0)); SizeW = 10 + rand() % 255; SizeH = 10 + rand() % 255; Arr = (__int16*)realloc(Arr, SizeW * SizeH * sizeof(__int16)); if (Arr == NULL) { free(Arr); Arr = NULL; puts("Error memory"); system("pause"); exit(1); } else { i = 0; while (j++ < SizeH) { while (i++ < SizeW) { Arr[j][i] = 128 - rand() % 255; //ошибка } i = 0; } puts(""); free(Arr); Arr = NULL; system("pause"); }
Про сквозную адресацию в массиве я знаю, просто она неудобна, для того, чтобы понять какой это адрс в многомерном представлеии нужно применять операции div/mod к одномерному представлению адресации и/или использовать перемножение и сложение для вычисления одномерного адреса, что тоже неудобно
И почините форум, достало уже, что кнопки в форме быстрго ответа в IE не работают, а в FF не работает разворот спойлера, недохром не предлагать, хотя я не знаю работает оно там или нет, то, что жрёт 5 гигов места на винте и 2 гига оперативы браузером не является, я пользуюсь, пользовался и буду пользоваться только IE, а FF стоит для аниме
Решение задачи: «Выделение динамической памяти для двумерного массива с посдедующим изменением его размера»
textual
Листинг программы
int GenRndArr(__int16* & Array, int & SizeWidth, int & SizeHeight); void main() { int SizeW = 0, SizeH = 0; __int16 * Arr = NULL; GenRndArr(Arr, SizeW, SizeH); } int GenRndArr(__int16 * & Arr, int & SizeW, int & SizeH) { __int16 i, j, *ArrTmp = NULL, *ArrNew = NULL; srand((unsigned int)time(0)); SizeW = 10 + rand() % 6; SizeH = 10 + rand() % 10; ArrNew = (__int16*)realloc(ArrTmp, SizeW * SizeH * sizeof(*ArrTmp)); if (ArrNew == NULL) { free(ArrTmp); ArrTmp = NULL; puts("Error memory"); system("pause"); /*exit(1);*/ } else { j = 0; Arr = ArrNew; while (j < SizeH) { i = 0; while (i < SizeW) { Arr[j * SizeW + i] = 128 - rand() % 255; i++; } j++; } j = 0; //code } if (Arr) { return 0; } else { return 1; } }
Объяснение кода листинга программы
- В функции
GenRndArr
происходит выделение динамической памяти под двумерный массив. - При первом вызове функции
GenRndArr
в функцииmain
, массивArr
инициализируется какNULL
. - Внутри функции
GenRndArr
инициализируются переменныеSizeW
иSizeH
, которые определяют размерность массива. - Затем происходит выделение памяти под массив
ArrTmp
с использованием функцииrealloc
. - Если выделение памяти под
ArrTmp
прошло успешно, тоArrTmp
заменяется наArrNew
, и переменнаяj
инициализируется как 0. - В цикле
while
происходит заполнение массиваArr
значениями от 128 до 0 с шагом 1. - Если выделение памяти под
ArrTmp
не удалось, то выполняется блок кода, который освобождает память, выводит сообщение об ошибке и приостанавливает выполнение программы. - После завершения цикла
while
, возвращается 0. - В функции
main
после вызова функцииGenRndArr
, массивArr
становитсяNULL
. - Если при вызове функции
GenRndArr
произошла ошибка, то программа завершается с кодом ошибки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д