Ir para conteúdo

Arquivado

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

paulopatto

[Resolvido] Problemas com ponteiros para estruturas

Recommended Posts

Olá boa tarde.

 

 

Assim como em http://forum.imasters.com.br/index.php?showtopic=339826 continuando vou postar os arquivos atuais envolvidos no projeto e saidas de erro do compilador cygwin:

 

app13.cpp

#include<iostream>	//Entrada e saida de stream
#include "fila.cpp"	 //Métodos Manipuladores de Fila
#include "tfila.cpp"	//Estrututa de dados da fila
using namespace std;
// Variavel GLOBAL
TFila *fila;

float* media(TFila *p){
	float media = 0;
	if(!estaVazio(p)){
		for(int i = p->primeiro; i < p->ultimo; i++){
			media += p->mes[i];
		}
		media /= p->ultimo;
		return media;
	}
	cout<<"\n[ERRO]: A lista está vazia!" <<endl;
	return NULL;
}
float toKelvin(float celsius){return celsius + 273.15;}
bool menu(){
	int opcao;
	float valor;
	cout<<"\nEscolha:"<<endl;
	cout<<"\t1) Retornar o topo da fila." <<endl;
	cout<<"\t2) Retornar o ultimo da fila." <<endl;
	cout<<"\t3) Inserir elemento." <<endl;
	cout<<"\t4) Excluir elemento." <<endl;
	cout<<"\t5) Verificar se existem elementos na fila." <<endl;
	cout<<"\t6) Verificar se cabem mais elementos na fila." <<endl;
	cout<<"\t7) Listar elementos da fila." <<endl;
	cout<<"\t8) Calcular Medias" <<endl;
	cout<<"\t0) Sair do aplicativo." <<endl;
	cin>>opcao;

	switch(opcao){
		case 0:
			return false;
			break;
		case 1:
			cout <<(float)retornaTopo(fila) <<endl;
			break;
		case 2:
			cout <<(float)retornaUltimo(fila) <<endl;
			break;
		case 3:
			cout<<"Entre com o valor de deseja inserir:"; cin>>valor;
			inserir(valor, fila);
			cout<<endl;
			break;
		case 4:
			cout<<"Valor " <<(float)excluir(fila) <<" excluido da fila." <<endl;
			break;
		case 5:
			if(estaVazio){cout<<"Nao existem elemntos na fila."<<endl;}
			else{cout<<"Existem elementos na fila"<<endl;}
			break;
		case 6:
			if(estaCheio){cout<<"Lista cheia."<<endl;}
			else{cout<<"Lista nao cheia"<<endl;}
			break;
		case 7:
			listar();
			break;
		case 8:
			cout<<"Media em CELSIUS: "<<(float)media(fila) <<endl;
			cout<<"Media em Kelvins: "<<toKelvin((float)media(fila)) <<endl;
			break;
		default:
			cout<<"Opcao invalida, tente uma de acordo com o menu." <<endl;
			break;
	}
	return true;

}
int main(void){
	while(menu()){continue;}
	return 0;
}

fila.cpp

#include <stdio.h>

// Aqui para manter a abstração apenas estou colocando os métodos de manipulação
// de filas.
// Pesquise algo sobre Padrões de Projetos (Design Pattarns).


bool estaCheio(TFila *p){(p->ultimo == (p->limite-1)) ? return true : return false;}
bool estaVazio(TFila *p){(p->ultimo == p->primeiro) ? return true : return false;}
/**
 * Retornar o Topo da fila (primairo elemento)
 * @param TFila *p
 * @return float elemento.
 */
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>
	 */
}
void inserir(float elemento, TFila *p){
	if(!estaCheio(p)){
		p->mes[p->ultimo++] = (float)elemento;

		//DEBUG
		printf("\n[DEBUG MESSAGE]\tInserido Array[%d] = %f",p->ultimo, elemento);
	}
	else{printf("Erro! A Lista já está cheia, elemine alguns elementos.");}
}
float* excluir(TFila *p){
	if(!estaVazio(p)){
		float elemento = p->mes[p->primeiro];

		// Vou deslocar uma-a-um os elementos da fila ou seja é a frase:
		// "A fila anda."
		for(int i = p->primeiro; i < p->ultimo; i++){p->mes[i] = p->mes[i+1];}
		p->ultimo--;
		return elemento;
	}
}
void listar(TFila *p){
	if(!estaVazio(p)){for(int i = p->primeiro; i < p->ultimo; i++){printf("\n%f",p->mes[i]);}}
	else{printf("[ERRO] Lista vazia.");}
}

 

tfila.cpp

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

saida de erros do cygwin (no dev c++ 'dev-c' similar rs)

C:\Documents and Settings\Administrator\My Documents\NetBeansProjects\Exemplos>g++ app13.cpp -o app13.exe

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

 

Bem creio que o maior problema seja o reconehcimento de TIPOS entre os arquivos envolvidos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

no fila você vai ter q fazer isso

#include "tfila.cpp"

 

senaum você num vai ter esse tipo de dado neh

 

outra coisa é sua função listar ela tem q receber um parametro..

e na sua App13 tbm as funções de estaVazio e estaCheio, pedem parametro

 

--

você vendo esses erros q ai a gente tenta descobrir uma maneira do float lah

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Er erro de amador, mas já corrigi os erros.

 

Agora quanto ao include em fila.cpp, isso iria contra o polimorfismo e ai não justificaria eu ter 3 arquivos, e eu não posso usar esses métodos de forma genérica, pois esses estariam sendo meio que feitos para esse tipo de estrutura

Compartilhar este post


Link para o post
Compartilhar em outros sites

#include<iostream>	//Entrada e saida de stream
#include "fila.cpp"	 //Métodos Manipuladores de Fila
#include "tfila.cpp"	//Estrututa de dados da fila

 

// Variavel GLOBAL
TFila *fila;

 

Pela 847363ª vez: Não coloquem comentários inúteis. Esse tipo de comentário não acrescenta absolutamente nada ao entendimento do código.

 

Não sei que tipo de fila você está usando,mas nunca vi fila mexendo com qualquer elemento que não seja o primeiro.

 

Eu mudaria tudo.

 

#include <iostream>
using namespace std;

class Fila {

private:
static const int MAXIMO = 5;
bool cheio;
int topo;
float mes[MAXIMO];

public:

	Fila() {
		cheio = false;
		topo = 0;
	}	

	/** Caso a fila esteja cheia retorna -1 indicando que não pode-se inserir elementos.
	 * Se houver lugar na fila, insere o elemento e retorna o número de elementos na fila.
	 */
	int inserir (float elemento) {
		if (cheio)
			return -1;
		mes[topo++] = elemento;
		if (topo == MAXIMO) cheio = true;
		return topo;
	}


	int excluir () {
		if (!topo)
			return -1;
		int i,j;
		for(i=0,j=1;i<topo;i++,j++)
			mes[i] = mes[j];
		mes[j] = -1;
		topo--;
		if (!topo) cheio = false;
		return topo;
	}


	void listar() {
		if (!topo)
			cerr << "Fila vazia" << endl;
		else {
			int i;
			for(i=0; i< topo; i++)
				cout << mes[i] << ((i == topo-1)?" ":"\n");
		}
	}


	bool estaCheio() {
		return cheio;
	}


	bool estaVazio() {
		return (bool)(!topo);
	}


	float getPrimeiro() {
		if (topo)
			return mes[0];
		else
			return (float)NULL;
	}

	float getMedia() {
		if (!topo)
			return 0;

		float media = 0.0F;
		int i;
		for(i=0;i<topo;i++)
			media+=mes[i];
		return media/topo;
	}
};

float toKelvin(float celsius){
return celsius + 273.15;
}


void menu(){
cout<<"\nEscolha:"<<endl;
cout<<"\t1) Retornar o topo da fila." <<endl;
cout<<"\t2) Inserir elemento." <<endl;
cout<<"\t3) Excluir elemento." <<endl;
cout<<"\t4) Verificar se existem elementos na fila." <<endl;
cout<<"\t5) Verificar se cabem mais elementos na fila." <<endl;
cout<<"\t6) Listar elementos da fila." <<endl;
cout<<"\t7) Calcular Medias" <<endl;
cout<<"\t8) Sair do aplicativo." <<endl;
}

int main() {
int opcao;
enum OPCAO{TOPO=1, INSERIR, EXCLUIR, VAZIO, CHEIO, LISTAR, MEDIA, SAIR};

Fila F;

while(true) {
	menu();
	cin >> opcao;

	if (opcao == SAIR) break;
	if (opcao == TOPO) {
		float topo = F.getPrimeiro();
		if (topo == (float)NULL)
			cout << "Fila vazia.";
		else cout << "Primeiro da fila: " << topo << endl;
	}else if (opcao == INSERIR) {
		float elemento;
		cout << "Digite o elemento a inserir: ";
		cin >> elemento;
		if (F.inserir(elemento) < 0)
			cout << "A fila está cheia. Não é possível inserir.\n";
	} else if (opcao == EXCLUIR) {
		if (F.excluir() < 0)
			cout << "A fila está vazia. Não é possível excluir.\n";
	} else if (opcao == VAZIO)
		cout << "A fila" << ((F.estaVazio())? " ": " não ") << "está vazia." << endl;
	else if (opcao == CHEIO)
		cout << "A fila" << ((F.estaCheio())? " ": " não ") << "está cheia." << endl;
	else if (opcao == LISTAR)
		F.listar();
	else if (opcao == MEDIA)
		cout << "Média: " << F.getMedia() << endl;
	else cout  << "Opção inválida.\n";
}
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pela 847363ª vez: Não coloquem comentários inúteis. Esse tipo de comentário não acrescenta absolutamente nada ao entendimento do código.

 

Não sei que tipo de fila você está usando,mas nunca vi fila mexendo com qualquer elemento que não seja o primeiro.

 

Eu mudaria tudo.

 

Isis Obrigado pelas dicas, mas os comentários "inuteis" são necessários sim, para eu e você que conhecemos o que é uma variavel global isso é inutiul, mas para os leitores deste código, iniciantes em programação esse não é um comentário inutil... Mas não iei discutir esse mérito pois você não tem a minima obrigação de ter uma bola de cristal e saber disso!

Já quanto ao código, bem já desistir de fazer modularizado, assim vou fazer do jeio normal que funciona e vou pesquisar mais para ver como criar algo mais abstrato e genérico, mas mesmo assim obrigado a todos pelas dicas, ao moderador, bem não dou tópico por resolvido mas... pode fechar o tópico por mim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quer uma lista extremamente legal pq não criar um template ?

 

Ou cria uma classe abstrata, interface (como queira chamar), e depois só implementa ela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pela 847363ª vez: Não coloquem comentários inúteis. Esse tipo de comentário não acrescenta absolutamente nada ao entendimento do código.

 

Não sei que tipo de fila você está usando,mas nunca vi fila mexendo com qualquer elemento que não seja o primeiro.

 

Eu mudaria tudo.

 

Isis Obrigado pelas dicas, mas os comentários "inuteis" são necessários sim, para eu e você que conhecemos o que é uma variavel global isso é inutiul, mas para os leitores deste código, iniciantes em programação esse não é um comentário inutil... Mas não iei discutir esse mérito pois você não tem a minima obrigação de ter uma bola de cristal e saber disso!

Já quanto ao código, bem já desistir de fazer modularizado, assim vou fazer do jeio normal que funciona e vou pesquisar mais para ver como criar algo mais abstrato e genérico, mas mesmo assim obrigado a todos pelas dicas, ao moderador, bem não dou tópico por resolvido mas... pode fechar o tópico por mim.

 

DESTACANDO:

"Isis Obrigado pelas dicas, mas os comentários "inuteis" são necessários sim, para eu e você que conhecemos o que é uma variavel global isso é inutiul, mas para os leitores deste código, iniciantes em programação esse não é um comentário inutil..."

 

tem razao nao eh inutil...mas perae vamo pensar um pouco, leitores desse topico INICIANTES em programacao... por INICIANTES nos entendemos que eles nao sabem NADA a respeito de programacao certo ?

Entaum me responde pq ensinar algo errado para uma pessoa? entaum nao ensina que eh melhor....

ou se todos pensassem que nem tu nos teriamos codigos assim:

 

int i=1; // declara uma variavel inteira e incializa ela com 1

 

if( 2 > 1) // se 2 for maior que 1, acontece tal coisa...

{ ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camikase

 

Sem contar que uma lista encadeada não é algo assim TÃÃÃO simples para se mostrar para INICIANTES.

Até pq entra com conceitos de ponteiros, todo iniciante quebra a cabeça com ponteiros... :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehehhe!

 

O pior é que eu não ensino, na realidade, o meu grupo na faculdade não tem essa familiariade assim com a linguagem, por exemplo sabem fazer um IF mas não sabem por que estão fazendo esse IF, mas para evitar maiores trasntornos, não irei discutir se é inutiu ou não, não posto mais comentários assim.

 

Já sobre templates, eu queria fazer meio que assim, com classe abstrata, ou template mas não tenho tamanha habilidade no c / c++ para tal, será que alguem tem um manual, ou material de referência sobre isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Paulo, eu tenho uma classe template de uma lista duplamente encadeada que eu fiz a algum tempo atrás, pode te servir como base.

 

http://codepad.org/zRF0FYhx

 

Se você encontrar qualquer coisa errada ou pog's, releve, isso tem mais de 1 ano... uahuhaeuehahaue =P

Não se esqueça, a declaração e implementação de templates vão em um só arquivo, no header.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

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.