如何使函数在C中返回整数点2D

时间:2013-11-06 18:38:21

标签: c

我有关于返回整数点2D的问题。假设我有一个表示2D矩阵的整数点2D。我想转置矩阵。如果我使用普通方式(返回int **)我已经成功运行但问题是当malloc时无法删除内存。所以我想将此函数转换为使用引用函数返回void作为void transposeMatrix(....)//它将返回矩阵G的转置

int** transposeMatrix(int** G,int  nRowSize,int nColumnSize)
{
    int **GT=NULL;
    int nRowIndex,nColumnIndex;
    GT= (int**)malloc(sizeof(int*) * nRowSize);
    memset(GT, 0, sizeof(int*) * nRowSize);
    for (nRowIndex = 0; nRowIndex < nRowSize; nRowIndex++)
        {
        GT[nRowIndex] = (int*)malloc(sizeof(int) * nColumnSize);
        for (nColumnIndex = 0; nColumnIndex < nColumnSize; nColumnIndex++)
            {
                       GT[nRowIndex][nColumnIndex]=G[nColumnIndex][nRowIndex];
            }
        }
     return  GT;
}

你能帮我吗?

2 个答案:

答案 0 :(得分:0)

您可以将指针传递给G

void transposeMatrix(int*** PG,int  nRowSize,int nColumnSize)
}
  ...
  GT[nRowIndex][nColumnIndex]=(*PG)[nColumnIndex][nRowIndex];
  ...
  *GP = GT;
}

或通过引用传递G(我不记得C是否允许这样做):

void transposeMatrix(int** &G,int  nRowSize,int nColumnSize)
}
  ...
  GT[nRowIndex][nColumnIndex]=G[nColumnIndex][nRowIndex];
  ...
  G = GT;
}

答案 1 :(得分:0)

在再次对你的问题有一些想法后,好吧,因为我非常喜欢这个主题。我有点觉得我找到了合适的解决方案。转置函数对矩阵m进行改变,使其指向转置矩阵的适当存储器地址。因此,它释放了前面的矩阵m,以解决任何内存韭菜并改变尺寸,以便在调用者中正确使用。

如果仍有部分遗失,请发表评论。

我希望这会有所帮助。一切顺利

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int **matrix;

matrix newMatrix(int row, int col)
{
    int idx;
    matrix m = malloc(row * sizeof(int*));
    for (idx = 0; idx < row; ++idx)
    {
        m[idx] = malloc(col * sizeof(int));
    }
    return m;
}

void freeMatrix(matrix m, int row, int col)
{
    int idx;
    for (idx = 0; idx < row; ++idx)
    {
        free(m[idx]);
    }
    free(m);
}

void printMatrix(matrix m, int row, int col)
{
    int r, c;
    for (r = 0; r < row; r++)
    {
        for (c = 0; c < col; c++)
        {
            printf("%d ", m[r][c]);
        }
        printf("\n");
    }
}

void swap(int *a, int *b)
{
    int h = *a;
    *a = *b;
    *b = h;
}

void transpose(matrix *m, int *row, int *col)
{
    int r, c;
    matrix t = newMatrix(*col, *row);

    for (r = 0; r < *row; ++r)
    {
        for (c = 0; c < *col; ++c)
        {
            t[c][r] = (*m)[r][c];
        }
    }
    freeMatrix(*m, *row, *col);
    swap(row, col); 
    (*m) = t;
}

int main()
{
    int row = 2, col = 3;
    matrix m = newMatrix(row, col);

    m[0][0] = 1;
    m[0][1] = 1;
    m[0][2] = 1;
    m[1][0] = 2;
    m[1][1] = 4;
    m[1][2] = 3;

    printMatrix(m, row, col);
    transpose(&m, &row, &col);
    printMatrix(m, row, col);       

    return 0;
}