Ir para conteúdo
Fórum Script Brasil

Maligno

Membros
  • Total de itens

    214
  • Registro em

  • Última visita

Tudo que Maligno postou

  1. Maligno

    Ajuda - Função Getch

    Quem disse que o caractere ASCII não é o número normal do teclado? É sim. Note: nem tudo é o que aparenta ser em computação. A linguagem não vai fazer tudo pra você. É você quem deve converter os valores. Mas é coisa simples. Se observar na tabela ASCII, o "zero" é representado pelo valor 48. Logo, você só precisa subtrair os seus resultados por 48 para ter os números "humanos". :)
  2. #include <stdio.h> int main() { char Frase[] = "Estude mais!"; char Letra = 'E'; if (Letra == Frase[0]) printf("Sim, preciso estudar mais.\n"); else printf("Que nada! já to craque! :)\n"); return 0; }
  3. Talvez o Schildt não comente no livro, mas há alguns outros aspectos importantes a considerar. C++, como OOP, possui um recurso chamado de overloading; sobrecarga de funções, onde uma mesma função pode aceitar argumentos diferentes e manter o mesmo nome. Mas se duas funções compartilham do mesmo nome, como o compilador sabe qual função usar? A própria parametrização é um recurso que o compilador usa. Mas não é só isso. Há também o que se chama de name mangling, que é uma técnica que cria para a função um nome diferente do "real", o que constitui uma "assinatura" para cada função. C não tem isso, até porque nem precisa. Mas quando você faz uso de uma função C (uma LIB especial, por exemplo) em código C++, você precisa avisar o compilador que para aquela função C não deverá ser utilizado name mangling. Daí a necessidade do "extern "C" .... Sem isso o compilador vai mandar o linker procurar por um nome de símbolo que não existe. É erro na certa. Note também que uma função C, nessas condições, não pode ser sobrecarregada, já que para este recurso o uso do name mangling é mandatório. Aliás, repare que devido ao fato do name mangling produzir um objeto com nome de símbolo bem diferente do nome "real" da função, fica torna impossível um código C usar código C++ de uma biblioteca de funções. A não ser, claro, que algum compilador tenha algum switch especial que permita ao programador desligar o name mangling ao criar uma biblioteca para uso externo. Não conheço nenhum que tenha, e duvido que exista. Estou só "aventando" uma possibilidade. :) PS: Mais detalhes sobre name mangling podem ser obtidas pelo Google. Mas é coisa simples e fácil de entender.
  4. Explicitamente você não precisa (nem pode) executar o destrutor da classe. Ele será chamado automaticamente pelo compilador em duas situações distintas: se para o objeto foi alocada memória pelo comando new, você deve liberar a memória depois do uso, pela execução do comando delete. Isso chamará o destrutor. A segunda situação é quando o objeto é uma variável local. Aí é mais fácil ainda: o destrutor será chamado automaticamente quando o escopo do objeto morrer, esteja ele dentro do bloco da função ou dentro de um bloco mais interno ao bloco principal.
  5. Atenha-se sempre às normas da linguagem. A norma de C diz que você pode ter break no seu default. Isso é regra e ponto final. Agora, se no final der pau nisso, é bug do compilador. Você até pode mudar o código para sanar o problema, mas não se esqueça de algo MUITO importante: quem está contrariando a regra é o compilador e não você. Mas isso é fichinha. Você não tem idéia dos bugs esquisitos que já peguei no GCC. Aliás, o GCC eu nunca uso pra produção. Apenas pra teste. E olha lá. Sempre de olhos bem abertos. Vou contar um caso escabroso. Resumidamente: eu tinha a função A() que chamaba B(). Em A() havia uma malha com um iterador i. O escopo dessa variável, claro, era local à A(). Na função B(), nada demais. Era código comum. Mas, por alguma estranha razão, ela ferrava com aquela variável iteradora i de A(); completamente fora do escopo de B(). Após o retorno de B() a função A() dava pau porque i passava a ter um valor absurdo. Solução: modifiquei o código de B(), fazendo um monte de lingüiça de rosca, só pra mudar a forma do código. Operacionalmente ficou a mesma coisa. E parou de dar o erro. Passados alguns meses, com o programa já modificado várias vezes (ele mudou de forma, digamos assim), voltei a função B() ao que era quando dava esse erro. Sem mudar a versão do GCC, recompilei e parou de dar erro. Tudo funciona até hoje. Moral da história: não dá pra confiar muito em alguns compiladores. É bom ficar de olhos bem abertos, até porque o pior erro é aquele que você não vê. Por isso a etapa de testes é muito importante. Tem de ser a mais abrangente possível.
  6. Explique para o seu professor (ele não deve saber) que o comando de quebra break após um default só faz sentido quando após esse default existir algum outro case. Uma situação dessas parece esquisita. E é mesmo, além de ser uma grosseria. Ninguém em sã consciência faz isso. Mas mesmo sendo esquisita, é um arranjo perfeitamente válido, que não dá erro. Mas só nessa situação um break faria sentido. Veja um exemplo simples: char vlr = 1; switch(vlr) { case 0 : vlr = 10; break; default : vlr = 12; break; case 2 : vlr = 11; break; } No final vlr conterá 12. Mas aí o último case não será considerado? Será sim. O compilador sabe que há mais um teste a ser feito após o default. Se você trocar o último teste para case 1, no final vlr conterá 11. E o default não será utilizado. Não se preocupe. O compilador não vai se perder. Finalizando: default, observando-se as regras da boa programação, deve ser sempre o último comando no switch, até por uma questão de legibilidade. Portanto, um break seguinte ao default, nessas condições, não interrompe piçiroca nenhuma. É peso morto. :)
  7. Neste caso basta copiar a cópia modificada para o original. Dá no mesmo. Perceba que um objeto nada mais é que um aglomerado de dados. Nada mais que isso.
  8. Você pode querer alterar o objeto de forma temporária. O melhor então é criar uma cópia e alterá-lo, preservando o original.
  9. Mais fácil que tirar doce de criança. Tenho certeza que se você se dedicar vai conseguir sozinho. Poste apenas suas dúvidas, conforme o programa for progredindo.
  10. Infelizmente eu não posso dizer muito mais sem conhecer o manual. E nem tenho tempo pra isso. De qualquer forma, tente conhecer melhor as classes da biblioteca. Certamente há métodos que vão resolver seu problema.
  11. O Visual Studio eu nunca utilizei, a não ser um VS mais antigo não-RAD. Já ouvi dizer que a versão mais nova é, digamos, meio RAD. Não posso afirmar com certeza. RAD de verdade e fácil de usar, e que eu uso, é o C++ Builder. Mas se o ML é para o VS, então você tem que usar o VS mesmo. Não tem jeito. Mas certamente ele deve ter algum recurso de configuração de propriedades e eventos. Isso é bem básico numa IDE. O VS deve ter também. Em tempo: o pessoal do suporte da ML não poderia te ajudar?
  12. Pelo que entendi sua mensagem, você precisa configuar o evento do clique do botão. Não conheço essa biblioteca, mas certamente deve ter alguma coisa no Google. Tente encontrar exemplos de uso.
  13. Maligno

    Problema com struct

    Modificar a organização interna da estrutura não vai adiantar nada, se é o que você fez. O que vai mudar alguma coisa é a forma de declarar e inicializar as estruturas.
  14. Maligno

    Problema com struct

    Então vá tentando algumas alterações. Tente, por exemplo, colocar os typedef junto às estruturas.
  15. Maligno

    Problema com struct

    Não vejo nada de errado nesse código. Deveria compilar normalmente. Tente trocar a inclusão do cabeçalho para #include "Estruturas.h" (com aspas).
  16. Maligno

    Problema com struct

    Melhor seria se você tivesse postado o código ao invés dessa imagem, que não ajuda nada. Aliás, nem precisava se dar ao trabalho de recortar sua tela. Era só ter dito que a mensagem é "redefinition of struct". Mas, de qualquer forma, sem o fonte,...
  17. Qual é exatamente a sua dificuldade?
  18. Maligno

    Raiz em C

    Veja o help da função padrão sqrt(<n>). O valor n precisa ser um valor em ponto flutuante não-negativo. O retorno é um double e o header é "math.h".
  19. Nunca precisei de algo parecido, mas há duas formas de mudar a cor: 1) instalando o terminal gráfico do console ANSI.SYS (instalado pelo CONFIG.SYS) para utilizar comandos ESCAPE (veja na net - tem bastante coisa a respeito). 2) acessando o buffer de vídeo diretamente para alterar o atritubo de cor de cada caractere impresso. Neste último caso, a biblioteca padrão da linguagem não tem função própria pra isso. Mas talvez você possa encontrar algo pronto.
  20. Maligno

    Comando batch no C++

    A função system() permite executar qualquer comando de linha.
  21. Experimente trocar o segundo getchar() por getch(). Aliás, aproveita e apague o break seguinte ao default, pois ele é totalmente inócuo.
  22. Variáveis não é bem o termo correto. Tipo nativo de dado booleano, como há em outras linguagens, a linguagem C realmente não tem. Mas ela tem algo bem melhor, que é forma de avaliar os valores numéricos, conforme comentei acima. Assim é muito mais prático e flexível. Agora, com ou sem um tipo booleano nativo, toda e qualquer linguagem SEMPRE terá que contar com algum meio de teste booleano, evidentemente. Logo, isso é apenas um mero detalhe. :)
  23. Mas é claro que existem. O zero é sempre falso e qualquer valor diferente disso é verdadeiro.
  24. Note que antes você utilizava a MessageBox() função de biblioteca, mas depois passou a usar a MessageBox() método da classe TApplication. As duas têm protótipos diferentes. Leia o help de ambas com atenção e você vai perceber. Usando o método de TApplication, as strings são do tipo const char. Então você não pode pura e simplesmente somar as strings como fez. Uma solução simples é somar tudo como AnsiString e no final incluir o método c_str(), obtendo o char. Exemplo: AnsiString("ERRO AO ABRIR: "+ ExtractFilePath(Application->ExeName) + "Configurações\\inf_Funcionario.txt.").c_str()
  25. O diretório do projeto está (ou deveria estar) na busca default do compilador. Ele é esperto o suficiente pra saber isso. Realmente. Em linha de comando garanto que não dá esse problema. Talvez a IDE (que não uso muito) pode não ter essa "esperteza" toda e, como o compilador é invocado indiretamente, ela pode não estar passando pra ele o diretório do fonte para uma busca pelo header do projeto. Se ela fizer isso, vai usar o switch que indiquei na minha mensagem anterior. Alguns headers já são incluídos por outros headers e por isso não precisam ser explicitamente incluídos no seu fonte. Taí o "mistério". :) Não que seja comum a todo compilador, mas todo compilador vai aceitar. O ideal é não informar path de header no seu fonte. Se os arquivos mudarem de lugar e você tiver dezenas de fontes, já viu o trabalho que vai dar pra atualizar tudo. Se puder, apenas informe o compilador qual diretório ele deve procurar.
×
×
  • Criar Novo...