Ir para o conteúdo
thinkabout

[Resolvido] Comparar Matrizes duas dimensões - Ponteiros

Mensagens Recomendadas

thinkabout

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.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

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

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

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

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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

  • Voto 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

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 :thumbsup:

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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!

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.