jonsmau Posted December 3, 2007 at 07:17 PM Report Share #152044 Posted December 3, 2007 at 07:17 PM 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 More sharing options...
Rui Carlos Posted December 3, 2007 at 08:00 PM Report Share #152061 Posted December 3, 2007 at 08:00 PM 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. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
jonsmau Posted December 3, 2007 at 11:32 PM Author Report Share #152132 Posted December 3, 2007 at 11:32 PM 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 ... Link to comment Share on other sites More sharing options...
jonsmau Posted December 3, 2007 at 11:34 PM Author Report Share #152135 Posted December 3, 2007 at 11:34 PM obrigado! Link to comment Share on other sites More sharing options...
Jeronimus Linuxius Posted February 5, 2008 at 07:13 PM Report Share #164669 Posted February 5, 2008 at 07:13 PM 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 More sharing options...
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