[C] erros no programa

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
 
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
 
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

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.
 
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:
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.
 
Nao me parece que seja isso porque o ultimo elemento retornado pelo argc também é usado.

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.
 
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.
 
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.

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

Cumps
 
Back
Topo