• Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   13-02-2016

      Prezados membros do Clube do Hardware,

      Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:
        Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas ao formulário abaixo:    Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Seguidores 0
Guest arnaldo.ribeirojunior

Matrizes por parãmetros em c++

7 posts neste tópico

Fala, All

Estou com um pequeno problema ...

Dou aulas de C/C++ e sempre achei que manjava tudo desta linguagem, mas um aluno me apareceu com uma dúvida que me deixou de "calças curtas" ...

Como faço para passar uma matriz como parâmetro para uma função???

Procurei em todos os meus livros e todos os exemplos são com vetores (o que funciona muito bem...) mas quando eu tenho matrizes, acabo caindo em um problema de "invalid indirection" ...

Ahhh ... importante, não podem ser usados ponteiros, porque ponteiros é o próximo capítulo ... :)

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok... tipo... dá uma olhada no seguinte código:

====================


void foo( int matriz[4][7] ) { /* declara uma matriz 4x7 */

   int i, j;

   for (i=0; i<4; i++)
       for (j=0; j<7; j++)
           /* percorre a matriz dividindo os elementos por 2*/
           matriz [i][j] /= 2;
}

void main( void ) {

   int mes[4][7];

   foo( mes );

}

====================

A todos que querem se aprefeiçoar em C++, eu recomendo que leiam o The C++ Programming Language, do Bjarne Stroustrup (prá quem não sabe, ele é o criador do C++).

E em http://run.to/noicys tem também ótimas informações sobre C/C++. Confiram.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não consegui testar seu código, mas a ideia era que a função não ficasse "amarrada" a um tamanho de matriz.

Por exemplo ...

Se na declaração da sua função foo eu usar

void foo(int matriz[][])

simplesmente não funciona ...

Se você tiver mais alguma ideia, eu agradeço.

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja o seguinte programa (é ANSI C puro, prá DOS):


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char vetor[10], matriz[2][5];
   short i;

   printf("Enderecos do vetor:\n");
   for (i=0; i<10; i++)
       printf("Posicao [%u]: %lu\n", i, &vetor[i]);

   system("pause");

   printf("\nEnderecos da matriz:\n");
   for (i=0; i<10; i++)
       printf("Posicao [%ux%u]: %lu\n", i/5, i%5, &matriz[i/5][i%5]);

   system("pause");

   printf("\nEnderecos da matriz (acessando como um vetor):\n");
   for (i=0; i<10; i++)
       printf("Posicao [%ux%u]: %lu\n", 0, i, &matriz[0][i]);

   system("pause");

   return 0;
}

Vetores e matrizes são colcados em espaços contínuos de memória, ou seja, em blocos. A diferença entre eles, é o modo de acesso; o índice que vai entre os colchetes é usado para calcular o endereço do elemento desejado;

Veja esta figura:

http://www.danielko.kit.net/vetores_x_matrizes_1.gif

Onde os números 4000, 4001... são endereços (fictícios) de memória.

Ela demonstra como o compilador interpreta o valor do índice para calcular o endereço da posição do vetor. O exemplo demonstra a 5ª posição do vetor, vetor[4]. Para calcular a posição, o compilador precisa saber o tamanho de cada dado (neste caso, o tamanho do tipo 'char' é de 1 byte).

Agora o mesmo para uma matriz:

http://www.danielko.kit.net/vetores_x_matrizes_2.gif

Note que para calcular a posição das demais linhas 'i', é preciso, além do tamanho dos dados (1 byte para 'char'), saber quantos elementos cabem em uma linha; este valor é indicado na declaração da matriz, é o valor 'n'.

Por isso que ao passar uma matriz por parâmetro para uma função é necessário fazer a declaração do tamanho da matriz, para o compilador saber como computar as posições corretamente.

Só a nível de curiosidade:

http://www.danielko.kit.net/vetores_x_matrizes_3.gif

Como no programa exemplo acima, é possível acessar todos os elementos da matriz como se fosse um vetor, já que não há checagem de limites, como no Pascal. Dessa forma sim, seria possível criar uma função que pudesse lidar com matrizes de tamanhos variados: acessando-a como se fosse um vetor; mas todo o trabalho automático de cálculo das coordenadas, que seria feito pelo compilador, teria que ser feito de forma 'braçal' mesmo.

Puxa, eu poderia escrever um capítulo inteiro de um livro falando sobre esses detalhes :) ; mas como não tô ganhando nada postando isso aqui no fórum, vô parando por aqui mesmo. :P

by Daniel-SENSEI   ;)

[ Fui eu que fiz essas ilustrações; se alguém usar elas, peço que deixe meu nome aí no canto da figura, ok? :) ]

Compartilhar este post


Link para o post
Compartilhar em outros sites

É na "mão" eu já sabia que dava prá fazer ... :)

O problema é que isso vai complicar a cabeças dos carinhas que estão aprendendo matrizes agora ...

Eu só precisava ter certeza de que não tinha um método. digamos assim, didático de se fazer isso ... ;)

De qualquer forma, valeu ...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado Originalmente por arnaldo.ribeirojunior@22 Mai. 2002, 10:35

É na "mão" eu já sabia que dava prá fazer ... :)

O problema é que isso vai complicar a cabeças dos carinhas que estão aprendendo matrizes agora ...

Eu só precisava ter certeza de que não tinha um método. digamos assim, didático de se fazer isso ... ;)

De qualquer forma, valeu ...

Em Delphi  você pode declarar:

TMatrix: Array of Array of Integer;

usando vetores dinâmicos, e depois passar ele nas funções.

Depois na função você pode descobrir o tamanho máximo usando funções com Lenght e High.

É complicado usar algo parecido em C++?

Só se você não quer usar vetores dinâmicos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom... até q poderia usar algo como


#include <vector>
...
vector<int>vetor;
...

e assim por diante, usando de forma dinâmica... mas não vejo como isso poderia ser menos complicado que manipular os vetores e matrizes do C.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!


Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.


Entrar agora
Entre para seguir isso  
Seguidores 0