thinkabout 0 Posted March 29, 2013 Report Share Posted March 29, 2013 (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 March 29, 2013 by thinkabout Link to post Share on other sites
pmg 85 Posted March 29, 2013 Report Share Posted March 29, 2013 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! Link to post Share on other sites
thinkabout 0 Posted March 29, 2013 Author Report Share Posted March 29, 2013 (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 March 29, 2013 by thinkabout Link to post Share on other sites
thinkabout 0 Posted March 30, 2013 Author Report Share Posted March 30, 2013 (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 March 30, 2013 by thinkabout Link to post Share on other sites
pmg 85 Posted March 30, 2013 Report Share Posted March 30, 2013 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); 1 Report 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! Link to post Share on other sites
thinkabout 0 Posted March 30, 2013 Author Report Share Posted March 30, 2013 (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 March 30, 2013 by thinkabout Link to post Share on other sites
pmg 85 Posted March 30, 2013 Report Share Posted March 30, 2013 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! Link to post Share on other sites
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