Jump to content

[Resolvido] Comparar Matrizes duas dimensões - Ponteiros


Recommended Posts

Posted (edited)

Boas Pessoal,

Agradeço ideias para melhorar este código, apesar de estar a funcionar.

Estou com dúvidas como recebo vectores de duas dimensões em ponteiros. (se é que é possível), penso que só recebemos o começo o sítio a onde o mesmo começa.

Quanto estou a compilar estou a obter os seguintes erros.

warning C4047: 'function' : 'int *' differs in levels of indirection from 'int [5][5]'

warning C4024: 'saoiguais' : different types for formal and actual parameter 1

warning C4024: 'saoiguais' : different types for formal and actual parameter 3

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define TAM 5
/*
Desenvolva uma função que receba, como argumentos, os nomes e as dimensões de dois
arrays de inteiros e verifique se estes são iguais.
Considere que dois arrays de inteiros são iguais se tiverem o mesmo número de elementos e se, em posições equivalentes, tiverem elementos com o mesmo valor.
A função devolve 1 se os arrays forem iguais, e 0 no caso contrário


Modifique a função do exercício anterior de modo a permitir comparar arrays de inteiros de
duas dimensões (matrizes).
*/

int saoiguais(int *matriz1, int dim1 , int *matriz2, int dim2)
{
int i=0,j=0,totalcerto=0;
 while (matriz1[i] == matriz2[j] && i < TAM*2)
 {
  totalcerto ++;
  i++;
  j++;
 }
 // printf("%d", totalcerto);
if (totalcerto == TAM*2)
{
return 1;
}
else
{
return 0;
}
}


int main()
{                  
int matriz1 [TAM][TAM] = {{'t','e','s','t','e'},{'t','e','s','t','e'}};
int matriz2 [TAM][TAM] = {{'t','e','s','t','e'},{'t','e','s','t','e'}};

printf("As matrizes sao %d \n" , saoiguais(matriz1,5,matriz2,5));
}

Ups faltava a função main, adicionada a mesma.

Edited by thinkabout
Posted

Com a tua função não se pode comparar arrays de, por exemplo, 3 ou 42 elementos.

Hint: para que é o TAM, o dim1, e o dim2?

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!

Posted (edited)

Tive uma pequena ajuda no programa saoiguais, já aprendi uma nova função 😉

Mas estou a patinar agora em meter a informação em arrays de duas dimensões.

int saoiguais(char *matriz1, int dim1 , char *matriz2, int dim2)
{
 return memcmp(matriz1, matriz2, sizeof(char) * dim1) == 0;
}

int main()
{		
char matriz1 [caracteres] ;
char matriz2 [caracteres] ;
fgets(matriz1,caracteres,stdin);
fgets(matriz2,caracteres,stdin);
printf("As matrizes sao %d \n" , saoiguais(matriz1,caracteres,matriz2,caracteres));
}
Edited by thinkabout
Posted (edited)

Já me compara bem matrizes de duas dimensões

Contudo o compilador continua-me com este warnings.

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

warning C4024: 'saoiguais' : different types for formal and actual parameter 1

warning C4024: 'saoiguais' : different types for formal and actual parameter 3

int saoiguais(int *matriz1, int dim1 , int *matriz2, int dim2)
{
 return dim1 == dim2 && memcmp(matriz1, matriz2, sizeof(int) * dim1*TAM) == 0;
}


int main()
{         

int matriz1 [TAM][TAM] = {{1},{2}} ;
int matriz2 [TAM][TAM] = {{1},{2}} ;


printf("As matrizes sao %d \n" , saoiguais(matriz1,TAM ,matriz2,TAM));
}
Edited by thinkabout
Posted

O primeiro elemento de matriz1 é um array de TAM ints.

Um ponteiro para esse elemento tem o tipo int (*)[TAM]. É este tipo que estás a usar ao chamar a função. Mas a função está definido como recebendo um valor de tipo int *. Como estes tipos não são compativeis, o compilador, muito correctamente, queixa-se.

Solução: defini a função como recebendo um valor do tipo correcto:

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

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!

Posted (edited)

O primeiro elemento de matriz1 é um array de TAM ints.

Um ponteiro para esse elemento tem o tipo int (*)[TAM]. É este tipo que estás a usar ao chamar a função. Mas a função está definido como recebendo um valor de tipo int *. Como estes tipos não são compativeis, o compilador, muito correctamente, queixa-se.

Solução: defini a função como recebendo um valor do tipo correcto:

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

Eu já tinha andado perto disso mas estava a fazer

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

sem os ( ) no *.

Depois pensei como as posições do array são guardadas de forma continua na memoria que bastava apontar para o índice [0][0], ou seja o começo do array bidimensional. .

Da tua forma ele já se parou de queixar 👍

Edited by thinkabout
Posted

sem os ( ) no *

Ah! Pois! Há muita gente que faz o mesmo erro (eu incluido quando não presto a atenção suficiente).

Para me ajudar a escrever com a sintaxe certa, eu traduzo para português o tipo em causa:

... int *nome[10] ... /* nome é um array de ponteiros */
... int (*nome)[10] ... /* nome é um ponteiro para array */

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.