ANSI C


Demorou, vou assumir, mas finalmente eu programei mais uma estrutura de dados simples, a árvore. Vou preparar uma explicação sobre o que é uma árvore em computação (essa pode ser um pouco complexa) e assim que eu tiver eu posto aqui, mas por enquanto vocês podem ver o código no svn (http://svn.geekvault.org/c/trees)

Have fun.

Certo dia eu estava conversando com um amigo meu sobre C e ele me falou que a coisa que ele mais odiava era ter que tomar cuidado com a ordem dos include que ele fazia quando iniciava um projeto em C. Ora, vamos pensar um pouco, se você incluir duas vezes o cabeçalho stdio.h por exemplo, em dois arquivos diferentes, e incluir os dois, não da erro certo?
(more…)

Quem nunca teve o problema clássico de ter que armazenar uma quantidade X de valores, sem limite máximo e com buscas, remoção e adição em qualquer lugar de forma rápida? Pois bem as listas estão ai exatamente para isso. Claro, poderíamos criar um vetor com um número X, e caso precisa-se, utilizaríamos realloc() para aumentar o vetor. Porém, qualquer coisa que fizéssemos com um vetor (ordernar, busca, remoção, adição) é muito custosa, uma lista ligada nos permite fazer isso de forma rápida, customizáda, e econômica. Vamos explicar aqui a lista duplamente ligada, uma das mais completas, porém vamos mostrar também a teoria de suas variações (lista ligada e lista circular).
(more…)

Uma das coisas mais importantes e pesquisada na programação é a representação de dados no computador, essa área tem o nome de estrutura de dados, sendo uma das áreas principais no estudo da programação para computadores. Existem vários tipo de estrutura de dados clássicos, cada um com sua utilização, hoje vamos estudar como funciona a Pilha.
(more…)

Pessoal, eu não morri não, isso se chama final de semestre na faculdade. Mas aos poucos as coisas ficam mais tranquilas.
Até lá, fiquem com a documentação do servidor Bucket Sort, eu demorei para lançar esse código pois era para um trabalho da faculdade, mas agora, ainda não 100% pronto, mas, lá está, assim que eu tiver tempo eu explico com calma a idéia ok? A documentação está aqui.

Ola, eu não esqueci de vocês não, apenas estou sem tempo com o final de semestre na faculdade. Então, para não deixar vazio, vamos mostrar como criar arquivos temporários em C.
Arquivos temporários são utilizados para uma vasta gama de utilidades, sendo que a mais comum é a comunicação entre processos. Isso mesmo, você leu direito, para dois processos se comunicarem é mais do que comum utilizarmos arquivos temporários. Isso quer dizer, por exemplo, que a maravilhosa função pipe() nada mais é do que uma criação de arquivos temporários. (more…)

Bom, dito e feito, realmente para criar um servidor que não ficasse bloqueando no read(), ou no accept(), a melhor forma(talvez única) era utilizando fcntl(). O código está um pouco sujo ainda (por exemplo, temos o readLine.c e readLine.h que eu iria utilizar para ler do buffer, mas encontrei uma forma mais “rápida”), estamos lendo do pipe duas vezes, acredito que podemos ler apenas uma vez. Detalhes, detalhes bons para um patch que farei assim que possível. Junto com o patch, vou escrever e descrever esse código completamente, para que ninguém tenha dúvidas sobre o que o fork() faz, como fazer comunicação entre filho e pai e como trabalhar com funções não bloqueadoras, mas que deveriam ser (read() e accept() neste caso).
Enfim, façam o update do svn. A documentação já foi passada para a versão 1.0.

Mais um para a biblioteca de programas C, dessa vez é um servidor ECHO modificado que aceita até 10 conexões, concorrentes, ouve na porta 7777 e se receber a string “STOP SERVER” termina o servidor.
Mais tarde eu comento sobre esse programa, mas ele limpa todos os processos, e possui relativamente uma boa manutenção de memória. Fiz esse programa mais para demonstrar como funciona o fork() e como fazer um filho sair corretamente e o pai pegar essa saida e tratar caso ela seja um erro, nada mais clássico que um servidor.
Porém, como nada é perfeito, a função read() é do tipo locking, ou seja ela trava o programa até conseguir ler alguma coisa do buffer, travando o servidor. Ainda estou trabalhando em como arrumar isso, acredito que com fcntl() consigo resolver isso.
Quem quiser ver essa primeira versão, o svn está http://svn.geekvault.org/c/echo/.
A documentação você encontra aqui.

Quando eu comecei a programar em C, eu sempre tive a curiosidade de por que eu não poderia fazer isso:

char buff[];
scanf(”%s”,&buff);

para pegar uma string de qualquer tamanho do teclado. Obviamente isso não funciona em C, já que em C você precisa manipular a memória na forma mais básica possível, depois que aprendi a utilizar malloc() e realloc(), isso ficou simples.
A idéia é bem simples:
1)Inicializar uma pequena string vazia
2)entrar em um loop que vai fazer (até encontrar ‘\n’):
1.pegar um caractere por vez e armazenar em uma variável temporária
2.contar o tamanho (atualizado) da string digitada
3.se o tamanho for maior que o incial:
1.reallocar a memória com 2 a mais(um para o caractere, um para o final)
4.Colocar o caractere recebido, no final da string
Claro que tudo isso tem que ser feito com muito cuidado para não estourar a memória e tudo isso que já sabemos.
Vamos ao código então, ele é bem simples, e adaptar em uma função para o seu programa em C fica praticamente patético (apenas coloque um return *buff; no final ;)).
(more…)

Threads são coisas fantásticas, você pode executar mais de uma coisa ao mesmo tempo com elas :O

Obviamente, caso você não tenha mais de um processador, não é exatamente ao mesmo tempo que as coisas são executadas, mas sim aos poucos. O assunto de threads é muito complexo, e não vou de forma alguma explicar aqui todos os seus problemas, suas diferenças com fork, ou como resolver coisas do tipo Race Condition, vou apenas mostrar uma introdução básica às mesmas, e mostrar como criar uma simples thread, e a diferença básica entre ela e o fork.

(more…)

Next Page »