Good explanations to have successful with GIT branching model.
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Good explanations to have successful with GIT branching model.
The Infamous Windows “Hello World” Program (A good and archaeological post by Petzold)
Even through times of high and low with the published post… here we are!! today, is a birthday of my blog, we seven years of life!! =]
Aconteceu no último dia 25 de maio o 10° Encontro de Programadores de C & C++, o evento foi muito bacana e contou com uma grade de palestras bem diversificada. abaixo segue lista completa de todas as palestras e os devidos artigos e materiais utilizados pelos palestrantes!
Durante esses dias discutindo com um amigo sobre o acesso a memoria de forma atômica, e durante alguns testes e provas de conceito surgiram alguns problemas devido ao esquema de synchronize ser um recurso dependente da plataforma e compilador.
Como a chamada __sync_synchronize() e nativa no compilador, e dependendo da versão não vai estar disponivel. segue abaixo uma solução:
#include <stdio.h> #ifdef NO_SYNC_SYNCHRONIZE #warning "Ops! Don't have native __sync_synchronize(), using the asm hardcode." # define __sync_synchronize() __asm__ __volatile__ ( "rep;nop": : :"memory" ); #endif #define my__sync_synchronize() __sync_synchronize() int main () { int foo = 0; printf ("Trecho abaixo será atômico!\n"); foo = 0xd34db33f; my__sync_synchronize (); return 0; }
* Levando em consideração o uso sobre a plataforma x86.
Seja Elegante
Talvez possa ser algo que passe despercebido por vários desenvolvedores, porém dúvido quem nunca tenha se deparado com mensagens de “log” vagas ou sem nenhum nexo ou bem pior, como mensagens idênticas replicadas por várias partes do código! 😯
A algum tempo atrás estava trabalhando em um projeto em que um respectivo desenvolvedor da equipe possuia o costume de espalhar ou replicar centenas de printf() pelo código com mensagens tipo!
printf(“!!! FULANO – Aqui!!!”);
ou
printf(“!!! FULANO – Arquivo.cpp: Aqui!!!\n”);
Precisa falar que isto e pessímo? Certo que e preciso um bom senso com o uso de mensagens de depuração pois dependendo ao invés de ajudar podem só atrapalhar. principalmente quando você necessita ter controle sobre tais mensagens, como por exemplo obter a localização da mensagem através do nome da função, arquivo e linha.
O pré-processador do GCC oferece (*) várias macros, as que irei utilizar em questão são:
(*) Mais detalhes sobre as macros do GCC.
A utilização dessas macros irá facilitar a localização das mensagens de depuração, Abaixo um simples exemplo demonstrado em debug1.c.
/** * By Jorge Pereira <jpereiran@gmail.com> * Date: Tue Jun 29 02:51:44 BRT 2010 */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> // Macro condicional #ifdef DEBUG # warning "Debug is enabled" # define TRACE_DEBUG(fmt, ...) \ fprintf(stderr, " ** DEBUG: %s:%d %s(): "fmt"\n", \ __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__) #else # warning "Debug is disabled" # define TRACE_DEBUG(fmt, ...) #endif #define MAX_STRING 5 /* tamanho maximo de uma string */ // Função simples de exemplo... void show_name (const char* name, size_t len) { size_t offset = len; // Verificação qualquer... if (len > MAX_STRING) { // Abaixo mensagem de depuração, perceba que ela será ativada apenas // quando em tempo de compilação você ativar a macro "DEBUG" TRACE_DEBUG ("Ooops! Tamanho da string(%d) e excedeu o limite(%d)...", len, MAX_STRING); offset = MAX_STRING; } // Manipulação qualquer... write (STDOUT_FILENO, name, offset); write (STDOUT_FILENO, "\n", 1); } int main (int argc, char* argv[]) { if (argc < 2) { printf ("Usage: %s <string>\n", argv[0]); exit (1); } show_name (argv[1], strlen (argv[1])); return 0; }
Com este exemplo básico em mãos, vamos compilar e executar.
[jpereira@miracleworld Codes]$ gcc -Wall -o debug1 debug1.c debug1.c:18:3: warning: #warning "Debug is disabled" [jpereira@miracleworld Codes]$ ./debug1 "Jorge" Jorge [jpereira@miracleworld Codes]$ ./debug1 "Jorge Pereira" Jorge [jpereira@miracleworld Codes]$
Imagine que seu sistema possui inúmeros arquivos e você precisa em determinados pontos obter o máximo de informação sobre as mensagens de depuração, talvez seja interessante ter além de uma mensagem objetiva obter juntamente o nome da função, arquivo e linha de onde foi invocada tal mensagem.
[jpereira@miracleworld Codes]$ gcc -Wall -DDEBUG -o debug1 debug1.c debug1.c:13:3: warning: #warning "Debug is enabled" [jpereira@miracleworld Codes]$ ./debug1 "Jorge" Jorge [jpereira@miracleworld Codes]$ ./debug1 "Jorge Pereira" ** DEBUG: debug1.c:36 show_name(): Ooops! Tamanho da string(13) e excedeu o limite(5)... Jorge [jpereira@miracleworld Codes]$
Autor: Jorge Pereira
/dev/old/comments