Передача массива в функцию через указатель - C (СИ)
Формулировка задачи:
Доброго времени суток!
Почему компилятор ругается :
error C2664 невозможно преобразовать параметр 3 из 'float [4][4]' в 'float *'
?void MSM(float a[N][N], float b[N][N],float *c) { for(int i=0;i<N; i++) { for(int j=0; j<N; j++) { for(int m=0; m<N; m++) { c[i][j]+=a[i][m]*b[m][j]; } } } }
И как можно изменить функцию так , чтобы она брала матрицы разных размеров ? Т.е. не зависела от
[N][N]
.Решение задачи: «Передача массива в функцию через указатель»
textual
Листинг программы
#include <conio.h> #include <stdio.h> #include <stdlib.h> #define N 4 void PSM(float mtrx[N][N]) { printf("\n \n"); int j=0; int i=0; for(i=0;i<N;i++) { for (j=0;j<N;j++)printf("[%.1f]\t",mtrx[i][j]); printf("\n \n"); } getch(); } void TSM(float mtrx[N][N],float t[N][N]) { for(int p = 0; p < N; p++) { for(int r = 0; r < N; r++) { t[p][r]=mtrx[p][r]; } } printf("Промежуточное вычисление. Исходная матрица:\n"); PSM(mtrx); int b; for(int i = 0; i < N; i++) { for(int j = i; j < N; j++) { b = t[i][j]; t[i][j] = t[j][i]; t[j][i] = b; } } printf("Промежуточное вычисление. Транспонированная матрица:\n"); PSM(t); } void MSM(float ** a, float **b, float **c, int k) { printf("\n \nВыполнение\n \n"); for(int i=0;i<k; i++) { for(int j=0; j<k; j++) { for(int m=0; m<k; m++) { c[i][j]+=a[i][m]*b[m][j]; } } } } int _tmain(int argc, _TCHAR* argv[]) { //setlocale(LC_ALL,"rus"); float **A; A = new float*[N]; for(int i = 0; i < N; ++i) A[i] = new float[N]; float **K; K = new float*[N]; for(int i = 0; i < N; ++i) K[i] = new float[N]; for(int i = 0; i < N; ++i) for(int j = 0; j < N; ++j) { A[i][j] = i*1.5; //или другими числами можно заполнять K[i][j] = 0; } //float X[]={0,0,0,0}; //float B[]={3,2,3,2}; //float Y[]={3,1,2,2}; // float K[N][N]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; float T[N][N]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; printf("(А^2)=\n"); MSM(A,A,K,N); /*PSM(K); TSM(A,T); printf("(А^2)*(А^Т)=\n"); MSM(K,T,K,N); PSM(K); printf("(А^2)*(А^Т)*А=\n"); MSM(K,A,K, N); PSM(K);*/ //освобождение памяти for(int i = 0; i < N; ++i) delete [] A[i]; delete [] A; for(int i = 0; i < N; ++i) delete [] K[i]; delete [] K; return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д