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

Объяснение кода листинга программы

  1. В функции GenRndArr происходит выделение динамической памяти под двумерный массив.
  2. При первом вызове функции GenRndArr в функции main, массив Arr инициализируется как NULL.
  3. Внутри функции GenRndArr инициализируются переменные SizeW и SizeH, которые определяют размерность массива.
  4. Затем происходит выделение памяти под массив ArrTmp с использованием функции realloc.
  5. Если выделение памяти под ArrTmp прошло успешно, то ArrTmp заменяется на ArrNew, и переменная j инициализируется как 0.
  6. В цикле while происходит заполнение массива Arr значениями от 128 до 0 с шагом 1.
  7. Если выделение памяти под ArrTmp не удалось, то выполняется блок кода, который освобождает память, выводит сообщение об ошибке и приостанавливает выполнение программы.
  8. После завершения цикла while, возвращается 0.
  9. В функции main после вызова функции GenRndArr, массив Arr становится NULL.
  10. Если при вызове функции GenRndArr произошла ошибка, то программа завершается с кодом ошибки.

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


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

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

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