[c] - Passagem de uma matriz como argumento

jonsmau

Membro
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 ??

:sad:

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)
 
humm.

Ao chamares a função indica o endereço da tabela: f_usatabela(&tabela);
Senão ele vai criar uma "cópia" da tua variável (neste caso um array bidimensional ).

Para variáveis simples (sem ser arrays) funciona assim, mas como já nao pego em C ha muito tempo não tenho a certeza. No entanto tenta.

Cumprimentos
 
main(){
char tabela[3][3];

f_usatabela(&tabela[0][0]);
}


f_usatabela(char *tabela){

tabela[x][y]=z <==== Nao me deixa usar a tabela c\ as especificacoes de linha e coluna

}

===================> So deixa usar *tabela=z, ou tabel[x]=z



Mas queria poder operar na f_usatabela da forma normal de funcionar com uma tabela x[linha][coluna] .....


(obrigado - cumprimentos)
 
humm. Talvez porque na tua função estejas a receber uma cadeia de caracteres (char*)

tenta isto:

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

Cumps
 
f_usatabela(char **tabela){
// bla bla bla
}


basicamente o k tu tens, é um array de arrays, como tal pointers para pointers :D
C é fixe não é?! :P
 
main(){
char tabela[3][3];

f_usatabela(&tabela[0][0]);
}


f_usatabela(char *tabela){

tabela[x][y]=z <==== Nao me deixa usar a tabela c\ as especificacoes de linha e coluna

}

===================> So deixa usar *tabela=z, ou tabel[x]=z



Mas queria poder operar na f_usatabela da forma normal de funcionar com uma tabela x[linha][coluna] .....


(obrigado - cumprimentos)

em vez de tabela[x][y]=z, não será antes *tabela[x][y]=z?
 
Para tabela[x][y]

tabela é &tabela[0][0]

ou seja..é do tipo char*

o problema penso k seja ao declarares f_usatabela(char *tabela) o compilador não advinha que tabela é um array multi dimensional, e por isso queixa-se por usares tabela[x][y]...

Portanto a minha solução é mesmo f_usatabela(char tabela[MAX_LINHAS][MAX_COLUNAS])

declaras max_linhas e max_colunas como macros pa teres o minimo de flexibilidade...

char **tabela não fax sentido...

e não é preciso por f_usatabela(&tabela);
f_usatabela(tabela); chega pois já é o apontador.

Espero ter sido util...E espero que esteja certo...
 
Para tabela[x][y]

tabela é &tabela[0][0]

ou seja..é do tipo char*

o problema penso k seja ao declarares f_usatabela(char *tabela) o compilador não advinha que tabela é um array multi dimensional, e por isso queixa-se por usares tabela[x][y]...

Portanto a minha solução é mesmo f_usatabela(char tabela[MAX_LINHAS][MAX_COLUNAS])

declaras max_linhas e max_colunas como macros pa teres o minimo de flexibilidade...

char **tabela não fax sentido...

e não é preciso por f_usatabela(&tabela);
f_usatabela(tabela); chega pois já é o apontador.

Espero ter sido util...E espero que esteja certo...

Em vez de MAX_LINHAS e MAX_COLUNAS, pode-se e deve-se passar o tamanho(ie, o numero de linhas e colunas) por parametro.
Fica mais chique :berlusca:
 
Good_in_bed

"char **tabela não fax sentido..."
pois já tinha chegado ai mas estava a tentar perceber onde os outros utilisadores queriam chegar, a lado nenhum pq uma tabela (declarada desta forma) nao sao apontadores, sao valores seguidos de uma certa forma na memoria, usa-se apontadores ou [l] ou [l][c], apenas para chegar à posicao pretendida.



"e não é preciso por f_usatabela(&tabela);
f_usatabela(tabela); chega pois já é o apontador."
Lá esta!!
Mas o compilador esta-se a queixar disso, dai usar mesmo o &tabela[0][0].




Mas penso que se enviar o endereco do comeco da tabela na memoria para uma funcao, nessa funcao ao dizer apontador[1][2], a maquina devia perceber q queria chegar a *(apontador+5)
....


Sinceramente nunca me tinha deparado com isto...
Nao queria chamar f_usatabela passasno-lhe como argumento os valores da tabela, mas sim o apontador para [0][0], para a poder alterar ....

Hep!!


Talves o melhor n seria melhor transformar uma tabela em linha e operar assim ?


:003:
vou fumar 1 cigarro ...
 
Em vez de MAX_LINHAS e MAX_COLUNAS, pode-se e deve-se passar o tamanho(ie, o numero de linhas e colunas) por parametro.
Fica mais chique :berlusca:

é chique, mas se depois te lembras que em vez de 100 linhas, queres 1000, vais ter que percorrer o código todo e mudar em todos os sitios, se usares um macro, um bocadinho mais fácil não?


jonsmau, é igual usares &tabela[0][0] ou tabela, ambos são apontadores para o endereço da primeira posição do array.

Eu não tenho a certeza se o problema é o compilador se confundir com o char *tabela e o tabela[x][y], mas é o que penso.

Dai..Se usares f_usatabela(char coisa[3][3]), tu estás a especificar melhor o que ele vai receber...e depois dentro da função podes usar como te apetecer, e alterar, k ele altera a tabela original...

Não sei se me estás a entender...vou passar aqui um código teste que eu fiz pa tentar ser mais explicito

Código:
#include <stdio.h>
#include <stdlib.h>

#define MAX_LINHAS 3 /*eu sei que para este exemplo é um pouco ridiculo, mas para programas mais complexos...ajuda */
#define MAX_COLUNAS 3

void usaTabela(char tabela[MAX_LINHAS][MAX_COLUNAS]);

int main(void) {
char tabela[MAX_LINHAS][MAX_COLUNAS];
int i,j;
for(i=0;i<MAX_LINHAS;i++) /*inicializar array a "0" */
    for(j=0;j<MAX_COLUNAS;j++)
        tabela[i][j]='0';
usaTabela(tabela);
printf("%c",tabela[0][1]);
    return EXIT_SUCCESS;
}

void usaTabela(char tabela[MAX_LINHAS][MAX_COLUNAS]) {
    tabela[0][1]='a'; /*altera este valor como teste*/
}
Espero ter ajudado, e agradecia que alguém confirma-se ou não aquilo da minha teoria da confusão do compilador!;)
 
Última edição:
Epah tanto podes usar char **tabela como char tabela[][COLUNAS] porque tabela não deixa de ser um conjunto de apontadores...
Testei aqui e funciona perfeitamente, apenas julgo que para tridimensional ou qadri não podes ir pelos apontadores, tens de ir mesmo pela declaração do tamanho máximo...
cumpzz
 
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 ??

:sad:

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)


Em vez de usares uma matriz usa antes um array de apontadores para caracteres. Em vez de

char tabela[3][3]

deverias por

char* tabela[3]

No momento de fazer a passagem para a função ficaria

void f_usatabela (char* tabela[] )

Assim, em vez de teres uma sequência de RAM com os teus caracteres, terias uma sequencia de 3 "casas" da RAM com informações da memória onde estão as tuas strings (apontadores). Desta forma estás a tornar o teu computador bem mais limpo e eficiente.

Dentro da função, para acederes, por exemplo, à string apontado pelo apontador da 2.ª fila, terias

cout << tabela[1]; //não precisa de ser *tabela[1], pois quando se passa o array como argumento já se está a fazer a desferência.


Vá, cumps.:)
 
Back
Topo