1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[c] - Passagem de uma matriz como argumento

Discussão em 'Programação' iniciada por jonsmau, 3 de Dezembro de 2007. (Respostas: 12; Visualizações: 4828)

  1. 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)
     
  2. cmmr

    cmmr [email protected] Member

    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
     
  3. 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)
     
  4. cmmr

    cmmr [email protected] Member

    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
     
  5. r3pek

    r3pek Power Member

    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
     
  6. jahred

    jahred Power Member

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

    good_in_bed Power Member

    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...
     
  8. MadOnion

    MadOnion Folding Member

    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:
     
  9. 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 ...
     
  10. nao acertei no que disse.
    desculpem!

    vou tentar resolver ...
     
  11. good_in_bed

    good_in_bed Power Member

    é 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: 4 de Dezembro de 2007
  12. Tyran

    Tyran Power Member

    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
     
  13. mj2p

    mj2p I'm Cool Cuz I Fold


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

Partilhar esta Página