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

[C] erros no programa

Discussão em 'Programação' iniciada por tuniq, 23 de Junho de 2012. (Respostas: 7; Visualizações: 768)

  1. tuniq

    tuniq What is folding?

    Boas,

    tou a tentar resolver um exercicio que diz o seguinte:
    pretende-se desenvolver o programa conversao que faz a conversao de valores num determinado sistema monetario para outro. os valores a converter, assim como o fator de conversao devem ser passados como parametros, na linha de comandos, tal como mostra o exemplo:

    Código:
    ./conversao factor_conversao valor1 valor2 valor3 ............... valorn
    prototipo funcao convert(int nr, float *valores, float factor)

    codigo ficheiro conversao.c que contem a funcao main

    Código:
    #include <stdlib.h>#include <stdio.h>
    #include "funcoes.h"
    
    
    void main(int argc, char **argv) {
        float vector[30];
        float factor;
        float *valores;
        int i, q;
        factor = atof(argv[1]);
        for (i=2;i<=argc;i++) {
            vector[i]=atof(argv[i]);
            }
        valores=vector;
        convert(argc,valores,factor);
        for (q=0;q<=argc;q++) {
            printf("%lf",vector[q]);
            }
        getchar();
    }
    e o ficheiro funcao.c que contem a funcao convert

    Código:
    #include <stdlib.h>#include <stdio.h>
    #include "funcoes.h"
    
    
    void convert(int nr, float *valores, float factor){
        int i;
        for (i=0;i<=nr;i++) {
            valores[i]=valores[i]*factor;
        }
    }
    e o ficheiro funcoes.h com o prototipo da funcao convert

    Código:
    void convert(int nr, float *valores, float factor)
    ao compilar dá segmention fault, nao tou a ver o que está mal... sugestoes ?


    cumprimentos,
    tuniq
     
  2. mauro1855

    mauro1855 I'm cool cuz I Fold

    Assim à primeira vista, deve ser o primeiro ciclo, que queres que execute até i<argc e não i<=argc.

    Acho que seja isso.

    Cumps
     
  3. tuniq

    tuniq What is folding?

    Nao me parece que seja isso porque o ultimo elemento retornado pelo argc também é usado.

    Na compilacao nao da erros, ao executar é que dá erro de falha de segmentação.
     
  4. brunoss

    brunoss Power Member

    A únca coisa que me ocorre é que os argumentos podem ser interpretados como constantes e eventualmente a função atof precise de alterar a string. Por isso experimenta copiar os argumentos.
    Já agora quando chamas a função convert podes e deves passar o array e escusas de ter a variável valores.

    Já agora o que mauro disse está certo... Se o problema não for dai experimenta o que disse
     
    Última edição: 24 de Junho de 2012
  5. manelis

    manelis Power Member

    for (i=0;i<=nr;i++) { valores=valores*factor; }

    Penso que aqui estás a fazer iterações a mais, porque o argv[0] é o nome do programa, e tu estas a dizer que o teu vector tem argc de tamanho, quando na realidade só tem argc-1. Isto não devia dar mal, até porque tu simplesmente começaste a preencher no 1. Fora isso não estou mesmo a ver.

    Já agora, esta linha:

    valores=vector;

    É um bocado inútil, porque estás apenas a criar um novo ponteiro para o mesmo vector.
     
  6. Mach4_PT

    Mach4_PT Power Member

    De 0 a 10 tens quantos números? 11

    A mesma coisa com o argc e o argv, o argc diz-te que tens N argumentos, mas como o vector começa em 0, só podes ir até argv[N-1]

    por isso é que deves fazer i<argc e não i<=argc

    O mesmo se aplica aos outros teus ciclos.
     
  7. manelis

    manelis Power Member

    Por acaso acho que o OP tem razão, porque argv[0] é o nome do programa, e depois o resto são os argumentos. Ou seja, se houverem 3 argumentos o argc é 3, e vão ser os argv[1], argv[2] e argv[3].

    Posso estar errado, nunca usei muito isto.
     
  8. mauro1855

    mauro1855 I'm cool cuz I Fold

    O argc também inclui o nome do programa, ou seja, se ele puser 3 argumentos, o argc vai ser 4.

    Cumps
     

Partilhar esta Página