Páginas

quarta-feira, 12 de outubro de 2011

Compilador Cmm

Olá pessoal, estou publicando mais um trabalho da universidade.. um compilador para uma linguagem cmm que tem como alvo uma maquina de pilha. Esse trabalho pode interessar pelo código fonte para aqueles que pretendem fazer um compilador:

quarta-feira, 25 de maio de 2011

visual studio -> erro: mfc90d.dll não encontrado

Recentemente eu precisei executar um exemplo em MFC/C++ no Visual Studio 2008. O problema é que o projeto havia sido criado no Visual Studio 2005 para uma plataforma diferente.

Quem quiser baixar o projeto aqui o link: http://msdn.microsoft.com/en-us/library/zz9355ha%28v=vs.80%29.aspx   (Achei muito interessante porque tem um botão personalizado uando o MFC. Procurei por isso por um bom tempo) 

Durante a compilação do projeto encontrei os seguintes erros:
error LNK1104: cannot open file 'mfc90d.lib'
error LNK1112: module machine type 'X86' conflicts with target machine type 'IA64'

Para quem estiver com problemas para rodar programas em C++ feitos em versões anteriores do visual studio aqui vai uma dica:

Clique no menu:
Project > Properties

Clicar no botão "Configuration Mananger" e escolher "Active Solution Plataform" como "Win32"


na guia "Linker > General"

em "Add Library Directories" adicione o valor:
"C:\Arquivos de programas\Microsoft Visual Studio 9.0\VC\atlmfc\lib\"
 
na quia "Linker > Advanced" na opção "Target Machine" selecione "MachineX86(MACHINE/X86)"

Com isso eu consegui compilar e executar o projeto com sucesso!

quarta-feira, 11 de maio de 2011

Estrela com cantos arredondados no silverlight

Aqui um user control que eu fiz ha um tempo (há mais de um ano) no silverlight versão 2;
Exemplos:O código fonte pode ser baixado aqui:

Redes Neurais Artificiais - Algoritmo do Back Propagation

Mais um vídeo legal sobre redes neurais artificiais que encontrei navegando pelo youtube:

quinta-feira, 5 de maio de 2011

Algoritmos de ordenação de dados

Vejam que video legal que eu encontrei no youtube faz um tempo:




vejam um artigo sobre a declaração de obama: http://overstated.net/2008/02/11/obama-not-bubble-sort

Algoritmos de Teoria dos Grafos

Aqui alguns algoritmos de teoria dos grafos, como percorrer um grafo em profundidade, percorrer um grafo em largura e encontrar o caminho com menor custo.

Seguem a baixo os links para download no meu skydriver:
  1. profundidade e largura e menor custo (funções auxiliares compartilhadas)
  2. menor custo (algoritmo de Dijkstra)
Para executar você vai precisar de uma vesão estável do scilab que pode ser encontrada em: http://www.scilab.org/products/scilab/download . Eu uso a versão 5.3.0.

Triângulo de Sierpinski no scilab (fractal)

Segue o código no scilab para criar esse fractal de forma bem simples usando apenas as matrizes do scilab como estruturas de dados.

para mais informações do algoritmo acessem a wikipedia: http://pt.wikipedia.org/wiki/Tri%C3%A2ngulo_de_Sierpinski

No código, ao se digitar, por exemplo: triangulos(1:2,:)
estamos pedindo a primeira e a segunda linhas do vetor de triangulos completa. No caso cada linha contêm três valores: a primeira linha contem os valores de X e a segunda linha contem os valores de Y para cada triangulo. Ou seja, triangulos(1:2,:) é um triângulo, portanto, passivel de divisão (no caso em três triângulos)http://www.blogger.com/img/blank.gif. o código é bem simples mhttp://www.blogger.com/img/blank.gifesmo. só faz dividir um triângulo em três, e vai fazendo o mesmo para cada triângulo [ triangulos(1:2,:), triangulos(3:4,:), etc. ] no vetor de triângulos.

O código pode ser baixado aqui! Para executar você vai precisar de uma vesão estável do scilab que pode ser encontrada em: http://www.scilab.org/products/scilab/download . Eu uso a versão 5.3.0.

quinta-feira, 24 de março de 2011

B+ Tree -> Indexação de arquivo DBF com implementação em C

Olá, esta é a implementação de uma Arvore B+ (baseada em arquivo) que eu fiz em C. É totalmente funcional. O código atual não está compilado. Funciona em diversos sistemas operacionais com suporte a C standard. (a extensão é cpp, mas o código foi escrito em C) mas para isso talvez seja necessário mudar a quantidade de chaves por pagina (struct no) para que fique exatamente do tamanho de um setor ou cluster de disco.


http://sourceforge.net/projects/btreeindextodbf/


aqui o código fonte para a visualização:

http://btreeindextodbf.svn.sourceforge.net/viewvc/btreeindextodbf/


Aproveito para comentar um pequeno problema que ocorreu. Quando eu fui testar o código rodando em um pendriver (durante uma apresentação) para indexar um milhão de registros o código demorou muito para ser executado (muito mesmo eu não esperei terminar) enquanto que no disco rigido ela demora em média 2 minutos para indexar um milhão de registros. Já usei a página do tamanho do cluster é (4096 bytes) e do tamanho do setor (512 bytes), nenhum dos dois casos deu certo no pendriver, no entanto, quando testei com uma quantidade irrisória de apenas quatro chaves por pagina consegui executar com "sucesso" no pendriver para 1 milhão de registros. Pude observar também que a unidade de armazenamento no pendriver (bem como no hd) é do tamanho do cluster. Criando um arquivo com um caractere e clicando em propriedades do arquivo aparece la "Tamanho: 1 byte, Tamanho em disco: 4096 bytes". Para saber o tamanho do cluster e do setor no windows xp eu fui no ms dos e digitei: "fsutil fsinfo ntfsinfo c:" (esse comando não serve para o pendriver).

A arvore funciona perfeitamente no meu hd, todas as funções auxiliares foram testadas separadamente antes da finalização do algoritmo. Quase todas as alocações tem um free associado, com excessão da raiz que é mantida em memória durante a criação do índice gerando um lixo de memória correspondente à altura da arvore. A raiz é re-utilizada constantemente em um loop para criar o indice para um arquivo dbf já existente. Por isso é mantida em memória ram e gravada no disco em caso de modificação.

Para o problema da indexação de multiplos campos no banco de dados eu optei por concatenar as n chaves ex: "CidadeBairroNome" e usar como uma chave única. No entanto a chave pode ficar muito grande. Para resolver isso eu criei funções para truncar essas palavras em algo com: "CidBaiNom", no entanto isso também é um problema pois podem ocorrer por exemplo "Cida" e "Cide", ou seja, o caractere diferenciador ser o próximo caractere e eu ter escolhido uma quantidade muito reduzida de caracteres.

Eu não sei se seria viável ter um arquivo separado contendo somente as chaves do nó porque, embora eu tivesse uma altura menor na arvore, eu teria o custo adicional de acessar o disco para buscar a chave (busca binária). Em um nó com 4 chaves eu teria a mais pelo menos mais 2 acessos a disco, totalizando 3 acessos (carregar o nó + carregar as chaves), seria como se tivesse uma arvore avl em disco (muito estranho).. eh pensando bem não é uma boa idéia não.

Espero que gostem do meu código, está totalmente em português legivel, programado no Dev-C++ e testado no Visual Studio.

OBS: No segundo link desse post tem uma versão compilada do código. Para executar com um milhão de registros é necessário executar antes "InsereRegistros.exe" que esta na pasta "Um milhao de registros" que gera "banco.dbf" a partir do arquivo "modelo.dbf" que contem apenas 4 registros.