结构体指针初始化
#include <stdio.h>#include <stdlib.h>
#include <string.h>
typedef struct
{
int row, line; //line为行,row为列
double *data;
}Matrix;
Matrix* InitMatrix(Matrix *matrix, int row, int line); //初始化矩阵
void ValueMatrix(Matrix *matrix, double *array); //给一个矩阵赋值
int SizeMatrix(Matrix *matrix); //获得一个矩阵的大小
void FreeMatrix(Matrix *matrix); //释放一个矩阵
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B);
void PrintMatrix(Matrix *matrix); //打印一个矩阵
//矩阵的基本运算
Matrix* AddMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的加法
Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的乘法
void TransMatrix(Matrix *matrix); //条件为方阵
int main(int argc, char* argv[])
{
double value[] = { 1,2,3,4,5,6,7,8,9 };
double value2[] = { 9,8,7,6,5,4,3,2,1 };
Matrix *matrix1 = InitMatrix(matrix1, 3, 3); (1) //显示matrix1未初始化{:5_109:} (1)
Matrix *matrix2 = InitMatrix(matrix2, 3, 3); (2)//显示matrix2未初始化{:5_109:} (2)
ValueMatrix(matrix1, value);
// CopyMatrix(matrix1,matrix2); //复制赋值
ValueMatrix(matrix2, value2);
printf("矩阵1 乘以 矩阵2: \n");
Matrix *matrix3 = MulMatrix(matrix1, matrix2); //乘法
PrintMatrix(matrix3);
return 0;
}
void ValueMatrix(Matrix *matrix, double *array) //给矩阵赋值
{
if (matrix->data != NULL)
{
memcpy(matrix->data, array, matrix->row*matrix->line * sizeof(double));
}
}
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B)
{
matrix_B->row = matrix_A->row;
matrix_B->line = matrix_A->line;
memcpy(matrix_B->data, matrix_A->data, SizeMatrix(matrix_A) * sizeof(double));
}
Matrix* InitMatrix(Matrix *matrix, int row, int line) //初始化一个矩阵
{
if (row > 0 && line > 0)
{
matrix = (Matrix*)malloc(sizeof(Matrix));
matrix->row = row;
matrix->line = line;
matrix->data = (double*)malloc(sizeof(double)*row*line);
return matrix;
}
else
return NULL;
}
void PrintMatrix(Matrix *matrix)
{
for (int i = 0; i < SizeMatrix(matrix); i++)
{
printf("%lf\t", matrix->data);
if ((i + 1) % matrix->line == 0)
printf("\n");
}
}
//乘法
Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B)
{
if (matrix_A->row == matrix_B->line) //列==行
{
Matrix *matrix_C = InitMatrix(matrix_C, matrix_B->row, matrix_A->line); (3) //matrix_C未初始化{:5_109:} (3)
// matrix_C->line = matrix_A->line; //A行
// matrix_C->row = matrix_B->row; //B列
for (int i = 0; i < matrix_A->row; i++)
{
for (int j = 0; j < matrix_B->line; j++)
{
for (int k = 0; k < matrix_A->line; k++)
{
matrix_C->data += matrix_A->data * matrix_B->data;
}
}
}
return matrix_C;
}
else
{
printf("不可相乘\n");
return NULL;
}
}
上面程序中的(1)(2)(3)该如何修改(文中标出了(1)(2)(3)),主函数里面的(1)(2),乘法函数里面的(3)
谢谢!
完整连接如下
https://blog.csdn.net/Beking17113/article/details/100547735
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int row, line; //line为行,row为列
double *data;
}Matrix;
Matrix* InitMatrix(Matrix *matrix, int row, int line); //初始化矩阵
void ValueMatrix(Matrix *matrix, double *array); //给一个矩阵赋值
int SizeMatrix(Matrix *matrix); //获得一个矩阵的大小
void FreeMatrix(Matrix *matrix); //释放一个矩阵
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B);
void PrintMatrix(Matrix *matrix); //打印一个矩阵
//矩阵的基本运算
Matrix* AddMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的加法
Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的乘法
void TransMatrix(Matrix *matrix); //条件为方阵
int main(int argc, char* argv[])
{
double value[] = { 1,2,3,4,5,6,7,8,9 };
double value2[] = { 9,8,7,6,5,4,3,2,1 };
Matrix *matrix1 = NULL;
matrix1 = InitMatrix(matrix1, 3, 3); //显示matrix1未初始化 (1)
Matrix *matrix2 = NULL;
matrix2 = InitMatrix(matrix2, 3, 3); //显示matrix2未初始化 (2)
ValueMatrix(matrix1, value);
// CopyMatrix(matrix1,matrix2); //复制赋值
ValueMatrix(matrix2, value2);
printf("矩阵1 乘以 矩阵2: \n");
Matrix *matrix3 = MulMatrix(matrix1, matrix2); //乘法
PrintMatrix(matrix3);
return 0;
}
void ValueMatrix(Matrix *matrix, double *array) //给矩阵赋值
{
int i;
if (matrix->data != NULL)
{
memcpy(matrix->data, array, matrix->row*matrix->line * sizeof(double));
}
}
int SizeMatrix(Matrix *matrix)
{
return matrix->row*matrix->line;
}
void FreeMatrix(Matrix *matrix)
{
free(matrix->data); //释放掉矩阵的data存储区
if (matrix->data == NULL)
printf("释放成功\n");
else
printf("释放失败\n");
}
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B)
{
matrix_B->row = matrix_A->row;
matrix_B->line = matrix_A->line;
memcpy(matrix_B->data, matrix_A->data, SizeMatrix(matrix_A) * sizeof(double));
}
Matrix* InitMatrix(Matrix *matrix, int row, int line) //初始化一个矩阵
{
if (row > 0 && line > 0)
{
matrix = (Matrix*)malloc(sizeof(Matrix));
matrix->row = row;
matrix->line = line;
matrix->data = (double*)malloc(sizeof(double)*row*line);
return matrix;
}
else
return NULL;
}
void PrintMatrix(Matrix *matrix)
{
int i;
for ( i = 0; i < SizeMatrix(matrix); i++)
{
printf("%lf\t", matrix->data);
if ((i + 1) % matrix->line == 0)
printf("\n");
}
}
//乘法
Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B)
{
int i,j,k;
if (matrix_A->row == matrix_B->line) //列==行
{
Matrix *matrix_C = InitMatrix(matrix_C, matrix_B->row, matrix_A->line); //matrix_C未初始化 (3)
// matrix_C->line = matrix_A->line; //A行
// matrix_C->row = matrix_B->row; //B列
for ( i = 0; i < matrix_A->row; i++)
{
for ( j = 0; j < matrix_B->line; j++)
{
for ( k = 0; k < matrix_A->line; k++)
{
matrix_C->data += matrix_A->data * matrix_B->data;
}
}
}
return matrix_C;
}
else
{
printf("不可相乘\n");
return NULL;
}
}
应该是编译器的问题,我用dev c++没问题,想解决可以先把指针指向NULL 耻思lhj 发表于 2020-4-16 10:59
应该是编译器的问题,我用dev c++没问题,想解决可以先把指针指向NULL
Matrix *matrix_C = InitMatrix(matrix_C, matrix_B->row, matrix_A->line); //matrix_C未初始化 (3)
还有这个乘法里面的matrix_C如何初始化了?按上面的指向NULL就不行了
谢谢! 耻思lhj 发表于 2020-4-16 10:59
应该是编译器的问题,我用dev c++没问题,想解决可以先把指针指向NULL
我用的vs2017 Matrix *matrix_C = NULL;
matrix_C = InitMatrix(matrix_C, matrix_B->row, matrix_A->line);
我用vs2013可以运行,但是不知道为什么结果有问题。
在dev-c++结果没有问题。 本帖最后由 耻思lhj 于 2020-4-16 18:48 编辑
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int row, line; //line为行,row为列
double *data;
}Matrix;
Matrix* InitMatrix(Matrix *matrix, int row, int line); //初始化矩阵
void ValueMatrix(Matrix *matrix, double *array); //给一个矩阵赋值
int SizeMatrix(Matrix *matrix); //获得一个矩阵的大小
void FreeMatrix(Matrix *matrix); //释放一个矩阵
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B);
void PrintMatrix(Matrix *matrix); //打印一个矩阵
//矩阵的基本运算
Matrix* AddMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的加法
Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B); //矩阵的乘法
void TransMatrix(Matrix *matrix); //条件为方阵
int main(int argc, char* argv[])
{
double value = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
double value2 = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
Matrix *matrix1 = NULL;
matrix1 = InitMatrix(matrix1, 3, 3); //显示matrix1未初始化 (1)
Matrix *matrix2 = NULL;
matrix2 = InitMatrix(matrix2, 3, 3); //显示matrix2未初始化 (2)
ValueMatrix(matrix1, value);
// CopyMatrix(matrix1,matrix2); //复制赋值
ValueMatrix(matrix2, value2);
printf("矩阵1 乘以 矩阵2: \n");
Matrix *matrix3 = MulMatrix(matrix1, matrix2); //乘法
PrintMatrix(matrix3);
getchar();
return 0;
}
void ValueMatrix(Matrix *matrix, double *array) //给矩阵赋值
{
int i;
if (matrix->data != NULL)
{
memcpy(matrix->data, array, matrix->row*matrix->line * sizeof(double));
}
}
int SizeMatrix(Matrix *matrix)
{
return matrix->row*matrix->line;
}
void FreeMatrix(Matrix *matrix)
{
free(matrix->data); //释放掉矩阵的data存储区
if (matrix->data == NULL)
printf("释放成功\n");
else
printf("释放失败\n");
}
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B)
{
matrix_B->row = matrix_A->row;
matrix_B->line = matrix_A->line;
memcpy(matrix_B->data, matrix_A->data, SizeMatrix(matrix_A) * sizeof(double));
}
Matrix* InitMatrix(Matrix *matrix, int row, int line) //初始化一个矩阵
{
double value3 = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
if (row > 0 && line > 0)
{
matrix = (Matrix*)malloc(sizeof(Matrix));
matrix->row = row;
matrix->line = line;
matrix->data = (double*)malloc(sizeof(double)*row*line);
ValueMatrix(matrix,value3);
return matrix;
}
else
return NULL;
}
void PrintMatrix(Matrix *matrix)
{
int i;
for (i = 0; i < SizeMatrix(matrix); i++)
{
printf("%lf\t", matrix->data);
if ((i + 1) % matrix->line == 0)
printf("\n");
}
}
//乘法
Matrix* MulMatrix(Matrix *matrix_A, Matrix *matrix_B)
{
int i, j, k;
if (matrix_A->row == matrix_B->line) //列==行
{
Matrix *matrix_C = NULL;
matrix_C = InitMatrix(matrix_C, matrix_B->row, matrix_A->line); //matrix_C未初始化 (3)
// matrix_C->line = matrix_A->line; //A行
// matrix_C->row = matrix_B->row; //B列
for (i = 0; i < matrix_A->row; i++)
{
for (j = 0; j < matrix_B->line; j++)
{
for (k = 0; k < matrix_A->line; k++)
{
matrix_C->data += matrix_A->data * matrix_B->data;
}
}
}
return matrix_C;
}
else
{
printf("不可相乘\n");
return NULL;
}
}
vs2013完美通过了,结果错误的原因是:因为你的初始化矩阵里没有给定初值,所以在没赋值的情况下,这个初始化的矩阵里面的9个double的值都是随机的,
我给你的Matrix* InitMatrix(Matrix *matrix, int row, int line) 里改了,赋了初值,没问题了。
ps:dev-c++应该是自动赋值了0,而vs没有。 耻思lhj 发表于 2020-4-16 18:46
vs2013完美通过了,结果错误的原因是:因为你的初始化矩阵里没有给定初值,所以在没赋值的情况下,这个初 ...
谢谢! 耻思lhj 发表于 2020-4-16 10:59
应该是编译器的问题,我用dev c++没问题,想解决可以先把指针指向NULL
如何将C语言的程序和行号一起复制下来(像你上面做的一样),粘贴到word?
谢谢! 本帖最后由 耻思lhj 于 2020-4-26 08:26 编辑
吴敌小白 发表于 2020-4-25 11:21
如何将C语言的程序和行号一起复制下来(像你上面做的一样),粘贴到word?
谢谢!
编辑框上面有个加代码的功能 耻思lhj 发表于 2020-4-26 08:24
编辑框上面有个加代码的功能
谢谢
页:
[1]