1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Receber por parametro NULL esperando char*

Discussão em 'Programação' iniciada por TheRunner, 24 de Maio de 2009. (Respostas: 9; Visualizações: 960)

  1. TheRunner

    TheRunner Power Member

    Boas

    Sinceramente não sei se o titulo está correcto mas pronto. Estou a fazer um projecto em c em que tenho de trabalhar com listas. O Professor pede para fazer uma função que me encontre uma musica na lista (cada musica é composta pelo titulo, artista e duração) e o cabeçalho da função é assim:

    Esta vai devolver a posição em que a musica se encontra. A outra condição que o stor pede é que um dos valores (titulo ou artista) possa ser enviado como NULL ou seja:

    Eu fiquei um bocado desconfiado quando vi isto no enunciado e quando chegou a altura de fazer a função pus esta a funcionar perfeitamente quando recebia os dois elementos (titulo e musica), mas quando chegou a altura de exprimentar com alguns dos valores a NULL pus um printf na primeira linha da função e quando a mando exercutar nem o printf imprime porque dá logo segmentation fault.

    É possível de fazer o que o stor me pede? :s

    Cumps
     
  2. ApM

    ApM Power Member

    Ola

    sim pode ser feito, mas tens que testar se o parametro vem a null ou nao, por exemplo:

    if (titulo != null){
    printf("%s", titulo);
    }

    e assim distingues se vais usar o titulo como critério da pesquisa na lista ou nao.
     
  3. TheRunner

    TheRunner Power Member

    Sim eu pensei nisso, mas é que ele nem chega a ir para a pesquisa propriamente dita. Tal como disse no post eu meti um printf na primeira linha da função e nada foi impresso apenas seg fault.
     
  4. Baderous

    Baderous Banido

    Mostra-nos como estás a fazer a tua função e como é que lhe passas os parâmetros.
     
  5. TheRunner

    TheRunner Power Member

    Ficheiro processa.c (inclui lista.h):

    Ficheiro lista.c:

    É assim que estou a utilizar.
     
    Última edição: 24 de Maio de 2009
  6. Baderous

    Baderous Banido

    Falta uma vírgula a separar os parâmetros "Lista l" e "char *nome".
     
  7. muddymind

    muddymind 1st Folding then Sex

    deve ser typo... quer dizer, se faltasse a virgula ele compilava? :D

    Já agora, eu há uns meses deparei-me com um seg. fault por tar a usar um NULL quando não era suposto e também tinha um printf que tbm não aparecia e tava 6 linhas acima do erro propriamente dito... Isto para dizer que os compiladores são chatos e que nada te garante que ele não tenha passado o printf :P Faz mas é um debug decente com breakpoint no inicio da função e vê o que realmente se passa ;)
     
    Última edição: 24 de Maio de 2009
  8. TheRunner

    TheRunner Power Member

    A virgula está lá no programa a copiar para aqui devo-a ter apagado lol..

    Não sei bem como se faz um debug, mas vou tentar ;)

    Obrigado pela ajuda
     
  9. muddymind

    muddymind 1st Folding then Sex

    Fazer debug não tem nada de mais... Se estiveres no linux compila com a flag -g e depois corre o programa no gdb. Caso não saibas como trabalhar com o gdb (mas devias :P) podes sempre instalar o ddd que é um front end gráfico do gdb e aí tens obrigação de te "desenrascar" :P

    Já agora, experimenta comentar toda a função "encontrar e deixa apenas o printf e um return 0. Caso não dê seg fault então é mesmo algo q fazes no meio da função e caso continue a dar então é algo de errado q tás a fazer antes de chamar a função :P
     
    Última edição: 24 de Maio de 2009
  10. Baderous

    Baderous Banido

    Para fazer debug podes usar o GDB (desde que tenas compilado com a flag "-g"):
    Supondo que o teu executável tem o nome "prog":
    Código:
    gdb prog //indica ao gdb para debuggar o prog
    run //inicia a execução do prog
    where //dá a localização do problema
    list //mostra o bloco de código onde está a dar erro
    break main //cria um breakpoint na main
    n //avança uma instrução
    p v //mostra o valor da variável v
    step //entra na execucao da próxima instrução
    c //deixa o programa executar até ao fim
     

Partilhar esta Página