Ir para conteúdo
Fórum Script Brasil

== Douplus ==

Membros
  • Total de itens

    203
  • Registro em

  • Última visita

Tudo que == Douplus == postou

  1. Tá certo, se criar um construtor que recebe (void) este código funciona, qual é a grande heresia nisso?
  2. Que tal essa: template <class T> struct lista_ligada { lista_ligada(T info) { item = info; } // Eu já poria l = NULL aqui. T item; lista_ligada<T>* l; }; public : opcao* NovaOpcao(area* ax, SDL_Surface* h, int offx, int offy) { opcao* r; if (ooo == NULL) //Primeira área a ser adicionada. { ooo = new lista_ligada<opcao>(opcao(ax, h, offx, offy)); ooo->item = opcao(ax, h, offx, offy); ooo->l = NULL; qtde = 1; //ColocaFoco(&(ooo->item)); foco = &(ooo->item); r = &(ooo->item); } else { lista_ligada<opcao>* ppp = ooo; while (ppp->l != NULL) { ppp = ppp->l; } ppp->l = new lista_ligada<opcao>(opcao(ax, h, offx, offy)); //<-- não FUNCIONA ppp->l->item = opcao(ax, h, offx, offy); ppp->l->l = NULL; qtde++; r = &(ppp->l->item); } return r; }? Até mais!
  3. Olá. Parte do problema está em: for(i=2;num>=i;i++){ num>=i implica que quando i for igual a num o código dentro do laço for será executado. Ora, num % num = 0 ; desse modo: aux=0; } if(aux==0){ puts("é primo");e o programa dirá "é primo". Se tiver mais dúvidas, poste-as.
  4. Céus! Explique-se! Seilá, não deu pra entender. Vê se isso ajuda: #include <stdio.h> int main(void) { int num = 3; int num2 = num * num; printf("num = %d\nnum2 = %d\n", num, num2); return 0; } num e num2 são variáveis diferentes apesar dos nomes parecidos. Qualquer relação entre elas quem faz é o programador que as nomeou e não o compilador ou a CPU.Não tem essa estória de extensão.
  5. #include<stdio.h> #include<stdlib.h> main(){ int a; printf("Numero: "); scanf("%d",&a); if (a%10==0){ printf("%d e divisivel por 10", a); } if (a%5==0){ printf(",por 5 e"); } if (a%2==0){ printf("por 2"); } system("Pause"); } ... EDIT: Rodou? Que bom!
  6. 1) O operador = é o operador de atribuição, se está querendo comparar use o ==: 2) Na linha 9 a ordem dos parâmetros a serem passados para printf() está errada: printf(a,"%d e divisivel por 10"); //Ao invés de: printf(%d e divisivel por 10", a);
  7. Não é o malloc que chama o destruidor, observe: #include <iostream> using std::ostream; using std::cout; using std::endl; using std::cin; class Teste { friend ostream &operator<<(ostream &, const Teste &); public: Teste(void) { info = 1337;cout<<"Construtor!"<<endl; } ~Teste(void) { cout<<"Destruidor!"<<endl; } private: int info; }; ostream &operator<<(ostream &outp, const Teste &tst) { outp<<(tst.info); return outp; } int main(void) { cout<<(Teste())<<endl; return 0; } Saída: douplus@domain:~/ajudas$ ./teste Construtor! 1337 Destruidor! douplus@domain:~/ajudas$ Isso mostra que chamar um construtor fora de inicialização de variável faz com que ele retorne por valor um objeto da classe e automáticamente o destrói como se tivesse sido criado um escopo para aquele instante. Isso deve ser uma medida de precaução e gerenciamento de memória, uma vez que o esse objeto criado não tem mais como ser tratado no programa. A função malloc() não chama construtor, por isso que se deve usar new em C++. Por isso, e pelo que foi demonstrado no programa de teste, não é a malloc que está chamando o destruidor: o objeto simplesmente se destrói. O próximo passo é entender de onde vem a segunda chamada ao destruidor. A segunda chamada ao destruidor ocorre após o "2" ser mostrado na tela, logo após a chamada de printf() o delete é chamado. Se a memória apontada pelo ponteiro foi alocada sem a invocação do construtor, faz sentido um construtor ser executado com delete sem antes ter sido chamado um construtor? Observe: #include <iostream> using std::ostream; using std::cout; using std::endl; using std::cin; class Teste { friend ostream &operator<<(ostream &, const Teste &); public: Teste(void) { info = 1337;cout<<"Construtor!"<<endl; } ~Teste(void) { cout<<"Destruidor!"<<endl; } private: int info; }; ostream &operator<<(ostream &outp, const Teste &tst) { outp<<(tst.info); return outp; } int main(void) { Teste *tst; delete tst; cin.get(); return 0; } Coloquei um cin.get() para garantir que a chamada do destruidor não ocorre com o término do escopo de main() e sim com delete. Veja a saída: douplus@domain:~/ajudas$ ./teste Destruidor! Segmentation fault douplus@domain:~/ajudas$ O programa sequer esperou a cin.get() e ocorrou uma segmentation fault. Por garantia fiz o teste sem o delete e sem a cin.get(): int main(void) { Teste *tst; //delete tst; //cin.get(); return 0; } Saída: douplus@domain:~/ajudas$ ./teste douplus@domain:~/ajudas$ Sem segmentation fault e sem saída na tela. CONCLUSÕES: 1ª: No seu código, além da invocação explícita do destruidor com o operador delete, houve outra implícita ocasionada pela chamada após o construtor ter retornado o objeto 2ª: Com new o objeto não seria destruído e o construtor provavelmente só seria chamado uma vez neste código. 3ª: O teste que fiz resultou em segmentation fault porque não havia memória alocada onde delete operou. No seu código havia memória alocada por malloc()
  8. Descobri, era um errinho tolo: o retorno da função analyze68kInst era acrescentado a i ao mesmo tempo em que o for incrementava também o i. Então troquei o for por um while e deu certo.
  9. Que idéia genial! Obrigado!
  10. Exatamente isso! Queria saber se teria como alguém carregar algum script malicioso através da minha variável 'page'.
  11. Bom dia a todos, Estava fazendo um site munido de PHP para definir a página do site que deve ser mostrada. Para isso uso uma variável passada pela URL (ex.:"http://...display.php?page=...") e o conteúdo dessa variável representa o nome de um arquivo que é agregado na página com um include<. Isso é perigoso? O servidor que o hospeda bloqueia a inclusão de arquivos de outros sites, mesmo assim essa técnica é pergisa? Grato pela atenção.
  12. Olá a quem lê, Estou trabalhando em uma espécie de editor que ao carregar precisa fazer uma análise de um arquivo. Quando essa análise é feita com o seguinte código ela funciona: // Analysis for (unsigned int i = 0; i < length;) { short size = analyze68kInst(buffer + i, i, refs); if (size == -1) break; else if (size == 0) { size = 2; } i += size; } Entretanto, quero limitar o tamanho permitido para a alocação do buffer pelo programa (valor definido em MAX_BUF_SIZE), e isso acarreta problemas caso o tamanho do arquivo sejamaior que o buffer. Por isso a necessidade em dividir o acesso em vários menores de acordo com o tamanho máximopermitido ao buffer. Tentei uma função assim assim: void Analyzer(std::multimap<UINT32, Reference> &refs, const string filePath, const unsigned int entryPoint, const long unsigned int totBytes) { ifstream fin(filePath.c_str(), ios::binary); unsigned long int bytes = totBytes - entryPoint, access = MAX_BUF_SIZE - 20, currByte = entryPoint, i, onePercent = bytes / 100; unsigned short percentsDone = 0; UINT8 buffer[MAX_BUF_SIZE]; short size; if (!fin.is_open()) { cerr<<"Erro ao abrir"<<endl; exit(1); } cout<<"Analyzing file..."; cout.flush(); do { if (currByte >= (totBytes - MAX_BUF_SIZE)) break; fin.seekg(currByte); fin.read(reinterpret_cast<char *>(buffer), MAX_BUF_SIZE); for (i = 0; i < (access); i++) { short size = analyze68kInst(buffer + i, currByte, refs); if (size == -1) { break; } else if (size == 0) size = 2; i += size; currByte += size; } if ((percentsDone) < ((unsigned short)(100 * currByte / totBytes))) { cout<<setbase(10)<<percentsDone<<'%'<<endl; cout.flush(); ++percentsDone; } } while (size != -1); fin.clear(); fin.seekg(currByte); fin.read(reinterpret_cast<char *>(buffer), MAX_BUF_SIZE); access = fin.gcount(); for (i = currByte; i < access; i++) { size = analyze68kInst(buffer + i, currByte, refs); if (size == -1) break; else if (size == 0) size = 2; i += size; currByte += size; }cout<<"Done!"<<endl; fin.close(); }Essa função apresenta problemas, geralmente, eu sempre crio hipóteses sobre qual deve ser o erro e faço testes para verificá-las, mas, nesse caso, se esgotaram minhas hipóteses. Estou a dias tentando resolver isso no escuro, nunca fiquei sem hipóteses para a causa do problema. Peço, por favor, que me ajudem!. Grato == Douplus ==
  13. Hum... Tenta assim: else if (option != 1 && option != 2 && option != 3)
  14. Oi, Só uma coisa... #include "nome_do_arquivo" (repare as áspas) e fará com que o compilador busque primeiro no diretório do programa. Pelo que me lembro de minhas experiências com o DEV-C++, parece que ele não busca no diretório do programa quando se usa o '<' e o '>'.
  15. Cara, funciona assim: O operador * indica que o valor a ser usado na operação está no endereço em que a variável que o segue tem como valor. O operador & indica que o valor a ser usado na operação é o endereço da variável que o segue. O operador [num] indica que o valor a ser usado na operação está no endereço que equivale ao valor da variável que o antecede mais o valor de num. Resumindo: var ----> valor de var &var --> endereço de var *var --> valor apontado por var Suponha: var está no endereço 0x13333337 onde há o valor 6: &var equivale à 0x13333337; var equivale à 6; *var equivale ao que está no endereço de memória 6. ptr está no endereço 0x12345678 onde há o valor 0x13333337: &ptr equivale à 0x12345678; ptr equivale à 0x13333337 (&var); *ptr equivale ao uso de 6 (var). Exemplo: #include <stdio.h> int main(void) { char str[] = "Sou uma string"; char *ptr; ptr = str; printf("str[0] = *ptr --> %c = %c\n", str[0], *ptr); printf("str[1] = *(ptr + 1) --> %c = %c\n", str[1], *(ptr + 1)); printf("str[2] = *(ptr + 2) --> %c = %c\n\n", str[2], *(ptr + 2)); printf("Endereco de ptr (&ptr): %x\n", &ptr); printf("Endereco de str (&str): %x\n", &str); printf("Valor de ptr (ptr): %x\n", ptr); printf("Valor de str (str): %x\n", str); printf("Valor apontado por ptr (*ptr): %c\n", *ptr); printf("Valor apontado por ptr (*str): %c\n", *str); return 0; } Saída: C:\djgpp\mystuff\testes>ptrarray str[0] = *ptr --> S = S str[1] = *(ptr + 1) --> o = o str[2] = *(ptr + 2) --> u = u Endereco de ptr (&ptr): 8ff20 Endereco de str (&str): 8ff25 Valor de ptr (ptr): 8ff25 Valor de str (str): 8ff25 Valor apontado por ptr (*ptr): S Valor apontado por ptr (*str): S C:\djgpp\mystuff\testes> Em C, passagem de parâmetros, para uma função pode ser feita de dois modos: passagem por valor ou passagem por referência. Na passagem por valor, passa-se o valor da variável. Na passagem por referência, passa-se o endereço da variável, podendo-se derreferenciá-la (*) na função chamada e alterar o valor da variável da função chamadora. A função printf() recebe o valor de uma variável para mostrá-lo, mas não o altera; portanto há uma passagem por valor para a função. A função scanf muda o valor de uma variável, portanto precisa saber seu endereço. Exemplo: #include <stdio.h> void valor(int var) { printf("valor() --> &var = %x ----> Diferente do &var em main().\n", &var); printf("valor() --> var = %x\n", var); var = 2; printf("valor() --> Agora var = %x\n", var); } void referencia(int *var) { printf("referencia() --> &var = %x\n", &var); printf("referencia() --> var = %x ----> Igual a &var em main().\n", var); printf("referencia() --> *var = %x\n", *var); *var = 2; printf("referencia() --> Agora *var = %x\n", &var); } int main(void) { int var = 0x80; printf("main() --> &var = %x\n", &var); printf("main() --> var = %x\n\n", var); valor(var); printf("\nmain() --> var = %x\n\n", var); referencia(&var); /* O & indica que passamos o endereço de var */ printf("\nmain() --> var = %x\n", var); return 0; } Saída: C:\djgpp\mystuff\testes>funcval main() --> &var = 8ff30 main() --> var = 80 valor() --> &var = 8ff10 ----> Diferente do &var em main(). valor() --> var = 80 valor() --> Agora var = 2 main() --> var = 80 referencia() --> &var = 8ff10 referencia() --> var = 8ff30 ----> Igual a &var em main(). referencia() --> *var = 80 referencia() --> Agora *var = 8ff10 main() --> var = 2 C:\djgpp\mystuff\testes> [EDIT] Cara, as vezes aprender por teoria é complicado, até pra escrever isso tive que revisar algumas vezes. No fundo, é como se a função scanf() fosse declarada assim (é só uma simplificação): void scanf(char *format, int *arg1, int *arg2...); recebendo referências das variáveis; enquando printf() void printf(char *format, int arg1, int arg2...); // Valores. P.S.: scanf() na verdade é declarada assim: int scanf( const char *format, ... );mas isso é outra estória, caso queira sabê-la e caso entenda Inglês dê uma olhadela em http://www.eskimo.com/~scs/cclass/int/sx11b.html . Até mais!
  16. Olá, Psy~ Posso fazer uma pergunta quase pessoal? Por que você quer fazer um teclado digital? É um pergunta importante porque o que você vai precisar fazer varia muito dependendo da intenção. Se você quer fazer um para evitar keykoggers, ao que me parece de nada adianta ser um global (para todos os jogos) usando hooks para o teclado, pois teria o mesmo efeito de digitar diretamente. Tem que ser um exclusivo para o Tibia, se você usa Windows teria que usar as funções disponibilizadas pelo sistema para injetar diretamente a senha no espaço de memória que o jogo usa, e provavelmente teria que fazer uma nova versão pra cada atualização que houver no Tibia. Se você é iniciante em C, não vai achar nada muito claro na net. Mas me parece que você já tem experiência com programação pelo menos com scripts segundo o que achei de você na net. Então eu recomendo calma, vai aprender C facilmente. A programação para Windows é o mais complicado que vocêê vai precisar aprender, além de, claro, um pouco de engenharia reversa para achar dentro do cliente do Tibia o campo onde é armazenado a conta e a senha. É um trampinho pra quem não está acostumado, talvez até para quem esteja, heheh. Se você ainda não começou com C ou está bem no começo, tem bons tutoriais postados aqui no fórum, recomendo que aprenda pelo menos até a parte de "estruturas". Depois, use o site de referência da própria Microsoft, nesse link vai encontrar quase tudo que precisa saber do Windows para fazer o trabalho: http://msdn.microsoft.com/en-us/library/ms684847(VS.85).aspx . E você vai precisar de um debugger para achar onde o Tibia guarda as informações de conta e senha que o usuário introduz, recomendo o OllyDbg, busque no google por "OllyDbg" Estou meio sem tempo, mas se precisar de ajuda me mande uma PM ou um e-mail. Bom trabalho! Putz... Já ia esquecendo, tem que descobrir como cria botões no seu programa representando o teclado, é outro trampinho. Boa sorte! Edit: E por último, é um programa pra uso próprio ou para publicação? Se for para publicação tem que deixar uma interface clara de uso, trampinho extra. Senão pode ser algo menos formal. Sugiro que se você for publicar faça o mesmo com o código para que outros possam, no mínimo, aprender com teu trabalho. Opensource é importante.
  17. Estou dentro! Já está enviada. Sugeri meu desafio para o Durub por PM, quem sabe não podemos começar uma série de desafios... Boa sorte, Até mais! Edit-> Bom, pelo menos eu acredito ter enviado, não apareceu na minha "Sent Items", se não recebeu, Durub, me avise!
  18. Logo que eu escreví esse código, fui tomar banho e percebi de um erro nele, na verdade eu o preví mas não sei porque achei ele insignificante. É o seguinte: algumas palavras com repetições de letras e mesma quantidade de números podem causar problema. Por exemplo "aaa" e "aea". Pensei num jeito de resolver, execute o procedimento 2 vezes invertendo a ordem das strings, por exemplo chamando duas vezes a função: if (isAnagram( "aaa", "aea") && isAnagram("aea", "aaa")) resolveria o problema, embora talvez gastasse muito tempo para strings longas
  19. Boa noite! Bom, pra começar eu pensei num algorítmo, daí resolví testar e acabei bolando um programa. Como eu comentei não vou explicá-lo, mas se tiver dúvidas pergunte. Programa: #include <stdlib.h> #include <stdio.h> #include <string.h> short isAnagram(char *string1, char *string2) { short x, y, len; len = strlen(string1); if (len != strlen( string2)) // Se tiver tamanhos diferentes... return 0; // Não são anagramas; for (x = 0; x < len; x++) { // Checa caractere por caractere de string1; for (y = 0; y < len; y++) // Compara cada caractere de string1 com cada caractere da string2; if (string1[x] == string2[y]) // Se achou, pára; break; if (y == len) // Se percorreu toda str2 e não achou... return 0; // Não são anagramas. } return 1; // Se tudo deu certo, são anagramas. } int main(void) { char string1[20], string2[20]; printf("Entre com duas palavras: "); scanf("%s%s", string1, string2); printf("%s", ((isAnagram(string1, string2) ? "Anagramas!\n" : "não são anagramas.\n"))); return 0; }
  20. == Douplus ==

    Problema com switch

    A condição de loop de main está estranha, não tem sentido esse incremento da variável opção, quando o usuário digita 9 o programa incrementa 1 atingindo o 10 que provoca o fim do loop. Mude esse for para algo como: for(opcao=0; opcao<10;)
  21. Não precisa modificar o programa, ele está bom. O que estou falando é de considerar como uma agência cada arquivo de contas que pode ser carregado pelo programa.
  22. Eu consideraria cada arquivo como uma agência distinta, o que faz sentido. Desse modo é mais simples evitar repetições.
  23. Eu consegui aqui: void ler_arquivo(struct conta v[], int *pn) { printf("\nLeitura de arquivo do Caixa Automático\n"); char nome_arquivo[TAM_MAX_NOME]; printf("Nome do arquivo: "); fgetline(stdin, nome_arquivo, TAM_MAX_NOME); FILE *f = fopen(nome_arquivo, "r"); if (f == NULL) printf("O arquivo não foi encontrado.\n"); else { *pn = 0; while (! feof(f)) { fgetline(f, v[*pn].nome, TAM_MAX_NOME); fgetline(f, v[*pn].agencia, TAM_MAX_AGENCIA); fgetline(f, v[*pn].conta, TAM_MAX_CONTA); fscanf(f, "%lf\n", &(v[*pn].cheque)); fscanf(f, "%d\n", &(v[*pn].senha)); //Mudei aqui de "%lf" para "%d" fscanf(f, "%lf\n", &(v[*pn].saldo)); if (v[*pn].nome[0] != '' || strlen(v[*pn].agencia) > 0 || v[*pn].conta[0] != '') (*pn)++; } fclose(f); } printf("Numeros de clientes = %d\n", *pn - 1); printf("Por razões de éticas o saldo da conta não são divulgaos.\n\n"); } [EDITADO] Não ví que você tinha editado :P
  24. Tenta assim: fscanf(f, "%lf", &(v[*pn].saldo)); [EDITADO] A propósito, um site excelente de referência da biblioteca padrão do C / C++ é www.cppreference.com
  25. Acho que se você implementar um sistema de login você simplifica as funções e aumenta a performance do seu progoama, pois as funções não têm que ficar buscando os dados no vetor com a pesquisa já feita uma vez. E você ainda pode mandar uma mensagem de boas vindas com o nome da pessoa cada vez que ela entrar no sistema :)
×
×
  • Criar Novo...