thinkabout Posted March 29, 2013 at 06:56 PM Report #500848 Posted March 29, 2013 at 06:56 PM (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 at 07:13 PM by thinkabout
pmg Posted March 29, 2013 at 07:17 PM Report #500849 Posted March 29, 2013 at 07:17 PM 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!
thinkabout Posted March 29, 2013 at 11:51 PM Author Report #500888 Posted March 29, 2013 at 11:51 PM (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 at 11:56 PM by thinkabout
thinkabout Posted March 30, 2013 at 02:10 AM Author Report #500895 Posted March 30, 2013 at 02:10 AM (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 at 02:13 AM by thinkabout
pmg Posted March 30, 2013 at 10:22 AM Report #500907 Posted March 30, 2013 at 10:22 AM 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!
thinkabout Posted March 30, 2013 at 11:43 AM Author Report #500914 Posted March 30, 2013 at 11:43 AM (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 at 11:45 AM by thinkabout
pmg Posted March 30, 2013 at 11:56 AM Report #500918 Posted March 30, 2013 at 11:56 AM 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!
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