Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Função com Array

Olá, tentei fazer o exercício mas meu código na hora que termino de digitar os 10 elementos o compilador dá erro. Alguém poderia me ajudar? Outra questão, seria melhor eu alimentar o vetor dentro da função soma ou na main como eu fiz no código?

#include <stdio.h>

int soma(int numeros[10]){
    int resultado = 0;
    for(int i=0; i<10; i++){
        resultado = resultado + numeros[i];
    }
    printf("a soma eh %d\n", resultado );
}

int main(){
    int numeros[10];

    for (int i=0; i< 10;i++ ){
        printf("Diga o %d elemento:\n", i);
        scanf("%d", &numeros);
    }
    soma(numeros[10]);
}
5 respostas
solução!

Olá Douglas,

existem alguns conceitos aqui que são um pouquinho mais complicados do que parecem e exigem que a gente passe com mais calma por eles (eles serão vistos com todos os detalhes na próxima atividade: "Ponteiros e Endereços de Memória").

Os detalhes são esses aqui:

1 - A primeira linha da função deve ser:

int soma(int numeros[]){

e não

int soma(int numeros[10]){

Pode parecer estranho que a função não saiba o tamanho do vetor, mas é assim mesmo, você não deve passar o vetor inteiro, copiando elemento a elemento, mas apenas uma indicação de onde começa o vetor, podendo assim percorrê-lo do jeito que quiser.

2 - A linha da chamada da função deve ser:

soma(numeros);

e não

soma(numeros[10]);

pois o identificador numeros é o cara que tem a indicação pra onde começa o vetor. Quando você usa numeros[10] é como se ele tivesse pegando a posição de início do vetor (indicada pelo "numeros") e pegando 10 elementos pra frente, deixando você em uma posição da memória que não foi reservada e, por isso, dando o erro de Falha de Segmentação que você deve estar recebendo.

Se essas duas coisas parecerem estranhas agora, não se preocupe. Na próxima aula elas já serão explicadas melhor.

Depois de alterar essas duas coisas, seu programa vai funcionar, mas ainda vai estar com um errinho. Esse daí eu deixo pra você resolver, afinal ler as mensagens que o compilador nos dá e procurar erros no código é uma parte importante da programação! :)

Ah, e respondendo a segunda pergunta. É melhor que a função faça apenas o que ela diz que faz. Se ela se chamar "soma", alimente o seu vetor no main e deixe que a função apenas some os elementos.

Olá Alessandro, muito obrigado pela resposta. Mas esse errinho que você você comentou não consegui identificar. O programa está rodando mas o resultado da soma dos elementos da array está dando um valor absurdo.

#include <stdio.h>

int soma(int numeros[]){
    int resultado = 0;
    for(int i=0; i<10; i++){
        resultado = resultado + numeros[i];
    }
    printf("a soma eh %d\n", resultado );
}

int main(){
    int numeros[10];

    for (int i=0; i< 10;i++ ){
        printf("Diga o %d elemento:\n", i);
        scanf("%d", &numeros);
    }
    soma(numeros);
}

Olá Alessandro, depois de quebrar muito a cabeça finalmente achei onde eu errei no meu código. No momento que eu alimento o vetor eu estava esquecendo de indicar no scanf qual posição do vetor eu estava alimentando.

Também fiz uma outra alteração, que no meu ponto de vista fica mais fácil de entender o programa, eu declarei o vetor numeros e o a variável resultado como uma variável global, porque eu uso em ambas funções. Após estas alterações o meu código ficou assim:

#include <stdio.h>

int numeros[10];
int resultado = 0;

int soma(){
    for(int i=0; i<10; i++){
        resultado = resultado + numeros[i];
    }
    return resultado;
}

int main(){

     for (int i=0; i< 10;i++ ){
        printf("Diga o %d elemento:\n", i);
        scanf("%d", &numeros[i]);
    }
    soma(numeros);
    printf("A soma eh %d\n", resultado);
}

Parabéns, Douglas! O errinho era esse mesmo!

Pra completar e deixar o seu programa limpinho, melhore ainda mais utilizando aquilo da função fazer apenas o quê ela diz que faz: experimente deixar a variável resultado apenas dentro da função, e utilize o valor que você já está retornando para acessar essa informação no método main!