Ir ao conteúdo
  • Cadastre-se

Matrizes por parãmetros em c++


Visitante

Posts recomendados

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!

Link para o comentário
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.

Link para o comentário
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.

Link para o comentário
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? :) ]

Link para o comentário
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 ...

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
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.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...