[C con Clase] Fwd: Errores de linkado de pila con templates

tikitita guanxita en gmail.com
Mar Mar 13 22:20:59 CET 2007


La verdad es que no, te comento que hice algunos cambios, el problema es que
tb uso una cola, una clase fichero, una lista dinamica y un gestor, y el
problema viene cuando desde gestor le digo a la pila que quiero una para las
variables y otra para los operadores. Bien pues al hacer el cambio que tu me
has dicho de meter el .h en el .cpp me ha salido otro error en una de las
funciones, que corregi y misteriosamente me salieron 0 errores, pero al
ejecutar peto... ohhhh , asi que opte por meter las variables de las pilas
en el main y me saltaron varios errores....

bueno  te adjunto todo x si tu ves algo...

 error C2065: 'operandos' : undeclared identifier
gestor.cpp(62) : error C2228: left of '.mostrar' must have
class/struct/union type
gestor.cpp(63) : error C2228: left of '.extraer' must have
class/struct/union type
gestor.cpp(65) : error C2228: left of '.extraer' must have
class/struct/union type
gestor.cpp(67) : error C2065: 'operador' : undeclared identifier
estor.cpp(85) : error C2228: left of '.insertar' must have
class/struct/union type


****gestos.cpp*******
#include "cola.h"
#include "fichero.h"
#include "lista.h"
#include "pila.cpp"
#include <cstdlib>
#include <string>
using namespace std;





cola buffer2;
string V=NULL;//string donde vamos a guardar las variables
string N=NULL;
lista variables;

//Vamos a diferenciar cuando es variable y cuando es valor
//true -> variable, false ->valor

bool reconocer (char palabra) {

    string aux= "0123456789.";
    char* aux2;
    aux2= (char*)memchr(aux.c_str(),palabra,11);

    if (aux2==NULL){

        return true;//variable

    }else{

        return false;//valor

    }

}

bool reconocerop (char operador) {

    string aux= "+-/*^()";
    char* aux2;
    aux2= (char*)memchr(aux.c_str(),operador,7);

    if (aux2==NULL){

        return true;//no operador

    }else{

        return false;//operador

    }

}


void operacion (){

    float A;
    float B;
    A=operandos.mostrar();
    operandos.extraer();
    B=operandos.mostrar();
    operandos.extraer();
    char op;
    op=operador.mostrar();
    operador.extraer();
    switch (op) {

    case '+': operandos.insertar(A+B);
        break;
    case'-': operandos.insertar(A-B);
        break;
    case'/': if(B!=0){
             operandos.insertar(A/B);
             }
        break;
    case'*': operandos.insertar(A*B);
        break;
    case '^': float aux=1;
        for (int i=1;i<=B; i++){
                aux=aux*A;
        }
            operandos.insertar(aux);
        break;
    }
}

bool precedencia(char op1, char op2) {

    if ((op1=='(')&&(op1==')')){
        return true;
    }else{
        if((op1=='^')&&((op2=='('))||(op2==')')){
            return false;
        }else{

if(((op1=='*')||(op1=='/'))&&(((op2=='(')||(op2==')')||(op2=='^')))){
                return false;
            }else{
                return false;
            }
        }
    }
    return true;
}





void calcularexpresion (char numeritos) {

    if (N!=""){
        operandos.insertar(variables.buscar(N.c_str()));//insertamos en pila
de operadores
    }
    if (buffer2.mostrar()=='('){
        operador.insertar(buffer2.mostrar());
    }
    if (buffer2.mostrar()==')'){

        while (operador.mostrar()=='('){
            operacion();
        }
        operador.extraer();
    }


    if (!reconocerop(buffer2.mostrar())){
        if((operador.esvacia())&&(buffer2.mostrar()=='(')){
            operador.insertar(buffer2.mostrar());
        }

        if(precedencia(buffer2.mostrar(),operador.mostrar())){
            operacion();
            operador.insertar(buffer2.mostrar());
        }else{
            operador.insertar(buffer2.mostrar());
        }
    }






}



void main(){

//Declaracion de variables


pila<char> operador;// en caso de templates meter <int>
pila<int> operandos;//en caso de templates meter <char>

string f;



cout<<"Introduzca el nombre del fichero"<<endl;
cin>>f;

fichero texto(f);//ruta donde estara el fichero que vamos a leer

buffer2=texto.guardarbuffer();



bool cambio=true;
bool expresion=false;

while (!texto.fin()){// mientras el fichero no llegue a su fin
    while (buffer2.size()!=0){// y el buffer no este vacio


        if (reconocer(buffer2.mostrar())){

            if (reconocerop(buffer2.mostrar())){

                if (cambio){
                    V+=buffer2.mostrar();
                    buffer2.extraer();
                }else{
                    if (N==""){
                        calcularexpresion(buffer2.mostrar());
                        buffer2.extraer();
                        N="";
                    }else{
                        variables.insertar(V, atof(N.c_str()));
                        cambio=true;
                        V=buffer2.mostrar();
                        buffer2.extraer();
                        N="";
                    }
                }

            }else{
                calcularexpresion(buffer2.mostrar());
                buffer2.extraer();
            }

            }else{
                while (!reconocer(buffer2.mostrar())){
                N+=buffer2.mostrar();
                buffer2.extraer();
                cambio=false;
                }
                if (V==""){
                    operandos.insertar(atof(N.c_str()));//insertamos numero
en pila de operandos
                    V="";
                    N="";
                }

            }
        }

        buffer2=texto.guardarbuffer();

    }


cout<<operandos.mostrar();

}

El día 13/03/07, Steven Davidson <steven en conclase.net> escribió:
>
> Hola Tikitita,
>
> El pasado 2007-03-13 20:53:15, tikitita escribió:
>
> t> Nada Steve, no hay manera,,, no le gusta a la pila, dice que nanai....
> :( lo
> t> hice tal como tu dices pero hay algo que no le mola...
>
> Me parece raro, porque no he visto nada problemático con tu código. De
> hecho, lo acabo de usar en un programa sencillo, y no he tenido problema
> alguno. Por lo tanto, me hace sospechar que el problema esté en cómo usas la
> plantilla 'pila'. Por ejemplo, escribí lo siguiente:
>
> using namespace std;
>
> int main()
> {
>   pila<int> pi;
>   pi.insertar( 10 );
>   pi.mostrar();
>
>   cin.get();
>   return 0;
> }
>
> Por si acaso, te comento que no agregué el fichero de "pila" en el
> proyecto. Usando Dev-C++, éste intentó enlazar "pila.o" al programa, el
> cual obviamente no va a existir.
>
>
> Espero que algo de esto te ayude.
>
> Steven
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20070313/a93ad696/attachment.html>


Más información sobre la lista de distribución Cconclase