Jump to content

Duvida e erro em visual c++


amac
 Share

Recommended Posts

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!

Link to comment
Share on other 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  😛 ). 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

Link to comment
Share on other 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++...

Desaparecido.

Link to comment
Share on other 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.

Link to comment
Share on other 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? 😛 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 😄

Desaparecido.

Link to comment
Share on other 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.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.