引用矩阵-C

时间:2018-07-09 02:50:44

标签: c

我正在尝试通过引用接收矩阵,并将元素添加到另一个互补矩阵中。也就是说,我的方法将收到3个参数:矩阵,一行和一列。

当我填写新矩阵时,我不能拿走收到的行和列。 好吧,我在使用这种方法时遇到了麻烦:

int **matrizComplementar(int **matOriginal, int linha, int coluna){

    int y = 0;
    int k = 0;  
    // Aloca espaço para matriz complementar
    int ** matCompl = retornarMatrizQuadrada(N-1);

    for(int i = 0; i < N; i++){
        if(i != linha){
            for(int j = 0; j < N; j++){
                if(j != coluna)
                {
                    matCompl[y][k] = matOriginal[i][j]; <<< When i read or write
                                                          I get "Sigment Default"
                    k++;
                }
            }
            y++;
        }
        k = 0;      
    }   
    return matCompl;
}

完整代码如下。

int ** preecherMatriz(int ** mat){

    // Preenche a matriz inicial
    for( int k = 0; k < N; k++ ){
        for( int l = 0; l < N; l++ ){
            printf("Entre com o Valor [%d][%d]: ", k ,l );
            scanf("%d", &mat[k][l]);
        }
    }
}

int ** retornarMatrizQuadrada(int tamN){

    // Aloca matriz de tamanho N
    int ** mat;
    mat = (int **)malloc((tamN)*sizeof(int*));
    for (int i=0; i<tamN; i++)
        mat[i] = (int *)malloc((tamN)*sizeof(int));

    return mat;
}

void imprimirMatriz(int ** m){

    // Mostra ao usuário
    printf("\nMatriz complementar:\n");
    for( int k = 0; k < N-1; k++ ){
        for( int l = 0; l < N-1; l++ )
        printf("%d ", &m[k][l]);
    printf("\n");
    system("pause");
    }
}

int ** matrizComplementar(int **matOriginal, int linha, int coluna){

    int y = 0;
    int k = 0;  
    // Aloca espaço para matriz complementar
    int ** matCompl = retornarMatrizQuadrada(N-1);

    for(int i = 0; i < N; i++){
        if(i != linha){
            for(int j = 0; j < N; j++){
                if(j != coluna)
                {
                    matCompl[y][k] = matOriginal[i][j];
                    k++;
                }
            }
            y++;
        }
        k = 0;      
    }   
    return matCompl;
}

int main(void) {    
    imprimirMatriz(matrizComplementar(preecherMatriz(retornarMatrizQuadrada(N)), 1,2)); 
}

1 个答案:

答案 0 :(得分:0)

comments中所述:

  

我的编译器告诉我,您没有从preecherMatriz()返回值,这很可悲,因为您在调用matrizComplementar()时使用了该值-这可能是程序崩溃的原因。一行中的4个函数调用令人恐惧。我不会写这样的代码,尤其是涉及内存分配的地方。您的printf()还会打印数组元素的地址(不正确):您应该放下&

     

不喜欢调用多个函数的原因之一-您无法跟踪分配的内存,因此无法释放它。这里可能没关系;在大多数程序中都是如此。

这是一个紧密基于您的代码的MCVE,该MCVE不会崩溃,并且可以产生我期望的结果:

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

#define N 5

static int **preecherMatriz(int **mat)
{
    for (int k = 0; k < N; k++)
    {
        for (int l = 0; l < N; l++)
        {
            printf("Entre com o Valor [%d][%d]: ", k, l);
            scanf("%d", &mat[k][l]);
        }
    }
    return mat;
}

static int **retornarMatrizQuadrada(int tamN)
{
    int **mat;
    mat = (int **)malloc((tamN) * sizeof(int *));
    for (int i = 0; i < tamN; i++)
        mat[i] = (int *)malloc((tamN) * sizeof(int));
    return mat;
}

static void imprimirMatriz(int **m)
{
    printf("\nMatriz complementar:\n");
    for (int k = 0; k < N - 1; k++)
    {
        for (int l = 0; l < N - 1; l++)
            printf(" %3d", m[k][l]);
        printf("\n");
    }
}

static int **matrizComplementar(int **matOriginal, int linha, int coluna)
{
    int y = 0;
    int k = 0;

    int **matCompl = retornarMatrizQuadrada(N - 1);

    for (int i = 0; i < N; i++)
    {
        if (i != linha)
        {
            for (int j = 0; j < N; j++)
            {
                if (j != coluna)
                {
                    matCompl[y][k] = matOriginal[i][j];
                    k++;
                }
            }
            y++;
        }
        k = 0;
    }
    return matCompl;
}

int main(void)
{
    imprimirMatriz(matrizComplementar(preecherMatriz(retornarMatrizQuadrada(N)), 1, 2));
}

唯一的变化是使函数static(摆脱我极为繁琐的编译器选项),加上额外的return和已删除的&,然后我删除了{{1 }}中的矩阵打印功能。我没有添加检查内存分配失败的方法-应该这样做,但我没有这样做。

示例输出(程序名称system("pause");):

mtx29

因此,您的代码已经接近工作了,但是您要么忽略了编译器警告(不要!),要么您的编译器没有提供您需要的所有帮助-了解如何提高警告级别。 / p>

所示的代码($ mtx29 Entre com o Valor [0][0]: 100 Entre com o Valor [0][1]: 101 Entre com o Valor [0][2]: 102 Entre com o Valor [0][3]: 103 Entre com o Valor [0][4]: 104 Entre com o Valor [1][0]: 210 Entre com o Valor [1][1]: 211 Entre com o Valor [1][2]: 212 Entre com o Valor [1][3]: 213 Entre com o Valor [1][4]: 214 Entre com o Valor [2][0]: 320 Entre com o Valor [2][1]: 321 Entre com o Valor [2][2]: 322 Entre com o Valor [2][3]: 323 Entre com o Valor [2][4]: 324 Entre com o Valor [3][0]: 498 Entre com o Valor [3][1]: 497 Entre com o Valor [3][2]: 476 Entre com o Valor [3][3]: 465 Entre com o Valor [3][4]: 454 Entre com o Valor [4][0]: 511 Entre com o Valor [4][1]: 522 Entre com o Valor [4][2]: 533 Entre com o Valor [4][3]: 544 Entre com o Valor [4][4]: 555 Matriz complementar: 100 101 103 104 320 321 323 324 498 497 465 454 511 522 544 555 $ )使用GCC 8.1.0和命令行在运行macOS High Sierra 10.13.6的Mac上干净地编译:

mtx29.c