Ir ao conteúdo
  • Cadastre-se

Manipulação de Variáveis


Delemar Neto
Ir à solução Resolvido por dontpanic,

Posts recomendados

Boa tarde!

 

Tenho a seguinte dúvida...

 

Eu possuo um vetor global "vet" de tamanho "tamvet" a ser definido pelo usuário, então eu desejo criar uma função em que seja passado esses dois parâmetros e dentro dessa função o usuário insira os valores de "tamvet" e "vet", de modo que essas variáveis sejam alteradas e estejam disponiveis dentro do MAIN, de modo que eu possa passa-las novamente como parametro para outras funções utiliza-las...

 

Tentei fazer pelo código abaixo, porém não consigo alterar os valores globalmente, apenas localmente... Alguém pode me ajudar?

 

 

Quando eu defino vetor maior que 20 o programa da erro sempre ao inserir o ultimo valor...

 

 

#include <stdio.h>
#include <stdlib.h>
#include "estatistica.h"
 
#include <string.h>
 
#include <locale.h> //Resolve problema da acentuação
float vetores(float *vet, int *quantEleme){
    int i;
 
    puts("Digite a quantidade de valores do vetor:");
    scanf("%d",&quantEleme);
    if ((vet=(float*)malloc(quantEleme))==NULL){
        printf("Memória insuficiente");
    }
 
    puts("Informe os valores:");
    for(i=0;i<quantEleme;i++){
        printf("Informe o %d valor",i);
        scanf("%f",&vet);
    }
    printf("--------%d--------------",quantEleme);
 
   // free( vet);
    //vet=NULL;
 
 
}
 
main(){
    setlocale(LC_ALL, "Portuguese"); //Resolve problema da acentuação
    int valorMenu=0, i=0, *quantElem;
    float *vet;
    system ("color 0A"); //Colore a letra
    while(valorMenu!=14){
    system("cls");
    titulo();
    printf("\n[1] Média\n[2] Somatório\n[3] Moda\n[4] Variância\n[5] Desvio Padrão\n[6] Amostra Randomica\n[7] Mediana\n[8] Média Geométrica\n[9] Média Harmonica\n[10] Menor Valor\n[11] Maior Valor\n[12] Correlação\n[13] Embaralhar\n[14] Sair");
    printf("\n\nInforme a opção desejada: ");
    scanf("%d",&valorMenu);
        switch(valorMenu){
        case 1:
 
            vetores(&vet,&quantElem);
            printf("--------%d--------------",quantElem);
            /*for(i=0;i<quantElem;i++){
                printf("%f",vet);
            }*/
 
            system("pause");
            break;
 
 
 
 
        default:
            printf("");
        }
    }
}
 
 
 
void titulo(){
    printf("********************************************************************************\n\t\t\t\t\n\t\t\tSistema de Estatistica 1.0\n\n********************************************************************************");
}
 
Link para o comentário
Compartilhar em outros sites

  • Solução

A função vetores não tá retornando  nada, apesar de ser do tipo float.
 
Quanto as variáveis 'vet' e 'quantEleme', precisa-se entender uma coisa.
 
int x; ---> isso é uma variável que retorna um valor int
int *x; ---> isso é um ponteiro que retorna um valor int que vai ser armazenado na memória
&x ---> isso é o endereço de uma variável x
*(&x) ---> isso é um ponteiro que retorna um valor que está no endereço de x, ou seja, é a mesma coisa que escrever apenas 'x'
&(*x) --> isso é o endereço da posição na memória pra onde aquele ponteiro está apontando, ou seja, mesma coisa que escrever apenas 'x' também.
 
Daí aí vai o teu código corrigido:
 

#include <stdio.h>#include <stdlib.h>#include <string.h>void vetores(float**, int*);int main() {    int i=0;    int quantEleme = 0;    float *vet = NULL;    vetores(&vet, &quantEleme);    printf("%d \n", quantEleme);    for (i=0; i<quantEleme; i++) {    	printf("_ %f \n", vet[i]);    }    free(vet);    return 0;}void vetores(float* *vet, int* quantEleme) {    int i;    printf("Digite a quantidade de valores do vetor:\n");    scanf("%d", quantEleme);    if ( (*vet = malloc((*quantEleme) * sizeof(float)) ) == NULL){        printf("Memória insuficiente");        *quantEleme = 0;        return;    }    printf("Informe os valores:\n");    for (i=0; i < *quantEleme; i++){        printf("Informe o %d valor: ", i);        scanf("%f", &(*vet)[i]);    }}

Note que a variável 'quantEleme' deixou de ser um ponteiro e passou a ser apenas uma int normal, pois como o espaço dela na memória é fixo (ela vai guardar apenas um valor por vez), você pode declarar ela normalmente como int e passar ela pra outras funções por referência (usando o '&').

Na função 'vetores', note que o vet deixou de ser do tipo "float*" e passou a ser do tipo "float**" (com dois asteriscos). O motivo disso é porque no main ele já era um ponteiro (ou seja, era do tipo "float*" e representava um endereço na memória) e como você tá passando ele por referência pra função vetores, então tá passando o endereço dele, então a função vetores vai enxergar ele como um endereço de um endereço. Esse era o motivo do erro do teu código.

Uma outra coisa que tava errada era a tua declaração do malloc.
O parâmetro que o malloc recebe vai dizer o quanto de memória ele vai alocar pro teu ponteiro, em bytes.
Então "malloc(quantElem)" vai alocar um número de bytes igual ao valor de quantElem... o problema disso é que um float nem sempre ocupa apenas um byte. Depende do compilador, do sistema operacional, etc.

Pra ficar seguro, você usa "malloc(sizeof(float) * x)", onde 'x' é a quantidade de elementos que você quer alocar pra aquele vetor.

Daí considerando isso, você agora precisa ter alguns cuidados dentro da função 'vetores':

- Como 'quantElem' foi passado por referência, você usa "*quantElem" pra acessar o valor dele e apenas "quantElem" pra acessar o endereço dele. Como a função scanf espera o endereço de uma variável como argumento, então você usa "scanf(..., quantElem)" em vez de "scanf(..., &quantElem)".

- Mesma coisa com o 'vet'. A variável 'vet' apenas (sem os asteriscos), representa o endereço do teu ponteiro. Então no malloc você usa "*vet = malloc(...)" pois daí vai estar guardando o resultado do malloc no ponteiro em si, e não no endereço dele.

- Pra passar o 'vet' pelo scanf você faz uma gambiarra aqui: "&(*vet)"
(*vet) é o teu ponteiro em si.
(*vet) é o teu ponteiro acessando a posição 'i' do espaço de memória dele
E como a função scanf espera o endereço como parâmetro, você passa o endereço disso tudo aí, que é "&(*vet)"

É isso.
Desculpa pelo texto enorme.

Link para o comentário
Compartilhar em outros sites

OK!
Caramba, minha cabeça deu um nó ao tentar ler o algoritmo.
contudo entendi que a dúvida diz sobre as variáveis globais e como são declaradas fora de uma função, é isso;
Veja esse simples exemplo Ex.:

#include <stdio.h>#include <stdlib.h>int fn_show_vetor(int); /*protótipo de função*/char * fn_pegar_vetor(int, int); /*protótipo de função*/char *ptr_vetor = NULL; /*variável globais aqui*//*Funçao Principal chamadora*/int main() {   int largura;        puts("Entre com o tamanho do vetor:");        scanf("%d", &largura);        if(largura > 0)            ptr_vetor = fn_pegar_vetor( largura, 'A' );        else {            puts("Adeus");            return (0);        }        fn_show_vetor( largura );        if(ptr_vetor != NULL)        free(ptr_vetor);    return (0);}/*Cria um vetor dinamicamente do HEAP*/char * fn_pegar_vetor(int largura, int valor){    char * ctmp = NULL;            ctmp = (char*) malloc(largura * sizeof(char));            if(ctmp == NULL) {                puts("Houve erro ao tentar criar vetor.");                exit(EXIT_FAILURE);            }    int i;    for(i = 0;i < largura; i++)        ctmp[i] = valor;    return(ctmp);}/*Exibe os elemento de ptr_vetor de largura x*/int fn_show_vetor(int largura){    if(ptr_vetor == NULL)        return(0);    int i;    for(i = 0; i < largura; i++) {        printf("i = %d\n", i);        printf("ASCII: %c\n", ptr_vetor[i]);        printf("Char: %d\n\n", ptr_vetor[i]);    }   return(i);}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...