thinkabout Posted March 30, 2013 at 10:00 PM Report #500952 Posted March 30, 2013 at 10:00 PM 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); }
pmg Posted March 31, 2013 at 11:17 AM Report #500993 Posted March 31, 2013 at 11:17 AM 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!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now