1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C - Input Matriz bidimensional - help.

Discussão em 'Programação' iniciada por DarTaKaum, 1 de Abril de 2005. (Respostas: 9; Visualizações: 2351)

  1. DarTaKaum

    DarTaKaum Power Member

    Bem eh o seguinte tou a fazer um programa k vai usar uma sopa de letras,
    o input eh do tipo:

    nr. de colunas
    nr. de linhas
    sopa

    ex:

    3
    3
    qwe
    asd
    zxc

    tenho feito este codigo mas está-me smp a dar um erro de segmentation fault.

    Que eh que esta errado?
    Código:
    int main ()
    {
      int linhas,colunas,i;
      char matriz[linhas][colunas];
    
      void getmatriz(int linhas,int colunas)
      {
         for (i=0; i < linhas; i++)
    	 fgets(matriz[i],colunas,stdin);
    	  
      }
    
      scanf(" %d",&colunas);
      scanf(" %d",&linhas);
      
      getmatriz(linhas,colunas);
     
      return 0;
            }
    
    thkx.
     
  2. kanguru

    kanguru [email protected] Member

    Não podes definir a matriz[linhas][colunas] se tu ainda não sabes o tamanho que vai ter :P
     
  3. JPgod

    JPgod Moderador
    Staff Member

    Em C++ utilizo Vector de vectores para criar matrizes...
     
  4. Seavoices

    Seavoices Power Member

    E então como é que ele fazia a matriz? Com as mãos??? Está definido desde o início que é uma matrix bidireccional...

    Btw, embora n seja o melhor método, utilizava IF's encadeados de forma a preencher a matriz. Foi o método que aprendi:

    if (i=0; i++; i<linha)
    if (j=0; j++ ; j<coluna)
    matriz [linha][coluna]

    Depois para o display da matriz, prinf encadeado em mais dois If's com contadores...
     
  5. Shakawkaw

    Shakawkaw Suspenso

    Já não me lembro muito de C, mas esse fgets parece-me errado. O fgets lê uma linha inteira, e segundo o que entendo tu queres posicionar um unico caracter em cada posição da matriz.

    fgets(genero, tamanho maximo, fonte).

    Acho que deverias de facto ler as linhas, mas caracter a caracter e ir inserindo na matriz.


    De resto será muito mais fácil neste e noutros trabalhos que venhas a fazer (especialmente se forem mais complexos) se usares um debugger, como o gdb que vem no Linux.

    Boa sorte
     
  6. kanguru

    kanguru [email protected] Member

    volto a repetir... akilo da prego logo no:
    char matriz[a];
    Porque dentro do a e b está lixo. Tens que fazer com apontadores


    char **matriz;
    scanf(" %d",&colunas);
    scanf(" %d",&linhas);
    matriz = (char **) malloc(linhas*sizeof(char*);
    for (i=0; i< linhas; i++)
    matriz = (char) malloc(colunas*sizeof(char));

    Não ker dizer ke este kodigo esteja 100% certo, mas é para teres uma ideia de como isso se faz. Tem que ser com memória dinâmica. Boa sorte.

    Usa o gdb para debug, mas se o fores usar no programa komo tens aí ele mal entra no main dá seg fault.
     
  7. CrazyBomber

    CrazyBomber Power Member

    Bem a não ser que eu esteja bêbedo ou mt eskecido de C (já não faço nada com isso há quase 1 ano, pra ser sincero =/ ) o problema é estares a declarar uma matriz[ a ][ b ] sem teres o 'a' e o 'b' inicializados.
    Agora assim de repente não sei como se faz em C, só me lembro em Java! lol!

    Bad Way:
    int x, y;
    int[][] matriz = new int[ x ][ y ];


    Good Way:
    int[][] matriz;
    int x = 5;
    int y = 3;
    matriz = new int[ x ][ y ];

    algures por esses moldes... em C deve ser algo parecido, suponho eu :)
    Boa sorte :P
     
    Última edição: 2 de Abril de 2005
  8. redalert

    redalert Folding Member

    tha only f*cking good way: :x2:

    Código:
    #define NUMERO_LINHAS 50
    #define NUMERO_COLUNAS 50
    
    int **matriz, i=0;
    matriz = (int**)calloc(NUMERO_LINHAS, sizeof(int*));
      for(i=0; i<NUMERO_COLUNAS; i++)
          matriz[i]=(int *)calloc(NUMERO_COLUNAS, sizeof(int));
    nao eskecer de fazer free() antes do return da main ou exit() ao longo do codigo!

    [[]]
     
  9. PrOdG

    PrOdG Power Member

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    
    void getmatriz(char** matriz, int linhas, int colunas) {
            int i ;
            for (i=0; i < linhas; i++) {
                    matriz[i] = malloc(sizeof(char) * (colunas+2)) ;
                    fgets(matriz[i],colunas+2,stdin);
            }
    }
    
    
    int main () {
            int linhas ;
            int colunas ;
            char* tlinhas = malloc(2) ;
            char* tcolunas = malloc(2) ;
    
            fgets(tlinhas, 2, stdin) ;
            fgets(tcolunas, 2, stdin) ;
    
            linhas = atoi(tlinhas) ;
            colunas = atoi(tcolunas) ;
    
            free(tlinhas) ;
            free(tcolunas) ;
    
            char** matriz = malloc(sizeof(char) * linhas) ;
    
            getmatriz(matriz, linhas,colunas) ;
    
            return 0 ;
    }
    
    Este código está a funcionar, testei-o e deu certo. Provavelmente há uma maneira mais simples de o fazer, mas não gosto de scanf, fgets all the way! ;) Qualquer dúvida, é perguntar.


    EDIT: as palavras tão a ficar com um \n (newline) no fim, se não quiseres que isso aconteça basta colocar dentro da função for, no fim,
    Código:
    matriz[i][colunas+1] = '\0' ;
    
     
    Última edição: 2 de Abril de 2005
  10. DarTaKaum

    DarTaKaum Power Member

    thkx a lot a todos vós! :) **
     

Partilhar esta Página