Por que o GtkCalendar conta meses a partir de 0?

2

Então passei várias horas em fúria, tentando descobrir por que meu código não está gravando no /sys/class/rtc/rtc0/wakealarm corretamente. O problema é que ele não retorna nada se o valor estiver errado. E finalmente eu notei isso pequeno

5

entre o ano e o dia. Por que não está contando dias e anos a partir do zero para consistência?

Para fins de comparação: QCalendarWidget conta mês de 1 a 12 ( docs )

    
por int_ua 27.06.2012 / 03:36

2 respostas

1

É toda a discussão inclusiva ou exclusiva Eles provavelmente usaram o sistema para contar quantos meses passaram.

Por exemplo, se você disser que 1 mês se passou, você estaria no segundo mês do ano. Portanto, se você precisar de um programa para contar quantos meses passar, e estiver usando o sistema de 1-12, ele relatará que você está no mês 1 (janeiro) e não que 0 (janeiro) meses se passaram e precisaria ser pré-formada uma função extra para determinar quanto tempo passou.

Assim como no quebra-cabeça do pensamento em Chrono Trigger, link , dependendo de como você conta , se contar desde o início ou se contar quando terminar, pode ser incrivelmente enganoso.

Então, para codificar, é mais fácil começar do zero. No diagrama, você conta como três, mas na primeira, soma apenas 2 ciclos completos (meses) e, no segundo, conta até 3, mas começa com 0. até 3 meses completos.

Também é assim que todos contam quantos anos têm em anos, você começa com 0 e vai para 1 uma vez por ano.

Por que eles também não fizeram isso por dias e anos. Eu imagino que a contagem é separada por dias por causa do número variável de dias que estão em um mês, isso também tornaria difícil contar quantos meses se passaram Se você estiver indo pelo número de dias. e você pode obter uma contagem precisa de um ano se contar quantos meses passa, ou seja, se contar os meses com precisão, pode contar anos com precisão, há 12 meses completos em um ano, começar a contar em 0 e uma vez acertar 12 você volta para 0, então os números seriam 10 11 0 1 2 3 ... como na imagem abaixo, se você contar até 2, então reinicie -

De qualquer forma, em poucas palavras, os programadores fizeram o que era mais fácil para eles.

    
por Mateo 27.06.2012 / 06:37
2

Doc para o GtkCalendar: link

Explicação geral para zero:

O uso de zero para iniciar a contagem é, na verdade, um truque de otimização dos programadores do Assembly. Em vez de atribuir 1 ao registrador de contagem, eles registraram o registrador em XOR, o que foi um pouco mais rápido nos ciclos da CPU. Isso significava que a contagem começaria com 0 e seria sempre o comprimento dos elementos, excluindo o último.

Além disso, o uso de zero também é popular com aritmética de ponteiro, onde você usaria um ponteiro base apontando para alguma memória alocada, além de um segundo ponteiro que estaria em um deslocamento a partir desse ponteiro base. Aqui, usar o valor zero faz muito sentido apontar o deslocamento para a base do bloco de memória. (A lógica geral da matriz tende a ser o endereço base mais o tamanho do registro offset x).

E números de mês com base zero? Muitas vezes, muitos ambientes de programação calculam os dados como um número de dias desde alguns dados padrão. 31 de dezembro de 1899 é uma data popular, embora tenha havido muitas outras datas usadas como data-base. Todas as outras datas são compensadas a partir dessa base e serão armazenadas como um único número. Frações seriam usadas para indicar horas, minutos e segundos, onde 0,25 seria 24/4 = 6 horas. Assim, para transformar uma data em uma data real, tudo o que o ambiente precisa fazer é transformar esse número em uma data real.

No entanto, a combinação de matrizes baseadas em zero e valores de mês baseados em 1 traz um problema. Para obter o nome do mês do mês 9, você teria que obter o item 8 da matriz do mês. Alguns desenvolvedores ficariam felizes em diminuir o número do mês antes de obter seu nome. Outros preferiram mudar o mês para algo com base zero, já que as pessoas só querem saber o nome, não o número. É uma visão pessoal.

Além disso, há mais do que uma razão pela qual alguém poderia pensar que há algo errado com Data / Calendário:

  • Bases surpreendentes (1900 como a base do ano em Data, reconhecidamente para construtores depreciados; 0 como a base mensal em ambos)
  • Mutabilidade - o uso de tipos imutáveis simplifica muito o trabalho com valores realmente efetivos
  • Um conjunto insuficiente de tipos: é bom ter Data e Calendário como coisas diferentes, mas a separação de valores "locais" vs "zoneados" está ausente, como data / hora vs data x hora
  • Uma API que leva a códigos feios com constantes mágicas, em vez de métodos claramente nomeados
  • Uma API muito difícil de avaliar - todos os negócios sobre quando as coisas são recalculadas, etc.
  • O uso de construtores sem parâmetros para usar o padrão "now", o que leva a um código difícil de testar
por jasmines 27.06.2012 / 06:35