Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thinkabout

Mostrar matrizes no ecrã

Mensagens Recomendadas

thinkabout

Boas,

O programa faz o que eu quero contudo mais uma vez não me consigo livrar mais uma vez dos warnings.

'function' : 'int *' differs in levels of indirection from 'int [3][2]'

'escreve' : different types for formal and actual parameter 1

'function' : 'int *' differs in levels of indirection from 'int [4][3]'

'escreve' : different types for formal and actual parameter 1

No exercício anterior tinha precisamente este warnings, que resolvi metendo o cabeçalho da função desta forma com a ajuda do pmg.

http://www.portugal-a-programar.pt/topic/59736-comparar-matrizes-duas-dimensoes-ponteiros/

int saoiguais(int (*matriz1)[TAM], int dim1 , int (*matriz2)[TAM], int dim2);

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define L1 3
#define C1 2
#define L2 4
#define C2 3
/*
Complete o seguinte programa:
A função escreve() deve mostrar o conteúdo de uma matriz de inteiros na consola.
A função recebe como argumentos o endereço do primeiro elemento da matriz,
o número de linhas e o número de colunas.
Neste exemplo, o resultado será o seguinte:
Matriz mat1:	
1 2
3 4
5 6
Matriz mat2:
1 2 3
4 5 6
7 8 9
10 11 12
*/


void escreve(int *matrizX, int linhas, int colunas)
{
int i,j;

for(i=0;i<linhas;i++)
{
 // printf("O indice tomar o valor de  -> %d \n" , (i*col)); Debug para ver a onde anda o índice na memória.
 for(j=0;j<colunas;j++)
 {
  printf("%d\t", *(matrizX+(i*colunas)+j));

 }
 printf("\n");

}
}

int main()
{
int matriz1[L1][C1]={{1,2},{3,4},{5,6}};
int matriz2[L2][C2]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
printf("Matriz 1:\n");
escreve(matriz1, L1, C1);
printf("\nMatriz 2:\n");
escreve(matriz2, L2, C2);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Aqui existe um problema "bicudo" :)

Tu queres passar matrizes de tamanho diferentes à mesma função.

Embora o C seja uma linguagem com 'baixa' "type-safety", não permite que se considerem matrizes de tamanhos diferentes como compativeis ... e, portanto, não podes fazer uma função que aceite ponteiros para arrays de diferentes tamanhos (nota que uma matriz, quando usada como argumento para uma função, é convertida para um ponteiro para o seu primeiro elemento: elemento esse que é um array de tamanho definido).

O que podes fazer, sem deturpar muito a 'baixa' "type-safety" do C, é converter mentalmente a matriz num array de uma unica dimensao (matriz[N][M] passa a ser array[N*M]), coisa que a linguagem garante que funciona, e passar um ponteiro para o primeiro elemento desse array de uma única dimensão. Dentro da função, que também recebe o número de linhas e colunas da matriz, fazes as contas necessarias para reconverter o array duma única dimensão em matriz.

Portanto, em código:

int foo(int *m, size_t rows, size_t cols) {
 int x = 2;
 int y = 2;
 printf("O elemento na posição [%d][%d] tem o valor %d.\n", x, y, m[x*cols + y]);
 return 0;
}
int main(void) {
 int mat1[4][6] = {0};
 int mat2[5][5] = {0};
 foo(&mat1[0][0], 4, 6);
 foo(&mat2[0][0], 5, 5);
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.