Ir ao conteúdo
  • Cadastre-se

Posts recomendados

Postado

Este codigo esta dando erro mas nao sei mais o que fazer. Alguem pode me ajudar? Preciso criar uma matriz a partir dessa estrutura de forma que sua alocacao e atribuicao sejam por meio de funcoes. Nao sei alocacao dinamica direito e preciso muito de ajuda. Segue o código abaixo. Obrigado

<

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

struct matriz {
 int lin;
 int col;
 float** v;
};

typedef struct matriz Matriz;

Matriz *mat;

Matriz* cria (int m, int n)
{
     int i;
     Matriz mat = (Matriz*) malloc(sizeof(Matriz));
     mat->lin = m;
     mat->col = n;
     mat->v = (float**) malloc(m*sizeof(float*));
     for (i=0; i<m; i++)
     mat->v[i] = (float*) malloc(n*sizeof(float));
     return mat;
}

void libera (Matriz* mat)
{
     int i;
     for (i=0; i<mat->lin; i++)
        free(mat->v[i]);
     free(mat->v);
     free(mat);
}

float acessa (Matriz* mat, int i, int j)
{
    if (i<0 || i>=mat->lin || j<0 || j>=mat->col) {
        printf("Atribuicao invalida \n");
        exit(1);
    }
    return mat->v[i][j];
}

void atribui (Matriz* mat, int i, int j, float v)
{
    if (i<0 || i>=mat->lin || j<0 || j>=mat->col) {
        printf("Atribuição inválida! \n");
        exit(1);
    }
    mat->v[i][j] = v;
}

int main()
{
    int linha, coluna;
    int i,j;

    printf("\n Digite o numero de linhas que a matriz vai ter: ");
    scanf("%d", &linha);
    printf("\n Digite o numero de colunas que a matriz vai ter: ");
    scanf("%d", &coluna);

    for(i=0;i<linha;i++){
        for(j=0;j<coluna;j++){
            mat[i][j] = 0;
        }
    }

}

>

 

  • Solução
Postado

Está dando erro na atribuição de mat na função cria, para corrigir é só acrescentar o operador *

 

Matriz *mat = (Matriz*) malloc(sizeof(Matriz));

 

As funções para manipulação da matriz já estão prontas, é só usar após atribuir a quantidade de linha/coluna.

 

Se quiser adicionar p.ex o valor 20 no primeiro elemento e exibir,

 

mat = cria(linha,coluna);
atribui(mat, 0, 0, 20);
printf("%f\n",acessa(mat, 0, 0));
libera(mat);

 

Para atribuir todos os elementos use dois loops aninhados, um para linhas outro para colunas.

 

  • Curtir 1
Postado

Sobre seu programa:

 

:) bom que funcionou!

 

Vou mostrar algumas coisas que não estão bem lá. Talvez possa incorporar em seus próximos programas e terminar mais depressa usando essas coisas:

  • main() deve ser a primeira função de seu programa. Se possível em um arquivo separado. Há muitas razões para isso, mas em especial vai gostar de começar a ler seus programas e os de outros a partir de main() e a partir do início do texto. Ao mesmo tempo.
     
  • evite retornar void: em geral é um desperdício. Muitas vezes um erro. Em seu caso, na função libera() é um erro mesmo: é mais seguro declarar
     
    Matriz* libera( Matriz* M);

    porque assim você pode se garantir contra você mesmo usando esse ponteiro no futuro, e escrever
     
        mat = libera(mat);

    e invalidar o ponteiro na função que liberou a matriz...
     
  • Use alguma ordem em suas funções, como a ordem alfabética por exemplo. Vai gostar disso quando seu programa tiver 50 funções ao invés de umas poucas. Muitos IDE mostram uma lista das funções, em geral na ordem em que foram declaradas, de modo que você pode clicar no nome e o editor vai direto para o código. E se estiverem em ordem é claro que você só ganha. Veja um exemplo com seu próprio programa:
     
  • image.png.a97666723d01beac5e059fd6c26c0f7b.png

    É claro que assim você navega muito mais rápido pelo código... Basta clicar no nome da função e o editor vai lá. Na função ou na declaração.
     
  • Nunca use variáveis globais. Isso é um pesadelo e sempre vai cair na sua cabeça. Em geral é proibido em empresas e escolas. Não declare a matriz fora de main(). Não declare NADA fora de main().
     

  • Não declare mais que uma variável por linha. Não acrescenta nada e só dificulta a leitura. Inicialize todas as variáveis. Em seu programa pode ser mais seguro usar coisas assim:

    Matriz* mat = cria(20, 20);

    
    Porque assim não vai correr o risco de usar o ponteiro antes de criar uma matriz com ele. E assim não vai declarar fora de main()...

  • Nunca leia valores do teclado para alimentar seu programa antes dele estar rodando. Só vai te atrasar e não acrescenta absolutamente nada. Use constantes, use funções que retornam a estrutura preenchida. Ao terminar os  testes aí sim incorpore a leitura
     
  • Em programas como esse a PRIMEIRA função que você escreve é a que lista a estrutura porque é óbvio que, mesmo que o enunciado não peça, você vai  precisar disso para testar. Devia ter escrito uma
int    mostra(Matriz* M);
  • construções como essa em main() 
    for (i = 0; i < linha; i++) {
        for (j = 0; j < coluna; j++) {
            mat[i][j] = 0;
        }
    }


sugerem que você podia ter escrito uma
 

Matriz*    preenche(Matriz* M, float valor);

 

 

Como seu programa é pequeno, reordenei tudo para você ver mais claramente do que estou falando. Claro, fique a vontade para ignorar tudo que escrevi ;) 
 

Sua estrutura e as declarações:
 

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

typedef struct
{
    int     lin;
    int     col;
    float** v;

}   Matriz;

float   acessa(Matriz*, int, int);
void    atribui(Matriz*, int, int, float);
Matriz* cria(int, int);
Matriz* libera(Matriz*);
int     mostra(Matriz*);
Matriz* preenche(Matriz*, float);

 

Apenas os protótipos estão no início assim o compilador pode tratar os parâmetros. E em ordem: o compilador não precisa dessa ordem. Os leitores sim. 

 

O código em main()
 

int main()
{
    int linha;
    int coluna;
    int i;
    int j;

    Matriz* mat = cria(20, 20);
    mat = prenche(mat, 0.0);
    mostra(mat);
    mat = libera(mat);
    return 0;
};

 

E veja como fica claro que o programa aloca a matriz com 20x20, float, preenche com zero, mostra na tela, apaga e encerra...

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...