Jump to content
thinkabout

[Resolvido] Comparar Matrizes duas dimensões - Ponteiros

Recommended Posts

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.

Edited by thinkabout

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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));
}

Edited by thinkabout

Share this post


Link to post
Share on other 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));
}

Edited by thinkabout

Share this post


Link to post
Share on other 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);

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

Share this post


Link to post
Share on other 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:

Edited by thinkabout

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.