Jump to content

[c] funcao q tem como argumento uma matriz


jonsmau

Recommended Posts

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)

🙂

Link to comment
Share on other 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.

Link to comment
Share on other sites

  • 2 months later...
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

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.