Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

viciado

[Resolvido] Struct

Recommended Posts

Olá quitZAUMMM, então esse null é mais vamos dizer...

 

 

 

 

 

Há deu erro eu tenho que retornar algo, e como no caso podemso ter numero negativos e zeros, fica complicado eu retornar um 0.0 que é um retorno possivel, eu já havia visto algo do tipo em erros, tipo seria o caso de lançamento de uma exception eu sei.

 

 

Não irei falar aqui "No java isso é possivel..." pois sofro risco a minha integridade fisica e pisicologica (hahaha).

 

 

Ai fica a dúvida uma area de memória alocada em float, não pode ser nula?

 

 

Não sei se você concorda mas

(!estaVazio(p))  ? return p->ultimo : return NULL;
é um teste e eu tenho de evitar esse erro, e que somente passar um valor qualquer não soluciona o problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Er desculpe mas uma correção em duas funções:

 

 

float retornaTopo(TFila *p){
	// Isso só é possível pois assumimos que a TFila segue essa assinatura
	// Versão com operador ternário
	/**
	 *<code>*/
	 (!estaVazio(p)) ? return p->mes[p->primeiro] : return NULL;
	 /**</code>
	 */
	/// Verssão com IF
	/**
	 *<code>
	 *if(!eVazio){
	 *  return p->primeiro;
	 *}
	 *return NULL;
	 *</code>
	 */
}
float retornaUltimo(TFila *p){
	// Veja retorna topo
	(!estaVazio(p))  ? return p->mes[p->ultimo] : return NULL;

	/**
	 * Vesão com IF
	 *<code>
	 *if(!eVazio){return p->ultimo;}
	 *return NULL;
	 *</code>
	 */
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

em relação aos erros, fiz meio rapido aki e consegui tirar, + rodar funfar jah é outros 500..

 

no tFila tive q fazer isso senaum num tava rodando;

#define MES 12
typedef struct{
	int primeiro;
	int ultimo;
	float mes[MES];
	static const int limite = 12;
}TFila_;
acho q no App.cpp soh mudei isso:

//#include "tFila.cpp"	//Estrututa de dados da fila

// Variavel GLOBAL
TFila_ *fila_;
ai fui mudando o nome das variaveis.

 

e num fila.cpp soh fui mudando o nome das variaveis tbm..

 

da uma olhada ae..

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

você não pode retornar NULL em uma função que na declaração retorna um float...

 

mande a função retornar um ponteiro para float, ai sim!

 

float* retornaUltimo(TFila *p){

	// Veja retorna topo
	(!estaVazio(p))  ? return &p->mes[p->ultimo] : return NULL;


}

Agora você pode retornar null.

 

só não esqueça que você está retornando um ponteiro para float!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Erro "sintax errorbefore "agenda" "

Nas linhas 38, 40, 41, 42, 43

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct dados_endereco_
		{
			   char rua[30];
			   int num;
			   char bairro[20];
			   }dados_endereco;
typedef struct agenda_
		{
			   char nome[30];
			   float tel;
			   char email[20];
			   dados_endereco endereco;
			   }agenda;
agenda cadastrar(void){
	 agenda aa;
	 printf("Informe o nome \n");
	 scanf("%s",&aa.nome);
	 printf("Informe o telefone \n");
	 scanf("%f",&aa.tel);
	 printf("Informe o email \n");
	 scanf("%s",&aa.email);
	 printf("Informe a rua \n");
	 scanf("%s",&aa.endereco.rua);
	 printf("Informe o numero \n");
	 scanf("%d",&aa.endereco.num);
	 printf("Informe o bairro \n");
	 scanf("%s",&aa.endereco.bairro);
	 return aa;
}
agenda pesquisar(void){
	   char nome[30];
	   printf("Informe o nome \n");
	   fgets(nome, 30, stdin);
	   if( strcmp (nome, agenda.nome) ){
			   printf("%s \n",agenda.nome);
			   printf("%f \n",agenda.tel);
			   printf("%s \n",agenda.email);
			   printf("%s \n",agenda.endereco.rua);
			   printf("%d \n",agenda.endereco.num);
						  }
	   else {
			printf("Nome invalido \n");
			}
}
int main()
{
  int n;
  do{
  printf("Informe opcao que deseja \n");
  printf("(1) Cadastrar \n");
  printf("(2) Pesquisar \n");
  scanf("%d",&n); 
  if(n==1){
		   agenda agenda_cadastra;
		   agenda_cadastra = cadastrar();
			   }
  else {
	   if(n==2){
				agenda agenda_pesquisa;
				agenda_pesquisa = pesquisar();
				}
  else { 
	   printf("Opcao invalida \n");
	   }
	   }
  }while(n!= 1 && n!= 2);
  printf("Pesquisa \n");
  agenda agenda_pesquisa;
  agenda_pesquisa = pesquisar();
  system("PAUSE");	
  return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

agenda é um tipo de variavel naum uma variavel..

naum adianta fazer agenda.nome

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha leia o tópico do Victor para naum ter sujeira no buffer.

eu usei um getchar(); pq num qro mudar muito do seu código + naum faça essa má pratica c tiver tempo..

veja como fico:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct dados_endereco_
		{
			   char rua[30];
			   int num;
			   char bairro[20];
			   }dados_endereco;
typedef struct agenda_
		{
			   char nome[30];
			   float tel;
			   char email[20];
			   dados_endereco endereco;
			   }agenda;

agenda cadastrar(void){
	 agenda aa;
	 printf("Informe o nome \n");
	 scanf("%s",&aa.nome);
	 printf("Informe o telefone \n");
	 scanf("%f",&aa.tel);
	 printf("Informe o email \n");
	 scanf("%s",&aa.email);
	 printf("Informe a rua \n");
	 scanf("%s",&aa.endereco.rua);
	 printf("Informe o numero \n");
	 scanf("%d",&aa.endereco.num);
	 printf("Informe o bairro \n");
	 scanf("%s",&aa.endereco.bairro);
	 return aa;
}
agenda pesquisar(agenda agenda1){
	   char nome[30];
	   getchar();
	   printf("Informe o nome \n");
	   fgets(nome, 30, stdin);
	   nome[strlen(nome)-1] = '\0';
	   if(!strcmp(nome, agenda1.nome) != 0){
			   printf("%s \n",agenda1.nome);
			   printf("%f \n",agenda1.tel);
			   printf("%s \n",agenda1.email);
			   printf("%s \n",agenda1.endereco.rua);
			   printf("%d \n",agenda1.endereco.num);
	   }
	   else {
			printf("Nome invalido \n");
			}
}
int main()
{
  agenda agenda_cadastra;
  int n;
  do{
  printf("Informe opcao que deseja \n");
  printf("(1) Cadastrar \n");
  printf("(2) Pesquisar \n");
  scanf("%d",&n);
  if(n==1){

		   agenda_cadastra = cadastrar();
			   }
  else {
	   if(n==2){
				agenda agenda_pesquisa;
				agenda_pesquisa = pesquisar(agenda_cadastra);
				}
  else {
	   printf("Opcao invalida \n");
	   }
	   }
  }while(n== 1 || n== 2);
  system("PAUSE");
  return 0;
}

[]s

 

--EDIT---

 

pronto pra naum usar o getchar(); soh alterar pra essa parte:

char nome[30];
	   printf("Informe o nome \n");
	   scanf("%s%*c", nome);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda pessoal.

É muito complicado aprender arquivos para utilizar melhor esse código salvando e editando arquivo txt ?

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct dados_endereco_
		{
			   char rua[30];
			   int num;
			   char bairro[20];
			   }dados_endereco;
typedef struct agenda_
		{
			   char nome[30];
			   float tel;
			   char email[20];
			   dados_endereco endereco;
			   }agenda;

agenda cadastrar(void){
	 agenda aa;
	 printf("Informe o nome \n");
	 scanf("%s",&aa.nome);
	 printf("Informe o telefone \n");
	 scanf("%f",&aa.tel);
	 printf("Informe o email \n");
	 scanf("%s",&aa.email);
	 printf("Informe a rua \n");
	 scanf("%s",&aa.endereco.rua);
	 printf("Informe o numero \n");
	 scanf("%d",&aa.endereco.num);
	 printf("Informe o bairro \n");
	 scanf("%s",&aa.endereco.bairro);
	 return aa;
}
agenda pesquisar(agenda agenda1){
	   char nome[30];
	   getchar();
	   printf("Informe o nome \n");
	   fgets(nome, 30, stdin);
	   nome[strlen(nome)-1] = '\0';
	   if(!strcmp(nome, agenda1.nome) != 0){
			   printf("%s \n",agenda1.nome);
			   printf("%f \n",agenda1.tel);
			   printf("%s \n",agenda1.email);
			   printf("%s \n",agenda1.endereco.rua);
			   printf("%d \n",agenda1.endereco.num);
	   }
	   else {
			printf("Nome invalido \n");
			}
}
int main()
{
  agenda agenda_cadastra;
  int n;
  do{
  printf("Informe opcao que deseja \n");
  printf("(1) Cadastrar \n");
  printf("(2) Pesquisar \n");
  printf("(3) Sair \n");
  scanf("%d",&n);
  if(n==1){

		   agenda_cadastra = cadastrar();
			   }
  else {
	   if(n==2){
				agenda agenda_pesquisa;
				agenda_pesquisa = pesquisar(agenda_cadastra);
				}
  else {
	   if(n==3){
				exit(0);
				}
	   printf("Opcao invalida \n");
	   }
	   }
  }while(n != 1 && n != 2 && n != 3);
  system("PAUSE");
  return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

É realmente eu pesso desculpas mas ainda estou com erros.

 

Basicamente ele não reconhece tipo TFila, seguindo o que o QuitZAUMMM recomendou... Mudei um pouco

 

como

 

tfila.cpp

Agora stá assim:

typedef struct Fila{
	static const int limite = 12;
	int primeiro;
	int ultimo;
	float mes[limite];
}TFila;

fila.cpp

Segundo as recomendações do Victor mudei as assinaturas dos métodos (funções) que manipulam retornos. É até meio obvio pois isso deixa mais proximo ao OOP (creio eu, neste mundo estrturado).

float* retornaTopo(TFila *p){
	// Isso só é possível pois assumimos que a TFila segue essa assinatura
	// Versão com operador ternário
	/**
	 *<code>*/
	 (!estaVazio(p)) ? return p->mes[p->primeiro] : return NULL;
	 /**</code>
	 */
	/// Verssão com IF
	/**
	 *<code>
	 *if(!eVazio){
	 *  return p->primeiro;
	 *}
	 *return NULL;
	 *</code>
	 */
}

app13.cpp

Bem como eu mudei as assinaturas apenas queria garantir que ele ia continuar ok use então o tipe casting (mas creio que isso talvez gere erros)

cout <<(float)retornaTopo(fila) <<endl;

Bem mesmo com as modificações acima o problema parece continuar sendo o arquivo fila.cpp reconhecer a estrutura contida em tfila.cpp, bem ai seria o obvio de tenta dar um include de tfila.cpp em fila.cpp. Mas ai entra o porem estou fazendo todo esse trabalho para poder reaproveitar o arquivo fila.cpp em outros projetos e esse include faria ele perder todo o sentiodo desta criação de módulos, e ao meu ver ser o app.cpp deve fazer essa ligação.

Bem com as variaveis acima, seria interessante então o existir um tipo "Genérico" para a estrutura reconhecer o tipo TFila sem o include, algo como o Object no Java.

Tentei mudar a assinatura dos métodos para algo como:

float* retornaTopo(struct TFila *p)
Mas ele continua bravo. Bem vou postar a saida de erros do Cygwin, que é bem similar a do DEV C++ creio eu, mas a vantagem é que o pessoal do linux consegue vizualizar o memso que o pessoal do windows.

 

 

 

SAIDA DO COMPILADOR CYGWIN:

In file included from app13.cpp:2:

fila.cpp:8: error: `TFila' was not declared in this scope

fila.cpp:8: error: `p' was not declared in this scope

fila.cpp:8: error: expected `,' or `;' before '{' token

fila.cpp:9: error: `TFila' was not declared in this scope

fila.cpp:9: error: `p' was not declared in this scope

fila.cpp:9: error: expected `,' or `;' before '{' token

fila.cpp:15: error: `TFila' was not declared in this scope

fila.cpp:15: error: `p' was not declared in this scope

fila.cpp:15: error: expected `,' or `;' before '{' token

fila.cpp:33: error: `TFila' was not declared in this scope

fila.cpp:33: error: `p' was not declared in this scope

fila.cpp:33: error: expected `,' or `;' before '{' token

fila.cpp:45: error: `TFila' has not been declared

fila.cpp:45: error: ISO C++ forbids declaration of `p' with no type

fila.cpp: In function `void inserir(float, int*)':

fila.cpp:46: error: `estaCheio' cannot be used as a function

fila.cpp:47: error: request for member `mes' in `*p', which is of non-class type `int'

fila.cpp:47: error: request for member `ultimo' in `*p', which is of non-class type `int'

fila.cpp:50: error: request for member `ultimo' in `*p', which is of non-class type `int'

fila.cpp: At global scope:

fila.cpp:54: error: `TFila' was not declared in this scope

fila.cpp:54: error: `p' was not declared in this scope

fila.cpp:54: error: expected `,' or `;' before '{' token

fila.cpp:65: error: variable or field `listar' declared void

fila.cpp:65: error: `TFila' was not declared in this scope

fila.cpp:65: error: `p' was not declared in this scope

fila.cpp:65: error: expected `,' or `;' before '{' token

In file included from app13.cpp:2:

fila.cpp:68:2: warning: no newline at end of file

In file included from app13.cpp:3:

tfila.cpp:6:8: warning: no newline at end of file

app13.cpp: In function `float* media(TFila*)':

app13.cpp:10: error: `estaVazio' cannot be used as a function

app13.cpp:15: error: cannot convert `float' to `float*' in return

app13.cpp: In function `bool menu()':

app13.cpp:41: error: `retornaTopo' cannot be used as a function

app13.cpp:44: error: `retornaUltimo' cannot be used as a function

app13.cpp:48: error: cannot convert `TFila*' to `int*' for argument `2' to `void inserir(float, int*)'

app13.cpp:52: error: `excluir' cannot be used as a function

app13.cpp:63: error: `listar' cannot be used as a function

app13.cpp:66: error: pointer value used where a floating point value was expected

app13.cpp:67: error: pointer value used where a floating point value was expected

app13.cpp:79:2: warning: no newline at end of file

 

Quanto aos erros, pesso humildemente que me descupem não sou nenhum expert, por isso paciência.

Compartilhar este post


Link para o post
Compartilhar em outros sites

paulopatto gostaria de pedir pra abrir um tópico para a sua duvida, pois a do viciado (autor do tópico) foi resolvido..

ai lah você posta os fontes denovo do jeito q esta ok?

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.