Jump to content
Fórum Script Brasil
  • 0

Problema com retorno de Array Bidimensional


Douglas Mendes Barreto

Question

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

Edited by Douglas Mendes Barreto
Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...