【问题标题】:Arguments and returning array in CC中的参数和返回数组
【发布时间】:2014-08-19 16:27:42
【问题描述】:

我是 C 的新手,我正在学习 Stephen G. Cochan 的“Programming in C”。我得到了下一个练习:

12.一个有i行j列的矩阵M可以转置成一个有j行的矩阵N 和 i 列,只需将所有 N a,b 的值设置为等于 M b,a 的值 a 和 b 的相关值。

a) 编写一个函数 transposeMatrix,将 4 x 5 矩阵作为参数 和一个 5 x 4 矩阵。让函数转置 4 x 5 矩阵并存储 结果在 5 x 4 矩阵中。还要编写一个主程序来测试这个功能。

我的论点做错了。

我得到的错误是: 警告:return 从没有强制转换的指针中生成整数 [默认启用]

传递“transposeMatrix”的参数 1 使指针从整数不进行强制转换[默认启用]

预期为“int (*)[5]”,但参数是“int”类型(在我看来,这可以忽略)

等等..所有关于论点.. 我知道代码并不完美,但我认为如果正确返回数组并且修复了参数,它应该可以工作..但我找不到修复它的方法..

// Program to transpose M matrix to N matrix

#include <stdio.h>

int transposeMatrix(int matrixM[][5], int matrixN[][4]) {
    int i, j;
    i = 0;
    j = 0;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 5; j++) {
            matrixN[j][i] = matrixM[i][j];
        }
    }
    return matrixN;
}

int main(void) {
    int i, j;
    int matrixM[4][5] = {{12, 25, 47, 87, 54},
                         {16, 89, 78, 63, 58},
                         {45, 21, 47, 62, 82},
                         {14, 56, 47, 41, 98}};

    int matrixN[5][4];
    transposeMatrix(matrixM[4][5], matrixN[5][4]);

    i = 0;
    j = 0;
    for (j = 0; j < 5; j++) {
        for (i = 0; i < 4; i++) {
            printf("%i    ", matrixN[j][i]);
        }
        printf("\n");
    }
    return 0;
}

【问题讨论】:

  • 您将函数声明为int transposeMatrix。这意味着它必须返回一个整数。但是你试图返回一个数组。你不需要这样做,你正在更新调用者的数组。
  • 当您将数组作为参数传递或作为值返回时,不会复制数组。在这些情况下,它们会自动转换为指针。
  • 对未来问题的建议:尝试在您的代码之前介绍您的问题。如果他们不知道要查找什么,该代码对任何人都没有任何好处,因此您迫使潜在的回答者滚动到底部,然后返回阅读您的代码。此外,如果他们在打开您的问题时看到的第一件事是一大块没有上下文或介绍的代码,他们会立即点击离开。
  • 在这里,我编辑了问题。那么我应该如何修复它以返回数组?指针在几章之后,所以我还不知道它们是什么..应该在不了解指针的情况下完成..

标签: c arguments return


【解决方案1】:

函数可以通过两种方式将数据传回给调用者:

  • 返回一个值,然后
  • 更改数据结构,将指针作为参数传递给函数

第一种方法涉及复制,对于较大的值效率低下。当需要返回较大的值而不复制时,或者需要返回多个结果时,首选第二种方式。

另一个问题是传递数组:您的调用应该传递不带索引的数组名称,如下所示:

transposeMatrix(matrixM,matrixN);

您的代码正在使用第二种策略。但是,它不需要返回任何其他内容。因此,函数的正确返回类型应该是void,而不是int。更改返回类型,并删除 return 语句以解决此问题。

Demo on ideone.

【讨论】:

    【解决方案2】:

    实际上,上面链接的代码并没有真正起作用,它只是通过在 printf() 调用中切换行与列来打印转置矩阵,它并没有像练习需要的那样真正转置矩阵(您可以避免调用 transposeMatrix 在全部,结果是一样的)。注意练习的措辞,你应该使用一个函数并将结果存储在一个 new 矩阵中。此外,在本书的这一点上,我们不应该使用指针(目前)。

    我就是这样做的:

    /*
     A matrix M with i rows, j columns can be transposed into a matrix N having j rows and i columns
    by simply setting the value of Na,b equal to the value of Mb,a for all relevant values of a and b.
    Write a function transposeMatrix() that takes as an argument a 4 × 5 matrix and a 5 × 4
    matrix. Have the function transpose the 4 × 5 matrix and store the results in the 5 × 4 matrix. Also
    write a main() routine to test the function.
    */
    
    #include <stdio.h>
    
    void transposeMatrix(int matrix45[4][5], int matrix54[5][4])
    {
        int x, y;
    
        for (x = 0; x < 4; x++)
            for (y = 0; y < 5; y++)
                matrix54[y][x] = matrix45[x][y];
    }
    
    int main(void)
    {
        int x, y;
    
        int myMatrix[4][5] = {  {0, 1, 2, 3, 4},
                                {5, 6, 7, 8, 9},
                                {10, 11, 12, 13, 14},
                                {15, 16, 17, 18, 19} };
    
        int myTransposedMatrix[5][4];
    
        printf("Original Matrix: \n\n");
    
        for (x = 0; x < 4; x++)
        {
            for (y = 0; y < 5; y++)
            {
                printf("%3i", myMatrix[x][y]);
            }
            printf("\n");
        }
    
        transposeMatrix(myMatrix, myTransposedMatrix);
    
        printf("\nTransposed Matrix: \n\n");
    
        for (x = 0; x < 5; x++)
        {
            for (y = 0; y < 4; y++)
            {
                printf("%3i", myTransposedMatrix[x][y]);
            }
            printf("\n");
        }
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-29
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 2011-10-08
      • 2016-09-13
      • 2017-07-13
      • 2015-05-04
      相关资源
      最近更新 更多