paulo1205
(usa Ubuntu)
Enviado em 25/03/2016 - 11:22h
joaovirgili escreveu:
É, eu coloco os printfs dentro das funções booleanas apenas para testes, a depender do usuário eu edito. Tem problema utilizar uma função booleana com printf? Eu faço função booleana pq prefiro trabalhar com ela.
Se você não vai usar o valor retornado pela função, poderia simplesmente não retornar nada (tipo de retorno
void).
Não entendi muito bem o q vc quis dizer nesse segundo paragrafo, foi mal :/
Sobre sinalizar erros na saída de erros?
Em termos práticos, em vez de você usar o mesmo canal para mensagens normais e mensagens de erro, você deveria usar o canal separado para erros oferecido pelo C. Compare as duas formas.
/* Misturando mensagens normais com mensagens de erro. */
printf("Esta é uma mensagem normal.\n");
printf("Esta é uma mensagem de erro.\n");
/* Separando mensagens de erro das normais. */
printf("Esta é uma mensagem normal.\n");
fprintf(stderr, "Esta é uma mensagem de erro.\n");
Normalmente, tanto a saída padrão quanto a saída de erros são associadas ao terminal, mas você pode mudar isso por meio de redirecionamentos, podendo redirecionar apenas um dos canais, ou redirecionar ambos para destinos separados.
Vai ser extremamente útil para você agora? Possivelmente não para um programa pequeno como o seu, que tem pequenas chances de dar erro. De todo modo, trata-se de uma boa prática, usada universalmente. No mínimo, seria bom adequar-se a ela só para estar de acordo com o que a comunidade de programadores em C esperaria encontrar. Contudo, se você seguir a carreira de desenvolvimento de software, verá, mais cedo ou mais tarde, que é muito útil, durante a depuração de programas complexos, separar mensagens de naturezas diferentes.
É pq pelo que entendi, Primeiro não é o primeiro item da lista, ela apenas mostra qual é o primeiro item, com Primeiro->Prox apontado para ele. Se tiver 3 itens na lista, é como se tivessem 4 declarados, onde 1 declarado (Primeiro) não está na lista, está apenas mostrando qual é o primeiro item da lista. Aprendi por este video :
https://www.youtube.com/watch?v=fzT3g4T9TiI
Não consegui abrir o vídeo (meu computador morreu -- está aberto aqui do meu lado, com eu tentando salvar os dados, mas até o RAID1 que eu tinha parece que foi detonado na pane elétrica --, e o notebook que literalmente tive de desengavetar não conseguiu abrir o YouTube porque está com plugins muito velhos). Mas nem precisa.
Se você usa
Primeiro->Prox para aceder ao primeiro elemento, não deveria também, por simetria, usar
Ultimo->Ant para designar o último, especialmente numa lista duplamente encadeada? Só que você não faz isso, e as coisas funcionam. Isso necessariamente implica, por simetria, que pode também usar
Primeiro diretamente para aceder ao primeiro elemento de fato.
Em tempo: quando eu estudei listas encadeadas na faculdade (e não era faculdade varejão-do-ensino, não; eu estudei na UFRJ), fizeram a mesma coisa que o cara do YouTube cujo vídeo você viu. E eu sempre achei um desperdício um nó alocado e sem uso, a não ser pelo ponteiro. Numa estrutura simples (como a sua, cujo dado é apenas um valor inteiro), isso pode ser pouco relevante, e menos relevante ainda quando se está num sistema com vários gigabytes de memória. Mas a coisa não é bem assim quando o dado é complexo e volumoso, ou quando se está num sistema de pequeno porte, como hardware embarcado usando microcontroladores com quantidade de memória que às vezes é menor do que 1kiB.
Mais tarde eu entendi, quando tentei por conta própria implementar uma lista sem o desperdício, que fazer do modo como foi mostrado na faculdade ajudava a simplificar algumas operações. Na verdade, talvez fosse o único meio de fazer lá na faculdade, usando aquela linguagem fedorenta chamada Pascal (que era o que se ensinava nas faculdades brasileiras em 1991 -- e era Pascal ISO, nem era o Turbo Pascal, que era um pouquinho mais amigável). Mas, em C, certamente dá para fazer melhor.
Então devo liberar a memoria no final de tds as funções? Não né? Porque no caso da Insere , se eu liberar, perco os valores armazenados na lista. Devo então no final do programa liberar ou apenas liberar em funções como a do auxiliador, em q eu armazeno informações e depois não usa mais.
Como eu disse antes, você deve liberar memória que esteja prestes a ficar completamente inacessível, por não haver mais nenhum ponteiro apontando para elas. Não é o caso de sua função de inserção, pois mesmo quando a função acaba e, consequentemente,
aux deixa de existir, você já fez com que um dos ponteiros da lista passasse a apontar para a região alocada.
Na verdade, eu até frisei que o lugar mais provável para fazer a liberação seria na função que remove itens da lista.
Outra dúvida, qual o editor de texto do linux mais recomenda? estou usando o notepadd, que é o notepad++ do windows mas no linux. Como disse, sou novo no linux, sempre usei o linux e alguma ide.. Estou me adaptando a ele por causa da faculdade.
Eu não gosto de recomendar editores porque passa por uma questão de gosto e de cultura. O que eu posso fazer sem receio é dizer qual o editor que eu mais uso no dia-a-dia e por quê, e também fazer alguns comentários acerca dessa escolha.
Minha principal ferramenta de edição de texto, incluindo programas de pequeno porte (que constituem a maioria dos programa que eu faço, pois eu não sou desenvolvedor, mas sim um profissional de infraestrutura que faz programas que automatizem ou simplifiquem algumas tarefas, é o
vim. Algumas razões pelas quais ele é o que eu mais uso são as seguintes:
- antes de conhecer o
vim, eu já usava o
vi ou
nvi havia alguns anos, então já estava acostumado com o jeito de trabalhar (para você ter uma ideia, eu não uso as teclas de setas para navegar pelo texto, mas as mesmas teclas usadas nos velhos terminais seriais de texto puro, através dos quais eu comecei a mexer com UNIX);
- eu gosto de usar expressões regulares em operações de busca e substituição;
- muito frequentemente eu edito textos dentro de uma sessão remota, estabelecida com ssh, e boa parte dessas máquinas não tem X11 instalado, de modo que não dá exportar display ou permitir uso de VNC, a fim de usar um editor gráfico (além do quê, mesmo se fosse possível, seria mais lento);
- eu gosto de poder usar filtros de texto por meio de comandos externos, sem ter de sair do editor ou usar
copy-and-paste de/para outro documento;
- quando quero alguma coisa além do que o
vi original oferecia, normalmente os recursos do
vim são suficientes para as coisas de pequeno porte com que lido (por exemplo,
syntax highlighting).
Por outro lado, eu estou longe de ser muito proficiente com o
vim. Por exemplo, eu sei que existe um modo de edição em bloco visual, mas eu nunca usei. Suponho que existam também recursos de
refactoring[, mas como eu só preciso desse tipo de coisa muito raramente (ainda mais com meus programas pequenos), nunca procurei conhecê-los.
Ao mesmo tempo, como programar não é a alma do meu trabalho diário, nunca tive interesse em estudar um editor ou ambiente que pudesse maximizar meu desempenho como programador.
Nas raras vezes em que programei para ambiente gráfico, gostei muito de usar o QtCreator. Seu editor tem um bocado de recursos, incluindo
refactoring e até algum grau de sincronização entre arquivos correlatos. Ele tem até um modo básico de compatibilidade com
vim. Mesmo assim, senti falta de coisas que faço no dia-a-dia com o
vim, e que não têm correspondente imediato.