Problema com scanf e/ou printf de unsigned long long
Número de respostas: 19Fiz então o seguinte teste:
#include <stdio.h>
int main()
{
unsigned long long teste;
while ( scanf("%llu" ,&teste ))
printf ("%llu\n", teste);
return 0;
}
Para entradas maiores que o máximo do long unsigned, não está funcionando. Por exemplo, coloquei como entrada 18446744073709551615 e recebi como saída 4294967295. Procurando no google, achei que esse erro acontece no windows (...)
http://ascending.wordpress.com/2008/04/22/long-long-on-windows-dev-c-mingw/
Queria saber o que fazer, já que não sei qual ambiente será usado na correção e isso foge do meu controle. Devo usar unsigned long?
Obrigado.
Re: Problema com scanf e/ou printf de unsigned long long
Troque de sistema operacional! Brincadeira
Bom, eu (um caso raríssimo entre os alunos da computação) uso MS-Windows-XP (original). Não tenho conhecimento desse problema, mas caso você encontre qualquer problema com o ambiente que você estiver usando (Linux, MacOS, Windows etc), assuma o que for necessário para que seu programa funcione e DOCUMENTE isso de forma clara no seu código. Ex: "estou assumindo que os números da entrada são menores ou iguais a 2^64 - 1 porque tive problemas com leitura de unsigned long long no windows ...". Não esqueça que após ler a entrada com sucesso, seu programa pode dar overflow no meio da execução, e isso não é culpa do sistema operacional!
Outra coisa IMPORTANTE. Compile seu programa da seguinte forma: gcc -ansi -Wall -pedantic EP.c -o EP.exe -lm
O "-lm" só precisa se tiver um "#include <math.h>" no seu código.
Estou assumindo que você vai usar o compilador "gcc" (recomendo), mas você pode usar outro compilador se quiser (esses parâmetros funcionam em todos os compiladores, eu acho).
Re: Problema com scanf e/ou printf de unsigned long long
Essa dica é geral, ou específica pra quem usa Windows?
Re: Problema com scanf e/ou printf de unsigned long long
É geral. Mas não é uma dica, na verdade eu peço que TODOS vocês compilem seus programas assim: "gcc -ansi -Wall -pedantic EP.c -o EP.exe -lm". Isso é MUITO IMPORTANTE, pois é a melhor forma de garantir que eu vou conseguir compilar o programa de vocês em qualquer sistema operacional (e sem "warnings" do compilador).
Re: Problema com scanf e/ou printf de unsigned long long
Re: Problema com scanf e/ou printf de unsigned long long
Para evitar warnings, sugiro que compile-se com:
$ cc -ansi -Wall -pedantic -std=c99 a.c
Claro que estou assumindo que o compilador que será usado na correção aceita o padrão ISO C99.
Se não aceita, o jeito é receber strings e fazer a aritmética em cima delas. Porém, dessa forma meu programa demora o dobro do tempo para uma entrada como "1 10000000".
Re: Problema com scanf e/ou printf de unsigned long long
"gcc -ansi -Wall -pedantic -std=c99 EP.c"
Re: Problema com scanf e/ou printf de unsigned long long
Alexandre, você vai compilar os eps no Windows, certo? Como vou saber se irá compilar e executar direito aí?
Ah, eu também recebi warnings e acho que até erro compilando desse jeito aí..
Re: Problema com scanf e/ou printf de unsigned long long
Creio que o Alexandre vai usar Windows com gcc e por isso acho que você não vai ter problemas.
Re: Problema com scanf e/ou printf de unsigned long long
Re: Problema com scanf e/ou printf de unsigned long long
agora eu consegui compilar sem warnings mudando para "%I64d" mas só se for compilando normal..
se eu coloco para compilar com esses outros comandos aí aparece zilhões de warnings..
" ISO C90 does not support long long"
"/* within comment"
"ISO C does not support the `I64' scanf length modifier "
acho que são só esses ..
valeu wilson, não precisa não :D
Re: Problema com scanf e/ou printf de unsigned long long
Como a tarefa é escrever um programa em C e não em "C de Windows", a meu ver é uma péssima ideia usar %I64d.
Re: Problema com scanf e/ou printf de unsigned long long
Re: Problema com scanf e/ou printf de unsigned long long
O warning do long long não tem problema? Certo Alexandre?
Re: Problema com scanf e/ou printf de unsigned long long
É mas eu (pelo menos) ainda to tendo problema com o unsigned long long int (e %llu no prinf/scanf) no Windows...
Compilando com o "-std=c99" nao da nenhum warning nem erro, mas se voce colocar um input 1 1 que seja, o programa entra num loop infinito, aumentando x 1 por 1, e sei que nao é problema do código porque usando o unsigned __int64 isso nao acontece.
Mas o unsigned long long int funciona perfeitamente no Linux, enquanto o unsigned __int64 da erro/warning na compilação.
O que faço então?
Re: Problema com scanf e/ou printf de unsigned long long
Opa acho que consegui descobrir o problema do unsigned long long int no Windows. O seguinte, que era o que eu tava fazendo antes de qualquer coisa no main():
unsigned long long int x = 0, minimo, maximo, aux;
Dava erro, como disse. Trocando para:
unsigned long long int x = 0;
unsigned long long int minimo;
unsigned long long int maximo;
unsigned long long int aux;
Tambem dava o mesmo problema. Eu não inicializava o maximo/minimo pois achava que o scanf() iria fazer isso, colocando o input neles sem problemas. E como disse até funcionava para un. __int64.
Então, inicializando o minimo/maximo antes, como:
unsigned long long int x = 0;
unsigned long long int minimo = 0;
unsigned long long int maximo = 0;
unsigned long long int aux;
Fez, aparentemente, tudo funcionar certinho. E como é unsigned long long int (não aquele int64), deve compilar no Linux também, mas só poderei testar isso amanhã no IME (não tenho Linux em casa).
Como ainda to muito assustado com essa coisa bizarra, vou fazer mais alguns milhões de testes aqui pra ver se tá funcionando direitinho o EP hahaha. Mas acho que seria bom se mais alguém aqui pudesse ver isso também, mesmo já estando no limite pra entregar o EP (ainda podemos entregá-lo durante o dia 1º né?)...
Re: Problema com scanf e/ou printf de unsigned long long
Aparentemente, mesmo sem inicializar as variaveis do tipo unsigned long long int, eu consigo compilar e rodar sem problemas usando os comandos que o alexandre falou. (é Windows tb aqui)
Sobre o limite de entrega, no paca tá até as 23:55 de 01/09/2009. Então acho que sim, podemos entregar amanhã XD
Re: Problema com scanf e/ou printf de unsigned long long
Sim sim, to compilando do mesmo jeito.
Quanto ao problema da inicialização das variáveis, é, bem, o C é estranho haha... Vai ver depende de como nós usamos ela depois para dar o problema ou não.
De qualquer jeito, tá funcionando, como disse não sei se compila em Linux, mas to com o mesmo problema do Renato, quando começou esse tópico: mesmo sendo um valor 64 bits o unsigned long long int, colocando isso no scanf ( "%llu" ), ele trata como se fosse unsigned long - limitando em 32 bits....
E isso limita bastante porque meu EP funciona para numeros entre 2^32 e 2^64 - 1...