C中的参数和返回数组

时间:2014-08-19 16:27:43

标签: c arguments return

我是C的新手,我正在学习" C&C编程作者:Stephen G. Cochan。我接受了下一次练习:

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

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

我对这些论点做错了。

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

传递'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;
}

2 个答案:

答案 0 :(得分:1)

函数有两种方法可以将数据传递回调用者:

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

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

另一个问题是传递数组:你的调用应该传递没有索引的数组名,如下所示:

transposeMatrix(matrixM,matrixN);

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

Demo on ideone.

答案 1 :(得分:0)

实际上上面链接的代码并没有真正起作用,它只是通过在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;
}