Выделение динамической памяти для двумерного массива с посдедующим изменением его размера - 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произошла ошибка, то программа завершается с кодом ошибки.