Jump to content

Recommended Posts

Posted

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);
}
Posted

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!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.