• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

amac

Duvida e erro em visual c++

6 mensagens neste tópico

Boa tarde! Será que alguém me consegue explicar qual a diferença entre  threads e a função OnTimer do visual c++?

Já agora tou com um erro que não consigo resolver é o seguinte estou a receber um numero em bunário pela porta série depois queria ler bit a bit fazendo

int main ()

{

long int trama;

for (i=0; i<=7; i++)
{
bit=(trama/(10e(i))%2)


}

}

Este código dá-me um erro na exponencial, como resolver?

A formula estará correcta?

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom, primeiro a dúvida...

Será que alguém me consegue explicar qual a diferença entre  threads e a função OnTimer do visual c++?

São duas coisas distinctas, embora em muitas circunstancias devem estar relacionadas. OnTimer é uma função membro da class CWnd present no MFC que permite definir acções para quando um timer evento é activado através de CWnd::SetTimer(). O problema com SetTimer e OnTimer é que estas funções usam a message queue da applicação pelo que OnTimer deve realmente conter muito pouca funcionalidade. Caso contrário, e é aqui que entram as Threads, uma nova thread deve ser criada em OnTimer para efectuar o processamento e onTimer deve fechar imediatamente deixando a thread a fazer a sua coisa.

Em relação ao código...

Eu sou um programador amador em C++ e com muita pouca formação matemática, mas é de imediato claro que cometeste um erro commun (não tens que te lamentar  :P ). E este é o facto de assumires que o standard C++ usa os simbolos matemáticos tal como definidos internacionalmente. Tal não é o caso. Por exemplo, não existe nenhum operador para percentagem embora à partida a ideia de utilizar % seja apelativa. Acontece quer % é o simbolo C++ para módulo.

Procura as funções exp e log na tua documentação. Penso que é isso que queres.

Só mais uma nota. declarar e definir variáveis sem lhes atribuir um tipo é considerado má prática. Diferentes compiladores podem utilizar diferentes tipos uma vez que o standard já baniu a ideia de "default int". Pior, com o advento da plataforma x64 as possibilidades de erro aumentam.

Assim, define as variaveis i como int e bit como double (penso que é double que queres)

Boas,

MF

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou desenterrar esta thread porque penso que este último post está a fazer algumas confusões. E nós não queremos isso, não é verdade? :)

Já agora tou com um erro que não consigo resolver é o seguinte estou a receber um numero em bunário pela porta série depois queria ler bit a bit fazendo

int main () {
    long int trama;

    for (i=0; i<=7; i++) {
        bit=(trama/(10e(i))%2)
    }
}

Este código dá-me um erro na exponencial, como resolver?

A formula estará correcta?

Obrigado!

Em C++ não podes declarar valores em notação científica com expoentes variáveis. Para fazer o que pretendes tens que utilizar a função pow da biblioteca cmath da seguinte forma:

bit=(trama/pow(10, i)%2);

Já agora, não te esqueças do ponto e vírgula.

Eu sou um programador amador em C++ e com muita pouca formação matemática, mas é de imediato claro que cometeste um erro commun (não tens que te lamentar  :) ). E este é o facto de assumires que o standard C++ usa os simbolos matemáticos tal como definidos internacionalmente. Tal não é o caso. Por exemplo, não existe nenhum operador para percentagem embora à partida a ideia de utilizar % seja apelativa. Acontece quer % é o simbolo C++ para módulo.

Não me parece que ele tenha cometido qualquer erro relativamente ao %. A expressão bit=(trama/pow(10, i)%2) devolve 1 ou zero, o que dado o nome da variável (bit) é exactamente o que ele pretende, e que corresponde ao bit de peso i presente em trama. Já agora, o operador % é chamado de modulo em inglês, mas não se traduz para módulo, que em português significa "valor absoluto". Traduz-se para resto da divisão.

Só mais uma nota. declarar e definir variáveis sem lhes atribuir um tipo é considerado má prática. Diferentes compiladores podem utilizar diferentes tipos uma vez que o standard já baniu a ideia de "default int". Pior, com o advento da plataforma x64 as possibilidades de erro aumentam.

Assim, define as variaveis i como int e bit como double (penso que é double que queres)

Acho que podemos assumir que ele declarou as variáveis como globais, e que o código é parcial, uma vez que o standard C++ nunca suportou default int. bit deverá ser do tipo char, ou int. Muito embora pelo menos o compilador do Visual Studio aceite default int em C++...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que podemos assumir que ele declarou as variáveis como globais, e que o código é parcial, uma vez que o standard C++ nunca suportou default int. bit deverá ser do tipo char, ou int. Muito embora pelo menos o compilador do Visual Studio aceite default int em C++...

Bom isso seria grave também, uma vez que declarar variáveis globais é considerado má prática. Tanto mais se essa variável se chamar i.

Pareceu-me na altura - e continua a parecer-me hoje - que a variável i é declarada e inicializada naquele momento. Pareceu-me na altura, e iria parecer-me também hoje, importante notar o facto de que o autor deveria declarar a variável definindo o seu tipo.

O standard nunca implementou o "default int", mas eu não disse que ele o tinha feito pois não? :) Lê lá outra vez.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom isso seria grave também, uma vez que declarar variáveis globais é considerado má prática. Tanto mais se essa variável se chamar i.

Grave, e má prática? Não lhe chamaria tanto, mas concordo que deve ser evitado. A parte do nome ser i não percebi.

Pareceu-me na altura - e continua a parecer-me hoje - que a variável i é declarada e inicializada naquele momento. Pareceu-me na altura, e iria parecer-me também hoje, importante notar o facto de que o autor deveria declarar a variável definindo o seu tipo.

Se o standard nunca incluiu default int, não vejo como podes inferir que a variável é declarada ali.

O standard nunca implementou o "default int", mas eu não disse que ele o tinha feito pois não? :P Lê lá outra vez.

Diferentes compiladores podem utilizar diferentes tipos uma vez que o standard já baniu a ideia de "default int".

Se "baniu", é porque alguma vez existiu... senão não seria possível banir :) Fazendo uma analogia exagerada, seria como proibir as pessoas com 6 olhos de tirar a carta de condução - perdoem-me as pessoas com 6 olhos se existir alguma :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Grave, e má prática? Não lhe chamaria tanto, mas concordo que deve ser evitado. A parte do nome ser i não percebi.

Bom, grave dependeria da utilização a dar à variável. Assumamos que o autor utiliza i como global. Mais tarde pretende reutilizar parte do código noutro projecto. Mas este depende de uma global definida noutro modulo qualquer. Toca de criar nova global ou ter de alterar o código existente para incluir a declaração correcta da variável. Outra dica: http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.8

Se o standard nunca incluiu default int, não vejo como podes inferir que a variável é declarada ali.

Porque o standard é uma coisa e os compiladores são outra :)

Infelizmente a prática do "default int" era comum. Salvo erro porque até ao último standard não existia uma afirmação clara de que o type specifier era obrigatório (7.1.5-2 em C++ Standard - ISO-IEC 14882-2003(E)). Muitos compiladores (Turbo C++, Visual C++ 6.0, pelo menos) implementaram default int. Entretanto até mesmo com os compiladores actuais, por razões de backward compatibility, é possível o compilador deixar passar o erro se o nível de warning for demasiado baixo.

Entretanto,

Diferentes compiladores podem utilizar diferentes tipos uma vez que o standard já baniu a ideia de "default int".

A primeira parte desta afirmação é realmente ridicula. E não sei porque o disse naquela altura a não ser por não estar a pensar bem no que estava a dizer. Necessariamente diferentes compiladores poderiam usar diferentes tipos porque na altura não era claro que o type specifier era obrigatório. Não o fizeram, que seja do meu conhecimento. int era o default comum. Mas poderiam fazê-lo se o quisessem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora