王维来 2015-07-29 01:18 采纳率: 25%
浏览 1710
已结题

此程序为何当选择1的时候没有矩阵输出,好像是形参与实参的关系错了,求解释,求改正。

 // juzhen 2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdlib.h"

typedef struct mat
{
int nRow;          /* 行数               */
int nCol;          /* 列数               */
int* pData;        /* 指向矩??体的指? */
}MAT;

int MATAlloc(MAT *pMat, int nRow, int nCol)
{
    pMat->pData =(int *) malloc (nRow * nCol * sizeof(int));
    if(pMat->pData == NULL)
    {
        printf("memary is error!");
        return -1;
    }
    for(int i=0; i<nRow; ++i)
    {
        for(int j=0; j<nCol; ++j)
        {
            scanf("%d" ,pMat->pData + i*nCol + j);
        }
    }
    pMat->nRow = nRow;
    pMat->nCol = nCol;
    return 0;
}

void MATFree(MAT* pMat)
{
    for(int i=0; i<pMat->nRow; ++i)
    {
        free (pMat->pData+i);
    }
    free(pMat->pData);
    pMat->pData=NULL;
}

int MATAssign (MAT* pMat1, const MAT* pMat2)
{
    if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol))
    {
        for(int i=0; i<pMat1->nRow; ++i)
        {
            for(int j=0; j<pMat1->nCol; ++j)
            {
                *(pMat1->pData+i*pMat1->nCol+j)=*(pMat2->pData+i*pMat1->nCol+j);
            }
        }
        return 0;       
    }
    else
    {
        printf("not assmble");
        return -1;
    }
}

int MATAdd(const MAT* pMat1, const MAT* pMat2, MAT* pMat3)
{
    if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol))
    {
        for(int i=0; i<pMat1->nRow; ++i)
        {
            for(int j=0; j<pMat1->nCol; ++j)
            {
                *(pMat3->pData+i*pMat3->nCol+j)=*(pMat1->pData+i*pMat1->nCol+j)+*(pMat2->pData+i*pMat1->nCol+j);
            }
        }
        return 0;       
    }
    else
    {
        printf("not add!");
        return -1;
    }

}

int MATSub(const MAT* pMat1, const MAT* pMat2, MAT* pMat3)
{
    if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol))
    {
        for(int i=0; i<pMat1->nRow; ++i)
        {
            for(int j=0; j<pMat1->nCol; ++j)
            {
                *(pMat3->pData+i*pMat3->nCol+j)=*(pMat1->pData+i*pMat1->nCol+j)-*(pMat2->pData+i*pMat1->nCol+j);
            }
        }
        return 0;       
    }
    else
    {
        printf("not Sub!");
        return -1;
    }

}

void MATClear(MAT* pMat)
{
    for(int i=0; i<pMat->nRow; ++i)
    {
        for(int j=0; j<pMat->nCol; ++j)
        {
            *(pMat->pData+i*pMat->nCol+j)=0;
        }
    }
}

void MATMulC (MAT* pMat, int C)
{
    for(int i=0; i<pMat->nRow; ++i)
    {
        for(int j=0; j<pMat->nCol; ++j)
        {
            *(pMat->pData+i*pMat->nCol+j)=C * (*(pMat->pData+i*pMat->nCol+j));
        }
    }
}

int MATMul (const MAT* pMat1, const MAT* pMat2, MAT* pMat3)
{
    if(pMat1->nCol == pMat2->nRow)
    {
        for(int i=0; i<pMat1->nRow; ++i)
        {
            for(int j=0; j<pMat1->nCol; ++j)
            {
                *(pMat3->pData+i*pMat1->nRow)=(*(pMat1->pData+i*pMat1->nCol+j)) * (*(pMat2->pData+j*pMat1->nRow+i));
            }
        }
        return 0;       
    }
    else
    {
        printf("not Mul");
        return -1;
    }
}

int MATTransport(const MAT* pMat1, MAT* pMat2)
{
    for(int i=0; i<pMat1->nRow; ++i)
        {
            for(int j=0; j<pMat1->nCol; ++j)
            {
                *(pMat2->pData+j*pMat1->nRow+i)=*(pMat2->pData+i*pMat1->nCol+j);
            }
        }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int nRow,nCol,sign,C;
    MAT Mat, Mat1, Mat2;
    MAT *pMat = &Mat;
    MAT *pMat1 = &Mat1;
    MAT *pMat2 = &Mat2;
    MAT* MATinit(MAT *pMat);
    void Print(MAT *pMat);
    printf("Welcome To The Matrix Operation system!");
    printf("------------------------------------------------\n");
    printf("1: Open The Generating matrix function!\n");
    printf("2: Open The Release matrix function!\n");
    printf("3: Open The Import matrix function!\n");
    printf("4: Open The Add matrix function!\n");
    printf("5: Open The Matrix subtraction function!\n");
    printf("6: Open The Clear matrix function!\n");
    printf("7: Open The Matrix multiplication C function!\n");
    printf("8: Open The Matrix multiplication function!\n");
    printf("9: Open The Matrix transpose function!\n");
    printf("------------------------------------------------\n");
    printf("Please Select operation type:");
    scanf("%d",&sign);
    switch(sign)
    {
    case 1:
        {
            /*MAT Mat;
            pMat = &Mat;
            int nRow=0, nCol=0;
            printf("Please input the number of rows: ");
            scanf("%d",&nRow);
            putchar('\n');
            printf("Please input the number of columns: ");
            scanf("%d",&nCol);
            putchar('\n');
            printf("Please input %dX%d Matrix:\n",nRow,nCol);
            MATAlloc(pMat,nRow,nCol);*/
            pMat = MATinit(pMat);
            Print(pMat);
        }
        break;
    case 2:
        {
            MATFree(pMat);
        }
        break;
    case 3:
        {
            pMat1 = MATinit(pMat1);
            pMat2 = MATinit(pMat2);
            MATAssign (pMat1, pMat2);
            Print(pMat1);
        }
        break;
    case 4:
        {
            pMat1 = MATinit(pMat1);
            pMat2 = MATinit(pMat2);
            pMat = MATinit(pMat);
            MATAdd(pMat1, pMat2,pMat);
            Print(pMat);
        }
        break;
    case 5:
        {
            pMat1 = MATinit(pMat1);
            pMat2 = MATinit(pMat2);
            pMat = MATinit(pMat);
            MATSub(pMat1, pMat2,pMat);
            Print(pMat);
        }
        break;
    case 6:
        {
            MATClear(pMat);
            Print(pMat);
        }
        break;
    case 7:
        {
            pMat = MATinit(pMat);
            printf("Please input the number of C: ");
            scanf("%d",&C);
            putchar('\n');
            MATMulC (pMat, C);
            Print(pMat);
        }
        break;
    case 8:
        {
            pMat1 = MATinit(pMat1);
            pMat2 = MATinit(pMat2);
            pMat = MATinit(pMat);
            MATMul (pMat1, pMat2, pMat);
            Print(pMat);
        }
        break;
    case 9:
        {
            pMat1 = MATinit(pMat1);
            pMat2 = MATinit(pMat2);
            MATTransport(pMat1, pMat2);
            Print(pMat);
        }
        break;
    }
    return 0;
}



MAT* MATinit(MAT *pMat)
{
    MAT Mat;
    pMat = &Mat;
    int nRow=0, nCol=0;
    printf("Please input the number of rows: ");
    scanf("%d",&nRow);
    putchar('\n');
    printf("Please input the number of columns: ");
    scanf("%d",&nCol);
    putchar('\n');
    printf("Please input %dX%d Matrix:\n",nRow,nCol);
    MATAlloc(pMat,nRow,nCol);
    return pMat;
}

void Print(MAT *pMat)
{
    printf("The result is:\n");
    for(int i=0; i<pMat->nRow; ++i)
    {
        for(int j=0; j<pMat->nCol; ++j)
        {
            printf("%d ",*(pMat->pData+i*pMat->nCol+j));
        }
        putchar('\n');
    }
    while(1);
}
  • 写回答

1条回答 默认 最新

  • lpfly 2015-08-03 11:46
    关注

    你在MATinit()函数是错的。没有必要申明一个新的Mat变量,直接使用pMat。
    另外,如果你想新建一个pMat的话,也要用malloc()之类的函数。

    你这里的MAT Mat;申明的这个Mat只存在于MATinit()里,当你回到_tmain()的时候,这个Mat变量已经不存在了。这是个潜在的Segmentation Fault

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。