• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

kanixe

Matriz n*m

8 mensagens neste tópico

Queria perguntar como posso fazer uma matriz m*n em que o utilizador diz o numero de colunas e linhas. Sei que para um vector é fazer um calloc, como ficará aqui, umas vez que terei de usar um apontador para um apontador?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tans que fazer um malloc (ou um calloc (*)) para a matriz "principal" e m mallocs para cada uma das linhas.

Por exemplo, uma tabuada:

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

int main(void) {
  int cols = 10, lines = 16;
  int line, col;
  int **mat;

  mat = malloc(lines * sizeof *mat);
  if (!mat) {
    fprintf(stderr, "No memory. Program aborted.\n");
    exit(EXIT_FAILURE);
  }
  for (line = 0; line < lines; line++) {
    mat[line] = malloc(cols * sizeof **mat);
    if (!mat[line]) {
      fprintf(stderr, "No memory. Program aborted.\n");
      while (line--) {
        free(mat[line]);
      }
      free(mat);
      exit(EXIT_FAILURE);
    }
  }
  for (line=0; line<lines; line++) {
    for (col=0; col<cols; col++) {
      mat[line][col] = (line+1)*(col+1);
      printf("\t%d", mat[line][col]);
    }
    puts("");
  }
  for (line=0; line<lines; line++) {
    free(mat[line]);
  }
  free(mat);
  return 0;
}

(*) o calloc vai "perder tempo" a inicializar a memória a 0. Em princípio, a primeira coisa que fazes depois da alocação de memória é meter valores específicos nessa memória; não precisas de "perder tempo" a inicializá-la.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma outra solução pode ser tão simples como fazer um int *matriz = (int*)malloc(m*n*sizeof(int)). Depois para aceder ao elemnto (x,y) é fazer *matriz[x*m+y], algo assim:

int main() {
    int m=10, n=15;
    int *matriz = (int*)malloc(m*n*sizeof(int));
    //verificar se o espaço foi atribuido; ver código do pmg

    //escrever na posição (5,7)
    matriz[5*m+7] = 10;

    free(matriz);
    return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
*matriz = (int*)malloc(m*n*sizeof(int));

Eu tenho aqui um compilador de C onde essa instrução "não funciona" (se eu me esquecer de incluir <stdlib.h>).

O que acontece é que neste compilador sizeof(int) é 2 e sizeof(int *) é 4.

Como me esqueci de incluir <stdlib.h>, o compilador assume que a função malloc() devolve um int (2 bytes). Com o cast esse int é convertido para um (int *), mas nesta altura a informação que devia estar nos bytes perdidos já se foi!

Depois ... ao fazer matriz[5*m+7'] = 10; o computador crasha :):D

Resumo: não faças casts ao malloc e não te esqueças de incluir <stdlib.h> e liga os warnings do teu compilador

E se precisares de compilar o mesmo código em C e C++ usa #ifdef __cplusplus

C:\PROJECTS\TMP>type mat2.c

#include <stdio.h>

/* #include <stdlib.h> */

int main(void) {

  int *mat = (int*)malloc(200);

  printf("mat points to %p\n", mat);

  if (mat) free(mat);

  return 0;

}

C:\PROJECTS\TMP>\tc\tcc -ml mat2.c

Turbo C  Version 2.01  Copyright © 1987, 1988 Borland International

mat2.c:

Turbo Link  Version 2.0  Copyright © 1987, 1988 Borland International

        Available memory 398114

C:\PROJECTS\TMP>mat2

mat points to 0000:0008

C:\PROJECTS\TMP>

Quanto à ideia de usar um array simples para simular um array múltiplo: boa ideia! :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu incluí o <malloc.h> e tudo funciona bem ::)

Claro que eu estou a utilizar um compilador de 32 bits (VS2008), enquanto o Turbo C é de 16 bits.

EDIT: pensava que o compilador se queixava quando não fazia cast. Afinal estava enganado, só se queixa em C++. Como programo mais em C++ do que em C, resultou em confusão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O <malloc.h> não faz parte dos headers standard do C :)

O C++ é mais esquisito (mais "type safe") que o C. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O <malloc.h> não faz parte dos headers standard do C :)

Essa não sabia. Quando me ensinaram a utilizar o malloc (no século passado :D ) foi com esse header. Curiosamente foi em Turbo C :D

De qualquer forma, o problema no exemplo que deste seria a não inclusão do header necessário, e o compilador queixa-se com um warning. O qual deve ser resolvido

O C++ é mais esquisito (mais "type safe") que o C. :)

Sim, é um dos '+' :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora