• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

jonsmau

[c] funcao q tem como argumento uma matriz

5 mensagens neste tópico

Boas.

Pretendo fazer uma função que receba como argumento uma matriz.

Matriz:

char tabela[3][3];

Chamada da funcao:

f_usatabela(tabela);

definicao da funcao:

void f_usatabela(char *tabela);

------------------------------------------------------

Fazendo passar o endereco da matriz (da posicao 0,0), e na funcao 'f_usatabela' efectuar alteraçoes nessa tabela não se pode efectuar desta forma ??

Não estou a conseguir fazer a passagem do endereço da tabela como argumento.

Nem operar com a tabela na funcao 'f_usatabela', da seguinte forma: tabela[l][c]=z;

Alguem me pode dar umas luzes?

(não prentendo passar a tabela por valores mas sim por apontador e modificar essa mesma tabela numa funcao do tipo void)

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com array de duas (ou mais) dimensões penso que não podes fazer isso. Muda a assinatura para void f_usatabela(char tabela[3][3]);.

Isto porque é necessário saber pelo menos o número de colunas para calcular a posição de um elemento em memória. A alternativa tratar o array como unidimensional e fazer a conversão das posições à mão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois ...

sem saber o nº de colunas, nao sei a q posicao [1][0] pertence ...

vou optar por passar a tabela por valores:

f_usatabela(tabela);

void f_usatabela(tabela[3][3]);

embora use um pouco mais de memoria ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vou optar por passar a tabela por valores:

(...)

embora use um pouco mais de memoria ...

Deixa lá isso que eu explico-te!

Pretendo fazer uma função que receba como argumento uma matriz.

(...)

Não estou a conseguir fazer a passagem do endereço da tabela como argumento.

Nem operar com a tabela na funcao 'f_usatabela', da seguinte forma: tabela[l][c]=z;

Sim, ele deve-te dar pointer type mismatch...

Alguem me pode dar umas luzes?

Sim senhor.

Nota bem. Uma matriz é uma array de arrays:

typedef int intarray[4];                  //o tipo intarray é uma array de 4 ints
typedef intarray intmatrix[3];        //o tipo intmatrix é uma array de 3 intarrays

Isto é: o tipo intmatrix é uma array de 3 arrays de 4 ints (cada uma).

Ou: o tipo intmatrix é uma matriz de ints de 3 linhas por 4 colunas.

Agora, equivalência entre arrays e apontadores. Uma array NÃO é um apontador. No entanto, uma referência a um símbolo que foi declarado como array avalia como se fosse um apontador para primeiro elemento. ou seja:

int myvector[3];
int *mypointer = myvector;

if ( mypointer == myvector )
    printf("Isto vai aparecer no ecrã.\n");

Nota que a compilação não vai dar qualquer warning. Myvector comporta-se, quando numa expressão sem efeitos laterais, exactamente da mesma maneira que mypointer.

Por isso é que as funções que recebem cadeias de caracteres as recebem como char *something (porque, ao ser chamada a função, aquele argumento deve ser um apntador para o primeiro caracter da cadeia passada como argumento). É claro que poderiamos pôr:

int funcao_hipotetica ( char argumento[] );

Que é açúcar sintáctico para:

int funcao_hipotetica ( char *argumento );

(mas acho que, na primeira versão, não podemos mudar para a qual o "apontador" aponta)

Agora, lembras-te que:

char tabela[3][3];

Declara o símbolo "tabela" como sendo uma array de 3 "arrays de 3 chars".

Ao fazeres tabela [1], ele vai escolher o elemento de índice 1 da array. Esse elemento é uma array.

Se fazes tabela [1][2], após chegar a essa array, ele vai à procura do char de índice 2.

Portanto, a função vai precisar de aceder a uma array de arrays como tal. Como em C as arrays avaliam como ponteiros para o primeiro elemento, e os elementos da nossa array são "arrays de 3 ints", o que vais ter de passar à função é um "apontador para uma array de três chars".

Confundido? Um "apontador para uma array de três chars" não é a mesma coisa que um apontador para o primeiro elemento da dita array. Porquê? Porque o tipo do objecto apontado não é o mesmo (e em C um apontador que aponta para um tipo "type" tem de ser declarada como tal, ou então vai funcionar mal; e isto funciona para tipos agregados também).

Agora, o sumo. xD

Como é se declara um apontador para uma array? Precisas de fazer um override ao sistema de precedências, com parêntecis.

char *tabela[3];           //ERRADO! Isto é uma array de apontadores para char,
                           // pois [] é avaliado antes de "*"...
char (*tabela)[3];         //Esta está certa. O sistema de tipos avalia primeiro
                           // o operador "*", que diz que é um apontador, e depois
                           // continua a avaliar a declaração e descobre que o objecto
                           // apontado é uma array. De quê? De chars.

Ilucidado?

Podia ter dado só a resposta, mas eu acho que o assunto é importante demais para ser descartado. Além disso, há muita confusão à volta deste assunto.

JJ

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora