Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com retorno de Array Bidimensional


Douglas Mendes Barreto

Pergunta

Salve galera!

Seguinte estou tentando problemas com ao tentar retornar um array Bidimensional de uma função e recebelo em outro lugar. Eu já tenho ele montado em um lugar e não estou conseguindo retornar o mesmo para a minha classe principal segue abaixo o codigo <_<

Como estou tentando pegar

Scenery env;
 char **arrayScenery;
 arrayScenere = env.buildEnvironment();
char** Scenery::buildEnvironment(){

    char environment[10][10] = {
    {'1','1','1','1','1','1','1','1','1','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'}
    };

    return **environment;
    
}

Estou inciando agora em c++, mas realmente ele me pegou de calça curta com relação a arrays :closedeyes: ;

alguém pode me ajudar? PLEASE!!

Abraço a todos

Editado por Douglas Mendes Barreto
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

O teu código tem 2 problemas.

O primeiro é o problema de compilação que se resolve simplesmente convertendo o valor da retorno da tua função (eu tentei aqui e consegui compilar).

char** buildEnvironment(){

    char environment[10][10] = {
    {'1','1','1','1','1','1','1','1','1','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'},
    {'1','0','0','0','0','0','0','0','0','1'}
    };

    //return environment;
    return (char**)environment;

}
Mas isso gera um problema de alocação de memória. Quando tu declara um char variavel[10] (vou usar uma única dimensão para ser mais fácil de explicar), tu está alocando 11 coisas. O primeiro é todas as 10 posições estáticas na memória. O segundo é o ponteiro estático que aponta para essas posições. O ponteiro possui um valor de posição na memória. O problema é que é tudo ESTÁTICO, ou seja: Quando a tua função morrer (ser desalocada da memória) a tua memória vai junto. Por isso ele dava erro de retorno que não se pode retornar um ponteiro estático como dinâmico. A não ser que tu force a conversão de valor. Fonçando a conversão de valor eu retornei a posição do primeiro valor na minha matriz (valor [0] [0]) que não existe mais porque era estático e foi desalocado da memória. Quando eu tentei usa-lo tentando escrever na tela.
char **arrayCenary=buildEnvironment();
    
    for(unsigned int i=0u;i<10u;i++){
        for(unsigned int j=0u;j<10u;j++){
            //
            printf("\n%u %u %c"
                    ,i
                    ,j
                    ,arrayCenary[i][j]
                    );
        }
    }
A compilação deu certo mas ao executar o programa veio a morte do mesmo. O sistema operacional retornou a mensagem de: Esse programa executou uma operação ilegal e será fechado. A operação ilegal foi de buscar um valor na memória que não fosse correspondente a mim. Então ele me barrou. A tua função de criação do cenário precisa aloca-lo dinâmicamente (usando new ou malloc), atribuir os valores e retornar o mesmo. Por ser dinâmico ele não morre junto com a função. No final do teu programa tu precisa dar o delete arrayCenary. Eu vou lhe ajudar com a alocação de desalocação. Vou usar new e delete porque é mais fácil. Primeiro a tua função aloca:
char** buildEnvironment(){
    //primeiro aloca as colunas.
    char** environment=new char*[10u];
    //depois aloca-se as linhas
    for(unsigned int i=0u;i<10u;i++){
        //
        environment[i] = new char[10];
    }

    //aqui de alguma maneira tu precisa setar os valores. Eu não conheço uma mameira mais fácil de seta-los sem ser environment[0][0] = '1'
    //linha por linha. E por serem muitos valores eu não vou fazer nada

    //depois retorna a matrix alocada dinamicamente
    return environment;

}
E depois da usa-la tu desaloca
char **arrayCenary=buildEnvironment();

    //Para desalocar os valores da memoria é só fazer o inverso.
    if(arrayCenary){
        for(unsigned int i=0;i<10u;i++){
            //
            if(arrayCenary[i])
                delete arrayCenary[i];
            arrayCenary[i]=NULL;
        }
        //no final ele deleta as colunas
        delete arrayCenary;
    }
    arrayCenary=NULL;

Espero te-lo ajudado. Um abraço.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...