Debuggando meu printf
Ontem eu consertei muitos bugs no meu printf. Tenho certeza de que ficara pronto até quarta-feira o mais tardar.
Aprendi a usar valgrind e gdb nestes projetos.
Elas são ferramentas incríveis que estão me economizando muito tempo.
Você pode executá-los diretamente do shell ou pode integrá-los com VSCode seguindo estas simples etapas:
Crie uma tarefa de construção com
Terminal > Configure Default Build Task. Isso gerará um arquivo.vscode/tasks.jsonque fala para o VSCode como que ele deve compilar seu programa.Abra
.vscode/tasks.jsone configure os parametros do compilador e o caminho do diretorio com os arquivos fonte:
{
...
"args": ["-g", "* .c", "-o", "a.out"],
"opções": {
"cwd": "$ {workspaceFolder}/path/to/sourcefiles"
},
...
}
- Teste seu build com
Ctrl + Shift + B. Este commando deve abrir um painel na parte inferior da sua tela com uma mensagem de sucesso ou de erro. - Crie uma tarefa de debugging com
Run > Add Configuration > C++ (GDB/LLDB) - Aponte o caminho do
programpara o seu executável:
{
...
"program": "$ {workspaceFolder}/path/to/a.out",
...
}
- Adicione
break pointsno seu código clicando no ponto vermelho na calha do editor. - Inicie o debugger com
F5
DICA DO DIA: Você pode executar gdb em um arquivo coredump para acessar
o estado do seu programa antes dele.
Isso é muito útil ao corrigir segfault.
Hoje vou continuar trabalhando no printf.
Também vou começar um bootcamp Elixir da Rocket Seat. Aprender linguagens funcionais está me ajudando muito a organizar meus projetos de C.
Como minha linguagem principal é ruby, estou acostumada a estruturar meu código em classes e objetos. Isso estava atrapalhando muito o meu progresso em C, já que esses recursos simplesmente não existe na língua e eu estava com dificuldade em organizar meus projetos sem eles.
Depois de criar minha primeira applicação em Phoenix e aprender sobre módulos de funções tudo clicou no meu cerebro: comecei a criar famílias de funções como unidade organizacional e separando as estruturas relevantes para cada. Isso resulta em estruturas de controle eficazes para cada função que são facilmente extensíveis sem a necessidade de classes e objetos.
Meu maior obstáculo foi descobrir todas as combinações de flags que o printf manipula. É arbitrário como elas interagem umas com as outras, e não achei nenhum tutorial online que explica isso direito. Eu aprendi por tentativa e erro, executando uma tonelada de testes e exemplos.