Dúvida quanto passagem de ponteiros como referencia em funções void

1. Dúvida quanto passagem de ponteiros como referencia em funções void

Fernando
bellun

(usa Outra)

Enviado em 07/09/2015 - 12:02h

Estou com uma dúvida a respeito de um problema que eu tenho q fazer uma leitura de dados, mas os vetores que serão usadas nas funções só poderão ser passados por referencia através de ponteiros. Acredito eu que esteja fazendo algo muito errado porque o meu DEV c++ quando inicio a compilação e execução do programa ele da não respondendo e fecha. Segue o código:

// Aluno : Fernando Henrique Antero de Moraes


/*
Síntese
Objetivo: Auxilar o usuário no controle de salarios de empregados numa empresa.
Entrada : Quantidade de funcionários, matricula e salário de cada funcionario
Saída :Apresentação em uma tabela dos dados lidos, maior e menor salario
*/

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
#define MAX_FUNC 500
#define MIN_FUNC 1
#define MAX_SAL
#define MIN_SAL


///////////////////// Protótipos////////////////////////////////////////////////
void leValidaQuantidade(int *qtde, int max, int min, char *titulo);
int leValidaInt(char *titulo);
int verificaRepetido(int *matriculas, int ultimoLido);
void leValidaMatriculas(int *matricula, char *titulo, int aux);
void leValidaSalario(float *ptrSalarios,int min,int max, char *titulo, int cont);
float leValidaFloat(char *titulo);
////////////////////////////////////////////////////////////////////////////////
int main(void)
{
setlocale(LC_ALL, "Portuguese");
// Declaracoes
int *ptrQtde;
char titulo[100];
int matriculas[MAX_FUNC];
int *ptrMatriculas=matriculas;
int aux;
int validacao;
float salarios[MAX_FUNC];
float *ptrSalarios=salarios;
// Instrucoes
leValidaQuantidade(ptrQtde, MAX_FUNC, MIN_FUNC, "Informe uma quantidade de funcionários:");
for(aux=0;aux< *ptrQtde;aux++){
do{
leValidaMatriculas(ptrMatriculas, "Por favor informe sua matricula:", aux);
validacao=verificaRepetido(ptrMatriculas, aux);
if(validacao==1){
printf("Matricula repetida, informe novamente!!!");
getch();
system("CLS");
}
}while(validacao==1);
leValidaSalario(&ptrSalarios, MIN_SAL, MAX_SAL, "Informe um salario:", aux );
}
getch();
return 0;
}
// SubAlgoritmo
// Objetivo: ler e validar uma quantidade de funcionarios, quantidade maxima de funcionarios e quantidade minima, referencia ao vetor de titulos
// Parâmetros: refencia ao endereço de memoria do ponteiro de quantidade de funcionarios
// Retorna: sem retorno
void leValidaQuantidade(int *qtde, int max, int min, char *titulo)
{
do
{

*qtde = leValidaInt(titulo);
if(*qtde < min || *qtde > max)
{

printf("ERRO, quantidade inválida, informe novamente: 1....500");
getch();
system("cls");
}
}while(*qtde < min || *qtde > max);
}
// SubAlgoritmo
// Objetivo: ler e validar um numero inteiro
// Parâmetros: referncia ao vetor de titulos
// Retorna: numero inteiro valido
int leValidaInt(char *titulo)
{
int ret, numero;
do{
printf(titulo);
fflush(stdin);
ret=scanf("%d",&numero);
fflush(stdin);
if(ret==0){
printf("Campo destinado para numeros inteiros, insira novamente:");
getch();
system("cls");
}
}while(ret==0);
return numero;
}
// SubAlgoritmo
// Objetivo: verificar se existem matriculas repetidas
// Parâmetros: referncia ao ponteiro de matriculas, contador do ultima matricula lida
// Retorna: validação
int verificaRepetido(int *matriculas, int ultimoLido)
{
int cont;
int flag;
for(cont=0;cont<ultimoLido;cont++){
if( *(matriculas+ultimoLido ) == *(matriculas+cont) ){
flag=1;
break;
}
}
return flag;
}
// SubAlgoritmo
// Objetivo: Ler uma matricula
// Parâmetros: Referencia ao ponteiro do vetor de matriculas,
// Retorna:
void leValidaMatriculas(int *matricula, char *titulo, int aux)
{
printf(titulo);
*(matricula+aux)=leValidaInt("Insira:");
}
//Objetivo:ler e validar um salario
//Referencia:
//Retorno:
void leValidaSalario(float *ptrSalarios,int min,int max, char *titulo, int cont)
{
do{
printf(titulo);
*(ptrSalarios)=leValidaFloat("Insira:");
}while( *(ptrSalarios+cont)<min || *(ptrSalarios+cont)>max);
}
//Objetivo:Ler e validar um numero float
//Referencia:
//Retorno:
float leValidaFloat(char *titulo)
{
int ret;
float numero;
do{
printf(titulo);
fflush(stdin);
ret=scanf("%d",&numero);
fflush(stdin);
if(ret==0){
printf("Campo destinado para numeros inteiros, insira novamente:");
getch();
system("cls");
}
}while(ret==0);
return numero;
}







  


2. Re: Dúvida quanto passagem de ponteiros como referencia em funções void

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 07/09/2015 - 12:23h

Pena ser código 'exclusivo' do Windows... ;-;

Se fosse do Linux eu ajudaria.

Tente deixa-lo C Ansi!

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"




3. Re: Dúvida quanto passagem de ponteiros como referencia em funções void

Fernando
bellun

(usa Outra)

Enviado em 07/09/2015 - 12:57h

Thihup escreveu:

Pena ser código 'exclusivo' do Windows... ;-;

Se fosse do Linux eu ajudaria.

Tente deixa-lo C Ansi!

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"



Que funções eu estou usando não são ANSI, porque eu tenho aula de C estruturado e acredito que tudo q me é passado é padrão ANSI, tanto que meu professor não aceito códigos fora deste modelo.




4. Re: Dúvida quanto passagem de ponteiros como referencia em funções void

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 07/09/2015 - 13:02h

Vou dar alguns exemplos de que não é C Ansi:


[Nao funciona no Linux, nao C Ansi]
#include <conio.h>
getch();
system("CLS");

[E essa funcionaria, mas não eh necessaria no Linux]
#include <locale.h>
setlocale(LC_ALL, "Portuguese");


Espero ter ajudado

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"




5. Re: Dúvida quanto passagem de ponteiros como referencia em funções void

Fernando
bellun

(usa Outra)

Enviado em 07/09/2015 - 13:13h

Thihup escreveu:

Vou dar alguns exemplos de que não é C Ansi:


[Nao funciona no Linux, nao C Ansi]
#include <conio.h>
getch();
system("CLS");

[E essa funcionaria, mas não eh necessaria no Linux]
#include <locale.h>
setlocale(LC_ALL, "Portuguese");


Espero ter ajudado

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"



Acho q se me tirarem uma dúvida a respeito de ponteiros eu consiga resolver isso, é o seguinte eu não estou conseguindo passar da forma correta os vetores por referencia com uso de ponteiros.



6. Re: Dúvida quanto passagem de ponteiros como referencia em funções void

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 07/09/2015 - 13:26h


Para compilar e ter certeza que está no padrão ANSI, além de Warnings:

$ gcc <arquivo_fonte.c> -o <nome_programa> -pedantic -Wall

Pendatic garante que não irá compilar se não estiver no padrão ANSI.



7. Re: Dúvida quanto passagem de ponteiros como referencia em funções void

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 07/09/2015 - 14:36h

Consegui fazer o seu exemplo funcionar...

Encontrei vários erros, tais como:


do{
if(i==0)
// faz algo
}while(i==0)


Voce não definiu as


#define MAX_SAL
#define MIN_SAL


Inverteu a posicao do MAX e do MIN nas chamadas das funcoes.

E o erro que ocasionou o Seg fault é que vc utiliza um ponteiro qtde, mas deveria ser uma variavel normal


int qtde = 0;
funcaoLoka(&qtde);


Assim teria praticamente o mesmo efeito, só que funcionaria ...

Ah, e dê uma estudade sobre vetores:

Voce fez coisas do tipo: vetor+qtde, onde o 'correto' seria vetor[qtde]

Ah, não utilize mais o DevC++, ele já não está atualizado a alguns anos, tem vários bugs e erros.

Eu te recomendo o Code::Blocks.

(Só não entendi o motivo de perguntar sobre um código de Windows num fórum onde é de Linux ...)

Espero ter ajudado

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts