- ATENÇÃO: Este site está aposentado.
Não receberá posts nem comentários novos. Para ler dicas mais recentes, vá no Stack Overflow. Livros da equipe do CODARE
Expressões Regulares
Uma Abordagem Divertida
de Aurelio Marinho Jargas
Shell Script Profissional
de Aurelio Marinho Jargas
PHP-GTK
de Pablo Dall'Oglio
PHP Programando com Orientação a Objetos
de Pablo Dall'Oglio
Ruby: Conhecendo a Linguagem
de Eustáquio Rangel (TaQ)
Category Archives: C
C: Escondendo o conteúdo de structs com tipos incompletos
Algumas vezes é possível utilizar alguns paradigmas de orientação à objetos em C. Ao se projetar uma biblioteca, podemos encapsular o conteúdo das structs usando tipos incompletos e provendo funções para manipular o conteúdo destas. Imagine uma biblioteca que cria … Continue reading
C, C++: cannot open shared object file
As bibliotecas compartilhadas são carregadas no início da execução de um programa. No Linux, o dynamic loader procura pelas bibliotecas em /lib e /usr/lib. Caso a biblioteca não esteja presente neste caminho, recebemos uma mensagem de erro parecida com a … Continue reading
Posted in C, CPP, Linux
Tagged -rpath, biblioteca, error, gcc, ld, LD_LIBRARY_PATH, linker, shared libraries
7 Comments
C: Múltiplos programas no mesmo binário
Um mesmo aplicativo pode se comportar de forma diferente dependendo da forma como é invocado. No exemplo a seguir, o mesmo programa é usado para calcular a raiz quadrada e potência de dois de um dado argumento. #include <libgen.h> #include … Continue reading
C, C++: Dupla negação para conversão em booleano
Em C não existe um tipo nativo booleano, temos 0 como falso e tudo diferente de 0 é verdadeiro. Em C++ existe o tipo booleano, onde verdadeiro e falso correspondem respectivamente a 0 e 1. Uma forma de fazer um … Continue reading
C: Descobrir se um processo está em execução
No Linux é muito comum um daemon, durante sua execução, criar um arquivo .pid dentro de /var/run. Dentro do arquivo syslogd.pid, por exemplo, contém o PID da instância do syslogd em execução. Usa-se este mecanismo para impedir que duas instâncias … Continue reading
C, C++: Vetores de tamanho zero
Um recurso bastante útil do GCC (apenas) são vetores de tamanho zero. O uso é permitido apenas como último elemento de uma estrutura de dados. struct pessoa { int idade; char nome[0]; }; printf(“%d\n”, sizeof(struct pessoa)); // Imprime “4” Note … Continue reading
C: Indo para background com o daemon()
A forma tradicional de um programa ir para background é fazendo um fork(), terminar o processo pai e criar uma nova sessão com setsid(). Outra forma mais simples, que de fato encapsula tudo isso e mais um pouco, é apenas … Continue reading
C, C++: Cuidado com funções definidas como macros
Imagine uma função definida em uma macro que faça a potência de dois de um determinado número. Ela poderia ser definida da seguinte forma: #define quadrado(n) \ n * n Acontece que o comportamento, dependendo dos parâmetros, nem sempre é … Continue reading
C, C++: Usando a seção de dados
As variáveis da pilha de execução, são automaticamentes desalocadas quando a mesma retorna. No caso do exemplo a seguir, o retorno da função teste() é o endereço de memória da string “Teste123” (ou seja, para onde str aponta e não … Continue reading
C, C++: Banir funções usando o pré-processador
Quem usa o GCC pode tirar vantagem do pré-processador para banir de vez do código algumas funções consideradas maléficas como gets() e sprintf(), por exemplo. Basta acrescentar no seu código a seguinte linha: #pragma GCC poison gets sprintf Um erro … Continue reading
C, C++: Obter macros definidas pelo pré-processador
Palavras-chave: C, pré-processador, macros, macro, define, gcc O pré-processador do GCC define uma série de macros por default. Muitas delas podem lhe ser útil, caso se deseje que um determinado bloco de código seja compilado para apenas uma determinada arquitetura, … Continue reading
C, C++: Fechar a saída padrão e de erro (stdout, stderr)
Uma forma de impedir que seu programa imprima na tela, seja por linkar com uma biblioteca que abusa da verbosidade ou para garantir que um daemon não polua seu terminal quando for para background, é fechando a saída padrão (stdout) … Continue reading
C, C++: Parâmetro não utilizado
Palavras-chave: warning, unused parameter, variable Em alguns casos temos que implementar uma função (na maioria dos casos uma callback) cujo o protótipo já é definido pela API utilizada. Alguns parâmetros podem ser desnecessários, mas geram warnings de compilação caso não … Continue reading
Posted in C, CPP
4 Comments
C, C++: Alocação dinâmica na pilha
Palavras-chave: non-constant initializers, dynamic stack allocation Muitas vezes alocamos memória para um buffer baseado em um tamanho que é passado como parâmetro para a função. Como no seguinte exemplo: void foobar (size_t size) { char *buffer = malloc(size * 2); … Continue reading
Posted in C, CPP
6 Comments
C, C++: Funções com número variável de parâmetros (stdargs)
Palavras-chave: C, C++, varargs, argumentos variáveis Para escrever funções que aceitam quantidade variável de parâmetros, usa-se o mecanismo de stdargs do C. Para isso coloca-se “…” como último parâmetro na declaração da função e depois usa-se as funções de stdarg.h … Continue reading
Posted in C, CPP
6 Comments
C: Ler linhas de um arquivo texto de maneira portável
Palavras-chave: C, arquivo texto, linhas, leitura, getline Como dito num post anterior, a glibc possui uma função para ler linhas de comprimento arbitrário de um arquivo texto. Mas como esta função é especifica a glibc, alguns leitores pediram uma versão … Continue reading
Posted in C
12 Comments
C: Checar se arquivos de entrada e saída são diferentes
Palavras-chave: C, stdin, stdout, descritor, descriptor, inode, comparar, compare Ao escrever filtros (programas que processam dados provenientes da entrada padrão e os escrevem na saída padrão) pode-se querer evitar que o arquivo de entrada seja o mesmo arquivo utilizado para … Continue reading
Posted in C
Comments Off on C: Checar se arquivos de entrada e saída são diferentes
C: Linkagem estática não encontra funções
Palavras-chave: C, linkagem estática, undefined reference, referência indefinida Ao linkar programas que usam bibliotecas estáticas que por usa vez usam outras bibliotecas estáticas, pode ocorrer de o linker reclamar da falta de símbolos de uma das bibliotecas, apesar de eles … Continue reading
Posted in C
4 Comments
C: Macros como funções com o while (0)
Palavras-chave: C, macro, multi-statement, cpp, pré-processador, preprocessor Com alguma freqüência é necessário de definir macros com múltiplos comandos (statements) que possam ser usados de forma sintaticamente equivalente a chamadas de função. Nesse caso, não basta definir uma seqüência como: #define … Continue reading
Posted in C
4 Comments
C: varargs com macros no gcc
Palavras-chave: C, gcc, cpp, macros, …, varargs, número de parâmetros variável, variadic macros Para escrever macros de função com número variável de argumentos: #define DPRINT(fmt, …) printf(“DEBUG: “fmt”\\n”, ## __VA_ARGS__) __VA_ARGS__ será substituído pelos parâmetros dados. E o ## entre … Continue reading
Posted in C
11 Comments
C: Alocação automática de memória com GNU asprintf()
Palavras-chave: C, sprintf, snprintf, asprintf, formatando strings com tamanho variável Inspirado pelo post do Kojima eu resolvi postar uma dica para um problema similar: normalmente precisamos formatar algum texto usando a função sprintf(), porém ela requer um buffer pré-alocado. Bem, … Continue reading
Posted in C
12 Comments
C: Redirecionando stdout
É comum em utilitários que rodam em um terminal e escrevem na saída padrão (stdout) a existência de um parâmetro que permite redirecionar a saída para um arquivo (geralmente -o). Uma maneira simples de implementar essa redireção é copiando o … Continue reading
Posted in C
Tagged C, descriptor, descritor, redireção, redirection, stdout
Comments Off on C: Redirecionando stdout
C: Performance: percorrendo vetores de bytes
Palavras-chave: C, memória, otimização, arrays, vetores, bitmap, pixmap Ao se escrever código para manipulação de strings ou imagens, é comum percorrer grandes vetores de bytes. A maneira óbvia de fazer isto é algo no estilo de: char *ptr= buffer; for … Continue reading
Posted in C
8 Comments
C: Segmentation fault em programas OpenGL com multi-threading
Palavras-chave: OpenGL, Linux, multi-thread, drivers NVidia, crash, segmentation fault, segfault Se seu programa explode em uma função OpenGL sem nenhum motivo aparente, verifique se a chamada está sendo feita desde a thread onde a OpenGL foi inicializada. As bibliotecas que … Continue reading
Posted in C, Linux
2 Comments
C, C++: Transformar macros e identificadores em strings
Palavras-chave: C, C++, CPP, macro, string, identificador Para transformar o nome de um macro ou identificador em string: #define STR(s) #s Para transformar o valor de um macro ou identificador em string: #define STRV(s) STR(s) O seguinte exemplo ilustra a … Continue reading
Posted in C, CPP
3 Comments
C: Performance: uso eficiente da memória cache
Palavras-chave: C, memória, cache, performance, velocidade Todo processador hoje em dia possui memória cache, que ajuda a melhorar a performance, armazenando os dados mais recentemente acessados, para acesso mais rápido pelo processador. O que nós freqüentemente ignoramos é que a … Continue reading
Posted in C
8 Comments
C: Ler linhas de um arquivo texto
Palavras-chave: C, arquivo texto, fgets, linhas de comprimento arbitrário O método típico para se ler um arquivo texto linha a linha é usando a função fgets() com um buffer estático. O problema é que nem sempre sabemos qual será o … Continue reading
Posted in C
9 Comments