Другие языки программирования и технологии

Помогите с программой на Си. (создание многомерных динамических массивов)

Нужно сформировать матрицу отдельной функцией таким образом: функция получает двойной указатель на матрицу и указатели на ее
размерность. В теле функции вводится размерность матрицы, выделяется память в
куче и заполняется указанной формулой. .
вот что делаю я:

void form(float **C, int *n, int *m, float a, float b, float c)

{int i,j;




printf("Input size of matrix: ");

scanf("%d %d",&n,&m);

*C=(float*)malloc((*n)*(*m)*sizeof(float));

for(i=0;i<*n;i++)

for(j=0;j<*m;j++)

*(*C+i*(*m)+j)=a*powf(i,2)+b*powf(j,2)+c;

}
Это неправильно сформирован динамический массив, т. к. выдает ошибку. Как правильно? и как потом вызвать это в главной функции?
#include <stdio.h>
#include <stdlib.h>
float** create(int*, int*);
void destroy(float**, int*);
void print(float**, int*, int*);
int main() {
    float** pmx = NULL;
    int rows, cols;
    if (pmx = create(&rows, &cols)) {
        print(pmx, &rows, &cols);
        destroy(pmx, &rows);
        pmx = NULL;
    } else printf("\a\n Error!\n");
    fflush(stdin);
    getchar();
}
void print(float** pmx, int* rows, int* cols) {
    int row, col;
    for (row = 0; row < *rows; ++row, printf("\n"))
        for (col = 0; col < *cols; ++col)
                printf(" %f", pmx[row][col]);
    printf("\n");
}
float** create(int* rows, int* cols) {
    float** ptr = NULL;
    printf(" Rows: "); scanf_s("%i", rows);
    printf(" Cols: "); scanf_s("%i", cols);
    if (ptr = (float**)calloc(*rows, sizeof(float*))) {
        int row, r;
        for (row = 0; row < *rows; ++row) {
            if (ptr[row] = (float*)calloc(*cols, sizeof(float)));
            else {
                for (r = 0; r < row; ++r) free(ptr[r]);
                free(ptr);
                ptr = NULL;
                break;
            }
        }
    }
    return ptr;
}
void destroy(float** pmx, int* rows) {
    if (pmx) {
        int row;
        for (row = 0; row < *rows; ++row) free(pmx[row]);
        free(pmx);
    }
}
ДН
Дмитрий Никитин
70 047
Лучший ответ
Если нужен именно float **С, то делаем так
С=new float* [m];
for(int i=0;i < m;i++) C[ i ]=new float [n];
тогда нужно писать С[ i ][ j ]=блаблабла
удаляем - в обратном порядке:
for(int i=0;i < m;i++) delete C[ i ];
delete C;

Если же нужен float*С, то убери лишнюю звездочку в заголовке, и вроде должно заработать.
Есть вот такой полезный динамический макрос:
#define C (x,y) C [ (x)+m*(y) ]
теперь можно будет писать
С(i,j) = блаблабла
АА
Алекс Алекс
75 009
Это что за извращенный код, никогда такого не видел, весь исправлять не буду, но память вы точно неправильно выделяете, нужно так
float *C
....
C = (float *)malloc(n*m*sizeof(float));
....
free(С);
исправляйте все, включая неправильную передачу параметров в функцию
void form(float *C, int n, int m, float a, float b, float c)
....
и сам код где, что-то присваиваете тоже неправильный
for(i=0;i