Joao brandao Posted May 5, 2012 at 11:00 AM Report #453257 Posted May 5, 2012 at 11:00 AM Boas, estava aqui a aprender um bocadinho de recursividade e fiquei com a seguinte duvida: - Como é que eu passo uma matriz para uma funçao que eu proprio chamei? #include <cstdlib> #include <iostream> using namespace std; [u]void process(int a,int b,int mat[100][100],int soma){[/u] int i,j; for(int i=1;i<=a;i++) { for(int j=1;j<=b;j++) { if(mat[i][j]==1) soma++; } } } int main() { int a,b,mat[100][100],soma=0; cin>>a; cin>>b; for(int i=1;i<=a;i++) { for(int j=1;j<=b;j++) { cin>>mat[i][j]; } } [u]process(a,b,mat[][]);[/u] cout<<soma<<endl; system("pause"); return 0; } nao estou a consiguir enviar a matriz para a funçao em cima, alguem me pode dar uma ajudinha?
skiller10 Posted May 5, 2012 at 11:02 AM Report #453258 Posted May 5, 2012 at 11:02 AM Na chamada da função, em vez de "mat[][]", mete apenas "mat" e já deve funcionar 😉 "Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."
Joao brandao Posted May 5, 2012 at 11:39 AM Author Report #453263 Posted May 5, 2012 at 11:39 AM nao da :-S
skiller10 Posted May 5, 2012 at 12:49 PM Report #453269 Posted May 5, 2012 at 12:49 PM Estive a testar e funciona, o problema é que tens outros erros. No cabeçalho da função tens 4 argumentos e apenas passas 3 (falta a soma). As posições num array começam em 0 e vai até T-1 (onde T representa o tamanho do array). Só mais uma coisa, o que estás a enviar à função é uma cópia da variável soma, ou seja, ao alterares o valor da variável na função, não irá alterar o valor da variável no main, tens várias hipoteses para corrigir isso: - Colocas função a retornar um valor inteiro que será o valor da soma. - Usas variáveis globais. - Se souberes usar ponteiros podes passar a variável por referência. "Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."
pmg Posted May 5, 2012 at 01:04 PM Report #453271 Posted May 5, 2012 at 01:04 PM (edited) A maneira mais cómoda (em C) é passares o teu array bidimensional como se fosse um array normal sem esquecer de passar os valores das dimensoes. Dentro da função fazes o cálculo explicito para indexamento em vez de ser o compilador a faze-lo. Por exemplo (código C NAO TESTADO, não sei C++) /* CODIGO NAO TESTADO */ /* apaguei parametros repetidos (thanks Hippo) */ int process(int *mat, size_t cols, size_t rows) { int soma = 0; size_t row, col; for (row = 0; row < rows; row++) { int index = row * cols; for (col = 0; col < cols; col++) { if (mat[index + col] == 1) soma++; } } return soma; } int main() { int a, b, mat[100][100], soma; /* ... */ soma = process(a, b, &mat[0][0]); /* ... */ Edited May 14, 2012 at 09:48 AM by pmg 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!
Joao brandao Posted May 5, 2012 at 01:07 PM Author Report #453272 Posted May 5, 2012 at 01:07 PM obrigado pela ajuda.
HappyHippyHippo Posted May 5, 2012 at 01:59 PM Report #453279 Posted May 5, 2012 at 01:59 PM A maneira mais cómoda (em C) é passares o teu array bidimensional como se fosse um array normal sem esquecer de passar os valores das dimensoes. Dentro da função fazes o cálculo explicito para indexamento em vez de ser o compilador a faze-lo. Por exemplo (código C NAO TESTADO, não sei C++) /* CODIGO NAO TESTADO */ int process(size_t cols, size_t rows, int *mat, size_t cols, size_t rows) { int soma = 0; size_t row, col; for (row = 0; row < rows; row++) { int index = row * cols; for (col = 0; col < cols; col++) { if (mat[index + col] == 1) soma++; } } return soma; } int main() { int a, b, mat[100][100], soma; /* ... */ soma = process(a, b, &mat[0][0]); /* ... */ tens os argumentos repetidos 😉 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted May 5, 2012 at 05:34 PM Report #453309 Posted May 5, 2012 at 05:34 PM tens os argumentos repetidos 😄 Oops, é o que dá tentar manter o código original, depois pensar que afinal é melhor postar da maneira mais correcta ... e alterar sem prestar atenção. Thanks Hippo 🙂 Código alterado. 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