Ir ao conteúdo

Posts recomendados

Postado

ACtC-3dyjIcKBxLnP6cENFjOD3wl-9ZlaW7loXFi

O meu apelo de ponteiro é por causa do desgosto por notação de vetores; O uso da variável static (int/char *) foi equivocado porque seu melhor sentido está em:

 

contador de dígitos (conta o número de chamadas para alocação dinâmica de string binário)

índice de bit significativo (percorre a string  enquanto número de chamadas na pilha diminui) 

 

No aguardo.

Postado
13 horas atrás, isrnick disse:

Aqui está minha melhor versão até agora, usando uma variável static para contar o número de bits, e usa o retorno do ponteiro para ir avançando pelo vetor para mover para a posição correta para colocar o respectivo caractere 0 ou 1 do bit, e usa a variável contadora para saber quando deve parar de avançar. E mais importante não tem ciclos de repetição percorrendo o vetor várias vezes e nem faz cópias, cada posição da string só é atribuída um caractere uma vez.

 

Muito bom! E desta vez funciona para 0. A que usava strcat() e a posterior retornariam '\0' para zero e não "0".

 

Eu rodei as funções em paralelo

 

Esse trecho novo foi legal 🥇 porque agora trata o zero

   else if (count == 0) {
        bin[0] = '0';
        bin[1] = '\0';
    }
    else {
        bin[count] = '\0';
    }
    return bin;

Esse trecho equivale a esse da função que eu postei

    if (val == 0)
    {   // pode ser ou nao a primeira vez
        if (bits == 0)
        {   // era 0 no inicio
            *p = '0';
            *(p + 1) = 0;
            return p;
        }
        else
        {   // acabaram os bits
            bits = 0; // reinicia porque pode chamar de novo
            return p;
        };  // if()
    };  // if()

Só que vem ao final e não no início do código, como efeito do que vou descrever mais abaixo

Por outro lado, se tirar esse trecho daquela função que escrevi e comparar com a que postou antes veja
 

vistaAB.thumb.png.4bf2940378b1861c005782cf0553314b.png


É quase a mesma coisa. A diferença é optar pela recursão no início ou no fim. O da direita usa recursão ao final. O da esquerda usa na entrada. O da esquerda usa a notação com colchetes, o da direita usa os endereços diretamente.

 

Aí tem um loop e função termina. No primeiro exemplo o if é maior porque a função retorna "0" para zero. O segundo exemplo retorna '\0' e pode ser considerado um problema.
 

Ao fazer a recursão no início a string é preenchida a partir da esquerda. Usando a recursão ao final ela é preenchida a a partir da direita
 

Veja os dois trechos
 

    for (int j = bits; j > 0; j = j - 1) *(p + j) = *(p + j - 1); // copia
    *p = '0' + (char)(val % 2); // '0' ou '1'
    *(p + bits + 1) = 0; // poe um '\0'
    bits = bits + 1; // a fila anda

    size_t i;
    for (i = 0; bin[i]; i++);
    bin[i] = (b & 1) ? '1' : '0';
    bin[i + 1] = '\0';

 Claro que para fazer algo assim simples assim os programas devem ser mesmo parecidos, mas esse último que @isrnick escreveu parece bem mais eficiente e elegante.

 

 

 

adicionado 10 minutos depois
35 minutos atrás, Mauro Britivaldo disse:

O meu apelo de ponteiro é por causa do desgosto por notação de vetores; O uso da variável static (int/char *) foi equivocado porque seu melhor sentido está em:

 

contador de dígitos (conta o número de chamadas para alocação dinâmica de string binário)

índice de bit significativo (percorre a string  enquanto número de chamadas na pilha diminui)

 

Não entendi o que quer dizer.

 

Talvez pudesse postar algum código. Pode ser interessante.
 

[
Não leve a mal meu comentário, @Mauro Britivaldo Não sou moderador desse forum nem nada, mas acho que escrever "...O uso da variável static (int/char *) foi equivocado porque seu melhor sentido está em..." mereceria uma explicação melhor para não parecer simplesmente grosseiro. Isso se a afirmação fizer sentido afinal.

 

E entenda que não é atributo desse código alocar memória. É mais seguro deixar o chamador passar o endereço de uma área alocada suposta com tamanho suficiente
]

  • Haha 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!