繁体   English   中英

Can't pull my struct data to the main() function(C语言)

[英]Can't pull my struct data to the main() function (C language)

我正在编写 Matrix 库,我有 MatrixMultiplication(Mat a, Mat b) function 返回 Mat

在 function 内部,一切正常,但是当我将它拉到 main 时,所有计算都消失了,尽管我使用的是指针。

我的Mat 结构使用指向一维数组的指针和n x k值来调整大小。


输入:


#include <stdio.h>
#include <stdlib.h>
#include <time.h> 
#define size 100
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////       ALL THIS FUNCTIONS WORK PERFECTLY       //////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int RandomRange(int l,int u){int a = (rand()%(u-l+1))+l;return a;}
void ArrayRandomizer(int *a ,int s,int l,int u){for(int i = 0; i < s; i++){
    int random = RandomRange(l,u);int *ptr2 = &random;Swap(a+i,ptr2);}}
typedef struct Mat {int * arr, rows, cols;} Mat;
Mat MatrixBuilder (int *a,int r,int c){Mat new;new.arr = a;new.rows = r;new.cols = c;return new;}
void PrintMatrix (Mat a){
    printf("\nMatrix %dx%d :\n",a.rows,a.cols);
    for (int i = 1, j = 0; i <= a.rows; i++ ,j = j + a.cols ){
    for (; j < (a.cols*a.rows); j++){
    if ((j+i)%a.cols == 1){printf(" [");}
    printf("%d ,",*(a.arr+(j+i-1)));
    if ((j+i)%a.cols == 0){printf("]\n");}}}}
int MatrixValueOfCell (Mat a,int r,int c){
    if (r > a.rows-1){printf("\n*****MatrixValueOfCell ROW IS OUT OF THE MATRIX , USE SMALLER INTEGER");return -9999999;}
    if (c > a.cols-1){printf("\n*****MatrixValueOfCell COL IS OUT OF THE MATRIX , USE SMALLER INTEGER");return -9999999;}
    if (r < 0){printf("\n*****MatrixValueOfCell CAN'T USE NEGATIVE ROW INDEX , USE BIGGER INTEGER");return -9999999;}
    if (c < 0){printf("\n*****MatrixValueOfCell CAN'T USE NEGATIVE COL INDEX , USE BIGGER INTEGER");return -9999999;}
    return *(a.arr+((r)*a.cols)+(c));}
void setMatrixValueOfCell (int s,Mat a,int r,int c){
    if (r > a.rows-1){printf("\n*****MatrixValueOfCell ROW IS OUT OF THE MATRIX , USE SMALLER INTEGER");}
    else if (c > a.cols-1){printf("\n*****MatrixValueOfCell COL IS OUT OF THE MATRIX , USE SMALLER INTEGER");}
    else if (r < 0){printf("\n*****MatrixValueOfCell CAN'T USE NEGATIVE ROW INDEX , USE BIGGER INTEGER");}
    else if (c < 0){printf("\n*****MatrixValueOfCell CAN'T USE NEGATIVE COL INDEX , USE BIGGER INTEGER");}
    else {*(a.arr+((r)*a.cols)+(c)) = s ;}}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Mat MatrixMultiplication (Mat a,Mat b){
int q [a.rows*b.cols]; int * ptr = q;
ArrayRandomizer(ptr,a.rows*b.cols,0,0);
Mat c = MatrixBuilder (ptr,a.rows,b.cols);
for (int i = 0; i < a.rows; i++){
    for (int j = 0; j < b.cols; j++){
        for (int k = 0; k < a.cols; k++){
            setMatrixValueOfCell((MatrixValueOfCell(c,i,j)+(MatrixValueOfCell(a,i,k)*MatrixValueOfCell(b,k,j))),c,i,j);}}}

printf("\n________________________________\nDirect From Function :");
PrintMatrix(c);
printf("________________________________\n");
return c;

}



int main (void){

int a[size];ArrayRandomizer(a,size,0,46);int * ptr = a;
Mat test = MatrixBuilder(ptr , 4 , 3);

int b[size];ArrayRandomizer(b,size,0,9);int * ptr2 = b;
Mat test2 = MatrixBuilder(ptr2 , 3 , 4);

PrintMatrix(test);
PrintMatrix(test2);

Mat Result = MatrixMultiplication(test,test2);

PrintMatrix(Result);

}




OUTPUT:


Matrix 4x3 :
    [38 ,4 ,18 ,]
    [23 ,17 ,26 ,]
    [16 ,3 ,28 ,]
    [28 ,10 ,17 ,]

Matrix 3x4 :
    [5 ,0 ,4 ,8 ,]
    [7 ,1 ,7 ,2 ,]
    [7 ,2 ,2 ,6 ,]

________________________________
Direct From Function :
Matrix 4x4 :
    [344 ,40 ,216 ,420 ,]
    [416 ,69 ,263 ,374 ,]
    [297 ,59 ,141 ,302 ,]
    [329 ,44 ,216 ,346 ,]
________________________________

Matrix 4x4 :
    [1 ,0 ,1 ,0 ,]
    [2 ,0 ,3 ,0 ,]
    [297 ,59 ,10 ,0 ,]
    [1564489376 ,32593 ,1979723792 ,21998 ,]



我还尝试返回一个指针而不是 Mat 结构,然后使用这个指针创建一个新的 Matrix 但它不起作用,我想知道如何在不使用 malloc() calloc() 等函数分配动态 memory 的情况下解决这个问题谢谢:)

顺便说一句,如果以某种方式连接,我在虚拟机上使用 Ubuntu

MatrixMultiplication function 中,数组q分配在堆栈上。 所以在 function 退出时,它的 memory 被释放,矩阵数据可能被其他值替换。 解决方案是将 memory 分配给malloc ,这样它甚至可以保留在 function 之外。

从您的代码中,我刚刚删除了变量q并将ptr替换为 memory 分配:

Mat MatrixMultiplication (Mat a,Mat b){
int * ptr = malloc(a.rows * b.cols * sizeof(*ptr));
ArrayRandomizer(ptr,a.rows*b.cols,0,0);
Mat c = MatrixBuilder (ptr,a.rows,b.cols);
for (int i = 0; i < a.rows; i++){
    for (int j = 0; j < b.cols; j++){
        for (int k = 0; k < a.cols; k++){
            setMatrixValueOfCell((MatrixValueOfCell(c,i,j)+(MatrixValueOfCell(a,i,k)*MatrixValueOfCell(b,k,j))),c,i,j);}}}

printf("\n________________________________\nDirect From Function :");
PrintMatrix(c);
printf("________________________________\n");
return c;

}

还要注意这段代码只是为了指出您暴露的问题。 它不能成为全局解决方案,因为它会导致另一个问题:memory 泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM