Parâmetros referência com struct ponteiro

Olá, pessoal, estou criando uma “struct” com ponteiro com main.c, e criando novo menu chamado arquivo.c. Gostaria de saber como faço para criar envio como parâmetro como referência.
Segue arquivo main.c
//#include <stdio.h>
//#include <stdlib.h>
//#include <locale.h>
//#include “arquivos.h”

typedef struct{
char nome[30];
int anoNascimento;
double montante;
//}c_cliente;

//int opcao = 0;

//void limpar_entrada() {
char c;
while ((c = getchar()) != ‘\n’ && c != EOF) {}
}

void incluirCliente(c_cliente* c)
{
system(“cls”);
static int i = 0;
char cont;

do
{
	printf("Dados do %dº cliente \n", i + 1);
	printf("Nome: " );
	scanf("%s",  &(c + i)->nome);
	printf("Ano Nascimento: ");
	scanf("%d",&(c + i)-> anoNascimento);
	printf("Montante em Gastos  R$");
	scanf("%lf",&(c + i)->montante);
	i++;
	limpar_entrada();
	printf("Deseja continuar [S/N] " ) ;
	scanf("%c", &cont);
	if((cont == 'n') || (cont == 'N'))
	{
		break;
	}
	system("cls");
	if( i >= 10)
	{
		printf("Atingido quantidade máxima de clientes");
		break;
	}
}
while(i < 10 || cont == 'n' || cont == 'N');

}

void listarCliente(c_cliente* c)
{
for(int i = 0; i < 10; i++)
{
if(((c + i)-> nome != “”) || ((c + i)-> nome !=“-”))
{
printf(“===================================\n”);
printf(“Dados do %d cliente \n”, i + 1);
printf(“===================================\n”);
printf(“Nome: %s \n”, (c+i)-> nome) ;
printf(“Ano Nascimento: %d\n”, (c + i)->anoNascimento);
printf(“Montante em R$%.2lf\n”, (c + i)->montante);
}
}
}

void removerCliente(c_cliente* c)
{
char procurar[30];
//char procurar[30];
limpar_entrada();
printf(“Informe um nome para remover: " );
scanf(”%s", &procurar);
for(int i = 0; i < 10; i++)
{
if(!strcmp(procurar, (c + i)-> nome))
{
strcpy((c + i)->nome, “-”);
(c + i)->anoNascimento = 0;
(c + i)->montante = 0;
}
}
}

void zerarMontantes(c_cliente* c)
{
char zerar;
limpar_entrada();
printf(“Deseja zerar montantes? [s][n] → “);
scanf(”%c”, &zerar);
if(zerar == ‘S’ || zerar == ‘s’)
{
for(int i = 0; i < 10; i++)
{
printf(“Zerando montante do %d cliente que eh %s\n”, i + i, (c+i)->nome);
(c + i)->montante = 0.0;
}
printf(“Montantes zerados com sucesso\n”);
}
}

void melhorComprador(c_cliente* c)
{
printf(“…Melhor Comprador…\n”);
char n[30];
int ano = 0;
double mon = 0;
strcpy(n, (c + 0)->nome);
ano = (c + 0)->anoNascimento;
mon = (c + 0)->montante;
for(int i = 1; i < 10; i++)
{
if((c + i)->montante > mon)
{
strcpy(n, (c + i)->nome);
ano = (c + i)->anoNascimento;
mon = (c + i)->montante;
}
}
printf(“Nome do Melhor comprador %s com ano de nascimento %d no valor de montante de R$%.2lf\n”, n, ano, mon);
}

void montanteCliente(c_cliente* c){
char n[30];
double m;
printf(“Informe um nome para somar: “);
scanf(”%s”, n);
for(int i = 0; i < 10;i++){
if(!strcmp(n,(c + i)-> nome))
{
m += (c + i)->montante;
}
}
printf(“Montante do Cliente %.2lf\n”, m);
}

void menu()
{
printf(“±------------------------------------------+\n”);
printf(“|\t\tSISTEMA \n”);
printf(“±------------------------------------------+\n”);
printf(“| [ 1 ] - Incluir um novo cliente \n”);
printf(“| [ 2 ] - Listar clientes \n”);
printf(“| [ 3 ] - Remover cliente \n”);
printf(“| [ 4 ] - Zerar todos montantes \n”);
printf(“| [ 5 ] - Listar o melhor comprador \n”);
printf(“| [ 6 ] - Exibir montante de um cliente específico \n”);
printf(“| [ 7 ] - Operacoes de Arquivo\n”);
printf(“| [ 8 ] - Sair \n”);
printf(“±------------------------------------------+\n”);
printf(“|Opção “);
scanf(”%d”, &opcao);

/*- incluir um novo cliente
- remover cliente - atualizar o montante de compras do cliente realizadas no mês corrente
- zerar todos os montantes de compras por ocasião da virada de mês
- listar o cliente melhor comprador
- exibir um montante de compras de um cliente específico.*/

}

void operacoes_arquivo(){
char op;
system(“cls”);
limpar_entrada();
printf(“===========================================\n”);
printf(" [ g ] → Gravar em arquivo \n");
printf(" [ r ] → Ler em arquivo \n");
printf(" [ v ] / [ x ]- Voltar para o Menu anterior\n");
printf(“===========================================\n”);
printf(“Opcao: “);
scanf(”%c”, &op);
switch(op){
case ‘g’:
gravarArquivo(&cliente[0]);
break;
case ‘v’: case ‘x’:
menu();
break;
}
system(“cls”);
}

int main()
{
setlocale(LC_ALL, “Portuguese”);

int i = 0;
char cont;

c_cliente cliente[10];
c_cliente* c;
c = &cliente[0];

for(int i = 0; i < 10; i++)
{
	//cout << "Zerando montante do " << i + 1 << " cliente: " << endl;
	strcpy((c + i)->nome, "");
	(c + i)->anoNascimento = 0;
	(c + i)->montante = 0.0;
}


do{
    //system("cls");
    menu();
    switch(opcao){
        case 1:
            incluirCliente(&cliente[0]);
            break;
        case 2:
            listarCliente(&cliente[0]);
            break;
        case 3:
            removerCliente(&cliente[0]);
            break;
        case 4:
            zerarMontantes(&cliente[0]);
            break;
        case 5:
            melhorComprador(&cliente[0]);
            break;
        case 6:
            montanteCliente(&cliente[0]);
            break;
        case 7:
            operacoes_arquivo();
            break;
    }
}while(opcao != 8);


return 0;

}//
Existe outro arquivo chamado arquivo.c que faz com que a lista como ponteiro para salvar em arquivo.
//typedef struct c_cliente *c;
#include “main.h”

//typedef struct c_cliente *c;

void gravarArquivo(c_cliente* []cliente){
FILE *arq;
int pos = 0;
arq = fopen(“C:\Users\thiag\Desktop\TesteArquivo\cliente.txt”,“wb”);
if(arq == NULL){
printf(“Erro na abertura do arquivo\n”);
return 0;
}
for(pos = 0; pos < 10;pos++){
fprintf(arq, “%s;%d;%.2lf\n”, (c+pos)->nome, (c+pos)->anoNascimento, (c+pos)->montante);
//}
//fclose(arq);

// return 0;

//}//
Aparece no método o erro error: unknow type name “c_cliente”, se não tiver esse qual sintaxe correta?

Em C++, é possível passar um parâmetro por referência usando o operador “&”. Para criar uma função que recebe um parâmetro por referência, basta colocar um “&” antes do nome da variável na declaração da função.

Um exemplo de função que recebe um parâmetro por referência em C++:

void minhaFuncao(int &valor) {
  valor = 10; // altera o valor da variável original passada como referência
}

int main() {
  int meuValor = 5;
  minhaFuncao(meuValor); // passa a variável meuValor por referência
  cout << meuValor << endl; // imprime 10
  return 0;
}

Não existem referências em C. Em C só existe passagem de parâmetro por valor. & quando precede o nome de uma variável é o operador de endereço. Em C++ quando & precede um parâmetro em uma função/função membro, isso indica que aquele parâmetro é uma referência e você não usa & ao invocar tal função. Vc está misturando as coisas.

2 curtidas

Esse é um dos casos que a gente te disse pra ir com calma e ler com atenção antes de responder.

Ao contrário do que muitos pensam, C e C++ são duas linguagens diferentes. Apesar de ser relativamente popular a explicação simplista de que “C é um subconjunto de C++” ou que “C++ é C com classes”, as diferenças vão muito além (inclusive, o fato do GUJ colocar ambas na mesma categoria eu considero um erro, mas enfim).

De qualquer forma, como o tópico tem uma dúvida sobre um código em C, não faz sentido responder com outro em C++.

Eu até tentei responder, mas o código tem tantos erros que desisti (nem sequer compila, tem variáveis que não foram declaradas, entre vários outros erros, que fica difícil sequer começar a tentar). Se pelo menos desse o erro que foi indicado…

2 curtidas

@hugokotsubo exato. O nosso colega @gpd38 ainda não entendeu o que falamos exaustivamente à ele. No meu caso, eu paro de falar. Eu nem li o tópico do PO, não tenho mais paciência pra ficar explicando como que tem que postar, como tem que formatar, como tem que responder… Tópico ruim eu simplesmente ignoro. Só dou uma olhada nas respostas do @gpd38 pq a ânsia que ele tem de ajudar, como já dissemos, é perigosa por causa justamente do quê você apontou. Não sabe, não fala. É igual jogar no ChatGPT alguma dúvida e aceitar como verdade o que foi vomitado pela IA sem ter certeza do que você está lendo, como aliás, tem acontecido aqui no GUJ em alguns tópicos, inclusive em um de C há alguns dias atrás.

1 curtida

Antigamente eu era um usuário bastante ativo no fórum JavaFree, parei de participar pois quando ele foi vendido para a UOL ou DevMedia, passou a ficar largado e cheio de bugs, tanto que há alguns anos nem existe mais.
Naquele fórum começou a acontecer com muita frequência que um grupo de cerca de 4 pessoas diariamente postavam respostas muito semelhantes à essas do gpd38, muitas vezes com resposta errada ou desvirtuando do problema original.
Na época uma das pessoas revelou o motivo de responderem tanto e de forma tão ansiosa: Os quatro trabalhavam na mesma empresa e se comprovassem que participavam de fóruns de tecnologia, a liderança melhorava o seu resultado na participação de lucros da empresa.
O problema é que com isso eles mais atrapalhavam do que ajudavam, tudo para no final do ano garantir um bom PLR.
Me questiono se não é algo parecido que está acontecendo.
:man_shrugging:

1 curtida