Ir ao conteúdo
  • Cadastre-se

cyer

Membro Pleno
  • Posts

    150
  • Cadastrado em

  • Última visita

Tudo que cyer postou

  1. Obrigado, eu não lembrava que o ponteiro this era um ponteiro constante.
  2. Olá, estou escrevendo uma classe de string, estou tendo problemas com o meu próprio construtor, sempre que ele é chamado é ativado uma interrupção(INT3). Estou utilizando o Visual Studio 2017. #include <iostream> #include <Windows.h> namespace EH { class EHString { private: char* m_sText; size_t m_iLength; size_t m_iMaxLength; public: EHString(const char* Str) : m_iMaxLength(50), m_iLength(0) { // Alloca no heap o tamanho inicial para uma string this->m_sText = reinterpret_cast<char*>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, this->m_iMaxLength)); // Pega o tamanho da string passada no construtor e copia para a classe for (; Str[this->m_iLength] != 0; this->m_iLength++) { // Verificação para evitar estouro de buffers if (this->m_iLength >= this->m_iMaxLength - 3) { this->m_iMaxLength *= 2; this->m_sText = reinterpret_cast<char*>(HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, this->m_sText, this->m_iMaxLength)); } // Copia o caracter this->m_sText[this->m_iLength] = Str[this->m_iLength]; } // Termina a string this->m_sText[this->m_iLength] = '\0'; } EHString(EHString& estr) // Construtor que está causando o problema { *this = estr; } const char* c_str() const { return const_cast<const char*>(this->m_sText); } const size_t begin() const { return 0; } const size_t end() const { return this->m_iLength; } const size_t length() const { return this->m_iLength; } const size_t size() const { return this->m_iLength; } EHString& push_back(char ch) { // Verificação para evitar estouro de buffers if (this->m_iLength >= this->m_iMaxLength - 3) { this->m_iMaxLength *= 2; this->m_sText = reinterpret_cast<char*>(HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, this->m_sText, this->m_iMaxLength)); } // Insere o caracter na ultima posição this->m_sText[this->m_iLength] = ch; // Termina a string this->m_sText[++this->m_iLength] = '\0'; return *this; } EHString& append(char ch) { return this->push_back(ch); } EHString& append(const char* str) { for (size_t i = 0; str[i] != 0; i++) this->push_back(str[i]); return *this; } void pop_back() { this->m_sText[--this->m_iLength] = '\0'; } bool operator==(const char* String) { char* tempText = this->m_sText; while (*tempText && (*tempText == *String)) tempText++, String++; return ((*reinterpret_cast<const unsigned char*>(tempText) - *reinterpret_cast<const unsigned char*>(String)) == 0); } bool operator==(EHString String) { return this->operator==(String.c_str()); } EHString& operator=(const char* String) { this->m_iLength = 0; for (; String[this->m_iLength] != 0; this->m_iLength++) { // Verificação para evitar estouro de buffers if (this->m_iLength >= this->m_iMaxLength - 3) { this->m_iMaxLength *= 2; this->m_sText = reinterpret_cast<char*>(HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, this->m_sText, this->m_iMaxLength)); } this->m_sText[this->m_iLength] = String[this->m_iLength]; } this->m_sText[this->m_iLength] = '\0'; return *this; } EHString& operator=(EHString String) { return this->operator=(String.c_str()); } }; } int main() { EH::EHString test("Testando uma string"); EH::EHString test2(test); printf("%s - %i\n", test.c_str(), test.length()); printf("%s - %i\n", test2.c_str(), test2.length()); system("pause"); return 0; }
  3. @NEI MOTA se eu tivesse no seu caso, eu começaria procurando em cada arquivo que terminasse com .cpp onde estaria localizado o main do programa, e através do main ia seguir os próximos passos, por exemplo, se o main chamar uma função tal, eu ia até essa função ia olhar o objetivo dela. O que eu recomendo é que você procure um programador mais experiente, pois no seu caso, começar mexendo em um tipo de aplicação dessa(que me parece ser extremamente grande pelo numero de forms e pelo numero de arquivos), um único sinal errado poderia comprometer toda a funcionalidade da aplicação. Mas se você realmente quiser tentar, antes salve um backup de todos esses arquivos, e comece por onde eu disse, comece procurando o ponto de entrada(main) e tente entender um pouco do que o código do main faz. Sobre o C++ 10.2, eu não tenho experiencia com esse compilador, se você quiser aprender a compilar nesse compilador, eu sugiro que procure no youtube algo relacionado ao C++ 10.2 ou até no google mesmo, assim você ira saber por onde compilar.
  4. Bem, como citado acima pelo @CiroboyBR se o programa é x86 vai rodar também em x64 a não ser que esse programa faça uso diretamente de memória ram, ai sim seria necessário mudar algumas coisas, seria interessante se você desse mais informações do erro e do programa, por exemplo o que o programa faz exatamente?
  5. Poderia usar GetAsyncKeyState e mostrar o valor da constante definido equivalente a cada tecla(VK_UPARROW, VK_DOWN, VK_LEFT, VK_RIGHT) if (GetAsyncKeyState(VK_UP)&1) // Seta para cima pressionada else if (GetAsyncKeyState(VK_DOWN)&1) // Seta para baixo pressionada else if (GetAsyncKeyState(VK_LEFT)&1) // Seta para esquerda pressionada else if (GetAsyncKeyState(VK_RIGHT)&1) // Seta para direita pressionada
  6. cyer

    C++ Como descompilar um .exe?

    É possível sim, existe até uma boa ferramenta para isso, chamada: IDA Disassembler, que infelizmente é pago, mas se você pesquisar você vai encontrar ele crackeado em outros sites que obviamente não posso colocar o link ou citar nomes. Obviamente que você vai ter que pegar uma experiencia com ele, além que o código não é totalmente legivel, você vai precisar de experiencia para transformar o pseudocode. Um exemplo: Considere o seguinte código escrito em C: int main() { char nome[500] = { 0 }; printf("Insira seu nome: "); fgets(nome, 499, stdin); printf("Seu nome: %s\n", nome); system("pause"); return 0; } Código descompilado: Obviamente existe formas de proteger o código contra engenheiros reversos, as formas mais comuns são usando Packers e virtualizando o código ou Polymorphic/Metamorphic Engines. Mas mesmo assim dá para burlar isso, basta fazer unpack, o que é mais complicado é quando está virtualizado, você vai ter que fazer uma analise completa no código e com muita eng. reversa você consegue reconstruir. A maioria dos malwares fazem de tudo para complicar a vida dos analistas de malwares.
  7. @Amanda Kellen uma pequena sugestão, na função leitura você utiliza a função gets, que não para de pegar os caracteres mesmo que estore o buffer da string(que no caso é 19), então eu sugiro que você utilize a função fgets em vez da gets para evitar problemas na sua aplicação. Mesmo que o usuario escreva mais de 19 letras, não vai capturar, só vai capturar até a letra de número 19. fgets(nome, (TAMANHO - 1), stdin); http://rberaldo.com.br/c-por-que-usar-fgets-em-vez-de-gets/
  8. cyer

    String Palindromo

    Só uma pequena observação, evite o uso da função gets, não é uma função segura de usar, existe vários problemas em usar essa função, o maior problema é o de estouro de buffers, quando for nesse caso prefira o uso da função fgets: char saida[50]; fgets(saida, sizeof(saida), stdin); // Em vez de usar a função sizeof, poderia colocar diretamente o tamanho(50) http://rberaldo.com.br/c-por-que-usar-fgets-em-vez-de-gets/
  9. Mas porque utilizar atoi? A função atoi seria se fosse uma string para inteiros, como você quer converter apenas cada carácter individualmente, esses caracter tem que ser transformados em códigos ascii, de uma olhada na tabela ascii: http://ic.unicamp.br/~everton/aulas/hardware/tabelaASCII.pdf #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUMERO_PARA_NUMERO 0 // Mude para 1 caso queira mostrar o número quando convertido inline int chartoint(char c) { if (NUMERO_PARA_NUMERO) // Caso você queira mostrar os números sem ser em código ascii { // Checa se o caracter é um número if (c >= '0' && c <= '9') return (c - '0'); } return c; // Não é necessario converter o tipo, pois o compilador já faz um cast implícito } int main() { char c[2] = { 0 }; int toi[2] = { 0 }; printf("Informe dois caracteres: "); scanf("%c%c", &c[0], &c[1]); for (int i = 0; i < 2; i++) toi[i] = chartoint(c[i]); printf("Convertido em int: %i %i\n", toi[0], toi[1]); return 0; }
  10. Código fixado: #include <stdio.h> #include <stdlib.h> #include <ctype.h> // Uso da função toupper struct funcionario { //cria a struct funcionario char nome[50]; //cria a variável nome float salario; //cria a variável salario }; funcionario lista_funcionarios[50]; // Precisa ser definida como global ou ser definida dentro da função main e passar ela como argumento para as outras funções void cadastra_funcionario (int& tamanho_lista) { //função que cadastra um novo funcionário printf("Informe o nome do funcionario \n"); scanf("\n%s", &lista_funcionarios[tamanho_lista].nome); printf("Informe o salario do funcionario \n"); scanf("\n%f", &lista_funcionarios[tamanho_lista].salario); tamanho_lista++; //fim da função que cadastra um novo funcionário } funcionario maior_salario(funcionario lista_funcionarios[], int tamanho_lista) { //função que encontra o funcionário com maior salário //int tamanho_lista = 0; if (tamanho_lista > 0) { int i, maior_indice; float maior_salario; for (i = 0; i < tamanho_lista; i++) { if (lista_funcionarios[i].salario > maior_salario) { maior_salario = lista_funcionarios[i].salario; maior_indice = i; } } printf("Nome: %s\n", lista_funcionarios[maior_indice].nome); printf("Maior salario: %f\n", maior_salario); } //fim da função que encontra o funcionário com maior salário } int main(void) //função responsável por perguntar ao usuário se deseja cadastrar funciOnário ou saber o maior salário { int tamanho_lista = 0; int continuar = 1; char opcao; do { printf ("Digite C para cadastrar ou M para saber o maior salario \n"); scanf("\n\n%c", &opcao); opcao = toupper(opcao); // A linguagem C é uma linguagem case sensitive, então precisa converter para maiusculo nesse caso switch (opcao) { case 'C': cadastra_funcionario(tamanho_lista); break; case 'M': maior_salario(lista_funcionarios, tamanho_lista); break; default: continuar = 0; } } while (continuar ==1); { //fim da função responsável por perguntar ao usuário se deseja cadastrar funcionário ou saber o maior salário system("pause"); return 0; } }
  11. Se usa mais memória eu não sei, sei que existe o preço de uma chamada de função, que é o tempo para uma função ser chamada, esse preço pode ser melhorado se a função for inlinearizada(inline/__inline/__forceinline), quando é inlinearizada ganha velocidade e é pago com o custo de um executável maior, como os processadores de hoje em dia são extremamente rápidos, um custo de chamada de função é mínimo. Caso tenha ficado curioso sobre funções inlines: http://br.ccm.net/faq/10121-os-inlines-em-c http://www.tiexpert.net/programacao/c/funcoes-inline.php
  12. #include <iostream> // std::cout, std::cin #include <stdarg.h> // va_list, va_start, va_end #include <limits> // Constante INT_MAX void MaiorMenor_Numero(size_t quantos_numeros, int* menor, int* maior, ...) { va_list va = { 0 }; va_start(va, quantos_numeros); int numero_atual = 0, maior_num = 0, menor_num = INT_MAX; for (size_t i = quantos_numeros; i--;) { numero_atual = va_arg(va, int); if (numero_atual > maior_num) maior_num = numero_atual; if (numero_atual < menor_num) menor_num = numero_atual; } va_end(va); *maior = maior_num; *menor = menor_num; } int main(void) { int num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0; int maior_num = 0, menor_num = 0; std::cout << "Entre com 5 numeros: "; std::cin >> num1 >> num2 >> num3 >> num4 >> num5; MaiorMenor_Numero(5, &menor_num, &maior_num, num1, num2, num3, num4, num5); std::cout << "Menor: " << menor_num << "\nMaior: " << maior_num << std::endl; // Apenas para evitar que o programa feche sem dar tempo do usuário ler std::cin.get(); std::cin.get(); return 0; } ------------------------------------------------------------------- Segunda alternativa(segue a mesma lógica da primeira apenas com o código um pouco melhor): #include <iostream> // std::cout, std::cin #include <vector> // std::vector #include <limits> // Constante INT_MAX void MaiorMenor_Numero(std::vector<int> vec, int* menor, int* maior) { int maior_num = 0, menor_num = INT_MAX; for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { if (*it > maior_num) maior_num = *it; if (*it < menor_num) menor_num = *it; } *maior = maior_num; *menor = menor_num; } int main() { int n = 0, menor = 0, maior = 0, num_in = 0; std::vector<int> nums; std::cout << "Digite quantos numeros deseja: "; std::cin >> n; for(int count = 0; count < n; count++) { std::cout << "Informe o numero " << count + 1 << ": "; std::cin >> num_in; nums.push_back(num_in); } MaiorMenor_Numero(nums, &menor, &maior); std::cout << "Menor: " << menor << "\nMaior: " << maior << std::endl; // Apenas para evitar que o programa feche sem dar tempo do usuário ler std::cin.get(); std::cin.get(); return 0; }
  13. De fato está entrando no else sim, testei aqui e entrou no else, porém para o else ser executado precisa entrar com um número maior que o número sorteado.
  14. Para declarar uma variável double: double minha_variavel; Se o que você quer dizer com "Só posso usar o double com float" na parte de entradas e saidas(printf e scanf), a resposta é sim. Um pequeno exemplo bem simples: http://www.ic.unicamp.br/~islene/mc102/aula04/scanf-float-double.c Não sei por qual motivo está dando erro, talvez você esteja declarando de forma errada, existe umas regras para declarar variáveis em C, as principais são: Elas não podem conter nenhum carácter especial(com exceção do _), os nomes das variáveis não podem começar com números ou conter espaço. Poderia postar como você está declarando? Assim daria para saber o motivo do erro.
  15. Não sei se o .bat realmente funciona, pois não uso firefox, mas você pode usar um arquivo .bat dentro do C/C++, na verdade você só precisa do comando system da biblioteca Windows.h exemplo: system("shutdown -r"); // Reinicia o computador O que eu quero dizer é que se esse arquivo .bat funcionar, você poderia pegar os comandos e jogar dentro do system, utilizando o exemplo acima.
  16. Bom, tava com pouco tempo, então escrevi o código meio que nas "coxas", então me perdoe pelo código um pouco sujo. A desvantagem que o programa precisa está rodando para executar tal tarefa. #include <iostream> // std::cout #include <Windows.h> // CreateThread, Sleep #include <map> // std::map #include <string> // std::string struct tarefa { int horas, minutos, segundos; int dia, mes, ano; tarefa() : horas(0), minutos(0), segundos(0), dia(0), mes(0), ano(0) { } tarefa(int _horas, int _minutos, int _segundos, int _dia, int _mes, int _ano) : horas(_horas), minutos(_minutos), segundos(_segundos), dia(_dia), mes(_mes), ano(_ano) { } }; std::map<std::string, tarefa> tarefas; inline bool esta_na_hora(std::string nome_tarefa, tm* tminfo) { return (tminfo->tm_hour == tarefas[nome_tarefa].horas && tminfo->tm_min == tarefas[nome_tarefa].minutos && tminfo->tm_sec == tarefas[nome_tarefa].segundos && tminfo->tm_mday == tarefas[nome_tarefa].dia && tminfo->tm_mon == (tarefas[nome_tarefa].mes - 1) && tminfo->tm_year == (tarefas[nome_tarefa].ano + 1900)); } inline void adicionar_tarefa(std::string nome_tarefa, int dia, int mes, int ano, int horas, int minutos, int segundos) { tarefas[nome_tarefa].dia = dia; tarefas[nome_tarefa].mes = mes; tarefas[nome_tarefa].ano = ano; tarefas[nome_tarefa].horas = horas; tarefas[nome_tarefa].minutos = minutos; tarefas[nome_tarefa].segundos = segundos; } DWORD WINAPI Thread(LPVOID) { time_t curtime = 0; tm* timeinfo = { 0 }; adicionar_tarefa("Tarefa teste 1", 3, 1, 2018, 17, 49, 30); // Tarefa vai ser executada no dia 3/1/2018 ás 17:49:30 adicionar_tarefa("Tarefa teste 2", 3, 1, 2018, 17, 49, 40); // Tarefa vai ser executada no dia 3/1/2018 ás 17:49:40 while (1) { time(&curtime); timeinfo = localtime(&curtime); for (std::map<std::string, tarefa>::iterator it = tarefas.begin(); it != tarefas.end(); ++it) { if (esta_na_hora(it->first, timeinfo)) { std::cout << "Está na hora da tarefa: " << it->first << std::endl; } } Sleep(100); // Pausa para diminuir o uso da cpu } return 0; } int main() { HANDLE th = CreateThread(NULL, NULL, &Thread, NULL, NULL, NULL); WaitForSingleObject(th, INFINITE); return 0; } Código compilado utilizando o Visual Studio 2017 e CodeBlocks(Necessita marcar a opção "Have g++ follow the coming C++0x (aka c++11) ISO C++ language standard [-std=c++0x]", para marcar é só clicar no botão localizado na barra superior da sua tela com o nome "Settings" e depois clicar na opção "Compiler")
  17. #include <stdio.h> #include <stdlib.h> void calculafatorial(int num, int* fatorial); int main(void) { int num, fatorial; scanf("%d", &num); calculafatorial(num, &fatorial); } void calculafatorial(int num, int* fatorial) { for(int fat = 1; fat <= num; fat++) *fatorial *= fat; printf("%d\n", *fatorial); }
  18. Acho que ele queria mostrar na tela, pois a variável "commitments" é apenas um char, gets seria se ele quisesse ler uma string, que não é o caso, já que o argumento da função gets é um conjunto de caracteres(uma string).
  19. Realmente precisa do system("pause") para que o aplicativo não feche ao mostrar as informações do ultimo imóvel, não acho que o continue dentro do if seja desnecessário, pois como famílias que possuem uma renda menor que 2 salários(R$1874,00) está insento do pagamento da taxa de lixo, então seria necessário quebrar o loop para aquele imóvel, caso contrario iria continuar com as entradas de dados, calculo do lixo, etc. ------------------------------ @Nilson Andrade Estranho esse seu erro, a biblioteca iostream é uma biblioteca padrão do C/C++, caso não tenha conseguido poderia tentar compilar utilizando uma outra IDE, como o CodeBlocks por exemplo. Fiz uma pequena alteração no código, não tinha percebido o erro que o @devair1010 percebeu, segue o código fixado caso precise ainda: #include <iostream> #include <locale.h> #define RENDA_LIMITE 1874.f int main() { setlocale(LC_ALL, "Portuguese"); // Para uso de acentos int qnt_imoveis = 0, num_do_imovel = 0, num_de_moradores = 0; float area_do_imovel = 0.f, valor_taxa_lixo = 0.f, renda_familiar = 0.f; printf("Informe a quantidade de imóveis: "); scanf("%d", &qnt_imoveis); for(int contador = 0; contador <= qnt_imoveis; contador++) { printf("Informe o número do imóvel: "); scanf("%d", &num_do_imovel); printf("Informe a renda familiar: "); scanf("%f", &renda_familiar); if (renda_familiar < RENDA_LIMITE) // Renda familiar menor que 2 salários está insento do pagamento { printf("O imóvel de número %i está insento do pagamento da taxa de lixo.\n", num_do_imovel); continue; } printf("Informe a área do imóvel: "); scanf("%f", &area_do_imovel); printf("Informe o número de moradores do imóvel: "); scanf("%d", &num_de_moradores); system("cls"); printf("INFORMAÇÕES DO IMÓVEL: \n"); printf("Número do imóvel: %i\n", num_do_imovel); printf("Área do imóvel: %.2f metros\n", area_do_imovel); printf("Número de moradores do imóvel: %i\n", num_de_moradores); printf("Renda familiar: R$%.2f\n", renda_familiar); valor_taxa_lixo = (area_do_imovel * 0.10f) + (num_de_moradores * 0.50f); printf("VALOR DA TAXA DE LIXO: R$%.2f\n", valor_taxa_lixo); } system("pause"); return 0; }
  20. @Pablo Loschi o comando para limpeza de buffer do teclado é o: setbuf(stdin, NULL), coloque abaixo dos scanf. Mas o problema não é por causa da falta de limpeza no buffer, mas sim na linha: gets("commitments"), está fazendo o uso incorreto da função, basta remover essa linha que já funciona perfeitamente. Não entendi bem o que o seu programa faz na explicação do tópico, porém apenas em olhar o código já deu para perceber onde muito provavelmente está o erro.
  21. #include <iostream> #include <locale.h> #define RENDA_LIMITE 1874.f int main() { setlocale(LC_ALL, "Portuguese"); // Para uso de acentos int qnt_imoveis = 0, num_do_imovel = 0, num_de_moradores = 0; float area_do_imovel = 0.f, valor_taxa_lixo = 0.f, renda_familiar = 0.f; printf("Informe a quantidade de imóveis: "); scanf("%d", &qnt_imoveis); for(int contador = 0; contador <= qnt_imoveis; contador++) { printf("Informe o número do imóvel: "); scanf("%d", &num_do_imovel); printf("Informe a renda familiar: "); scanf("%f", &renda_familiar); if (renda_familiar <= RENDA_LIMITE) { printf("O imóvel de número %i está insento do pagamento da taxa de lixo.\n", num_do_imovel); continue; } printf("Informe o área do imóvel: "); scanf("%f", &area_do_imovel); printf("Informe o número de moradores do imóvel: "); scanf("%d", &num_de_moradores); system("cls"); printf("INFORMAÇÕES DO IMÓVEL: \n"); printf("Número do imóvel: %i\n", num_do_imovel); printf("Área do imóvel: %.2f metros\n", area_do_imovel); printf("Número de moradores do imóvel: %i\n", num_de_moradores); printf("Renda familiar: R$%.2f\n", renda_familiar); valor_taxa_lixo = (area_do_imovel * 0.10f) + (num_de_moradores * 0.50f); printf("VALOR DA TAXA DE LIXO: R$%.2f\n", valor_taxa_lixo); } return 0; }
  22. Meu monitor não acende nada, isso aconteceu depois de uma oscilação de energia, ele fica como se não tivesse ligado na tomada, o que pode ser?
  23. Estou iniciando na programação agora, gostaria de saber quais as linguagens de programação vocês me recomendariam para começar?
  24. Olá, gostaria de saber se a faculdade de Sistemas de informação tem algum problema se eu cursar ela a distancia? Cursando essa faculdade eu também irei aprender sobre hardware? E a parte de programação dela é igual a de outras faculdade relacionadas como Ciências da computação?
  25. @Black Heart sim, eu tive esse mesmo problema com uma placa-mãe da GIGABYTE a 1 mês, o técnico disse que o problema era na placa-mãe, fiz a troca da placa-mãe e estou com o mesmo problema, porém como o socket 1155 saiu de linha eu só encontrei placa-mãe usada. @L3oR3y vou seguir essa dica Obrigado a todos.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!