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

[C++] Array 2D adimensional

Discussão em 'Programação' iniciada por nyd, 2 de Novembro de 2007. (Respostas: 7; Visualizações: 3541)

  1. nyd

    nyd Power Member

    Viva!

    Pessoal quero implementar um array de duas dimensões sem dimensão fixa por forma a ler o conteudo de um ficheiro, a questão é que simplesmente penso que nao haja uma forma "simples" de fazer o que pretendo.

    Não existe nada parecido com -> int *teste=new int[] para 2D ?
     
  2. AliFromCairo

    AliFromCairo Power Member

    Boas, tens várias abordagens possíveis para resolver o problema. Segue um exemplo "à la C":

    Código:
    // aloca memória para n ponteiros
    int **matriz = new int*[n];
    for (int i = 0; i < n; i++) {
        // m colunas
        matriz[i] = new int[m];
    }
    // a partir daqui, podes manipular a matriz através de matriz[i][j]
    
    Outra abordagem possível que é bastante mais elegante, mas não tão simples de impmentar é criares uma classe template usando por exemplo, um std::vector de std::vector (i.e. std::vector<std::vector<T>). Devem existir bastantes classes semelhantes pela Web.

    Espero que ajude.
     
    Última edição: 2 de Novembro de 2007
  3. Consu

    Consu Power Member

    Convém só referir duas coisas:

    1 - O operador new é C++. :p

    2 - Quando fazes alocação dinâmica de memória convém libertá-la. Neste caso usa delete[] para cada int[].

    A alternativa mais simples é sempre definir limites, mas quando estes não existem o normal é a alocação dinâmica, ou o uso de estruturas que o façam automaticamente.
    Como já foi referido, ou usas vectores ou alocas espaço da maneira referida.
     
  4. AliFromCairo

    AliFromCairo Power Member

    Sim, quando eu referi "à la C" era para salientar que o método que ia descrever é mais comum em C do que em C++. A grande diferença é mesmo a função malloc (ou semelhante) vs. operador new.

    Quanto à libertação, tens toda a razão e é importante salientar isso. Também falta ali um bloco try catch, de modo a garantir que não há memory leaks quando uma excepção é lançada. No entanto, achei por bem não complicar muito o exemplo :P.
     
  5. Consu

    Consu Power Member

    Eu percebi a ideia, só referi para quem não estiver tão dentro do assunto não ter surpresas. Já agora o equivalente do delete de C++ é o free() em C.
    Quanto ao try é compreensível que não tenhas referido para evitar confusão, eu também não o faria. ;)
     
  6. greatbunzinni

    greatbunzinni Power Member

    using namespace std;
    vector< vector<int> > matriz;
     
  7. nyd

    nyd Power Member


    Obrigado pelas respostas.


    No codigo que tu referes o problema da dimensão mantem-se visto que tenho de inicializar o n, ou seja continuo a manter fixo a dimensão da matriz.


    Abraço
     
  8. scriptKid

    scriptKid Power Member

    O greatbunzinni já deu a resposta ao teu problema. Usando

    podes ter uma "matriz" de dimensão variável.
     

Partilhar esta Página