Improper use of typedef und Function call missing

Von: , Frage gestellt am Di, 10. Apr 2007

Hallo,

ich möchte bei der Implementierung einer Methode vom cpp-file aus auf die Ergebnisse von anderen, ebenfalls dort implementierten Methoden zugreifen. Dazu muß ich, wenn ich nicht irre, ein Objekt meiner Klasse als Parameter bypassen und diesen Bypass sowohl im .h-File als auch im Main deklarieren, nicht? Trotzdem klappt es nicht:

// "TVector2.h":
class TVector2 {
float *vec;
int cantcomp;

public:
TVector2(int n=0);
~TVector2();
TVector2(const TVector2 &);
void Leer();
float MediaGeo();
float CompMay();
float CompMen();
float Rango(TVector2 a);
};

// TVector2.cpp :
//---------------------------------------------------------------------------


#pragma hdrstop

#include "TVector2.h"
#include <iostream.h>
#include <math.h>

//---------------------------------------------------------------------------

#pragma package(smart_init)

TVector2::TVector2(int n){ // Constructor
cantcomp = n;
vec = new float[cantcomp];
for (int i=0; i<cantcomp; i++)
vec[i] = 0;
}

TVector2::~TVector2(){ // Destructor
delete[]vec;
}

TVector2::TVector2(const TVector2 & a){ // Constr. Copia
cantcomp = a.cantcomp;
vec = new float[cantcomp];
for(int i=0; i<cantcomp; i++)
vec[i] = a.vec[i];
}

void TVector2::Leer(){
for (int i=0; i<cantcomp; i++) {
cout << "Entre el " << i+1 << " componente del vector: ";
cin >> vec[i];
}
}

float TVector2::MediaGeo() {
float medg=1;
for (int i=0; i<cantcomp; i++)
medg = medg * vec[i];
medg = pow(medg, 1/cantcomp);
return medg;
}


float TVector2::CompMay(){
float maycomp=vec[0];
for (int i=0; i<cantcomp; i++)
if (maycomp < vec[i])
maycomp=vec[i];
return maycomp;
}

float TVector2::CompMen(){
float mencomp=vec[0];
for (int i=0; i<cantcomp; i++)
if (mencomp > vec[i])
mencomp=vec[i];
return mencomp;
}

float TVector2::Rango(TVector2 a){
float range=0;
range = (a.CompMay() - a.CompMen());
return range;
}



// Main.cpp :

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "TVector2.h"
#include <iostream.h>

//---------------------------------------------------------------------------

#pragma argsused


int main(int argc, char* argv[])
{
int cantcomp=0;
cout << "Cuantas componentes desea, que tenga el vector?: " << endl;
cin >> cantcomp;


TVector2 v(cantcomp);
cout<<"Componentes del vector: "<<endl;
v.Leer();
cout << "Media geometrica: " << v.MediaGeo() <<endl;
cout << "La componente de mayor valor es: " << v.CompMay() <<endl;
cout << "La componente de menor valor es: " << v.CompMen() <<endl;
cout << "El rango es: " << v.Rango(TVector2 a) <<endl;

system("pause"); return 0;
}


Borland C++ Builder v6 gibt bei der Methode "Rango" folgende Fehlermeldungen aus:
- Improper use of typedef 'TVector2'
- Function call missing

Woran hapert es hier? Ich krieg die Fehlermeldung nicht weg.

Gruß, Uwe

5 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde 0 hilfreich
    Re: Improper use of typedef und Function call miss

    Hallo Uwe, cout << "El rango es: " << v.Rango(TVector2 a)
    <<endl;
    Du musst hier 'v.Tango(a)' aufrufen und das 'TVector2' weglassen. Übrigens nur nebenbei: Hast du dir über Division durch 0 Gedanken gemacht bei der Berechnung deiner Mittel?

    lg

    • Antwort von nach 4 Stunden 0 hilfreich
      Re^2: Improper use of typedef und Function call mi

      Hallo, Danke für die Antwort. Du musst hier 'v.Tango(a)' aufrufen und das 'TVector2'
      weglassen.
      Wenn ich DAS tue, kommt die Fehlermeldung "undefined symbol 'a'"....
      Das kann's also nicht sein. Übrigens nur nebenbei: Hast du dir über Division
      durch 0 Gedanken gemacht bei der Berechnung deiner Mittel?
      Äh, ja, dachte ich. Deshalb initiiere ich
      float medg=1;
      in der Implementation der Methode in TVector2.cpp

      Irgendwas hakt, ich weiß bloß nicht, was...

      Gruß, Uwe

      • Antwort von nach 12 Stunden 1 hilfreich
        Re^3: Improper use of typedef und Function call mi

        Hallo Uwe, Irgendwas hakt, ich weiß bloß nicht, was...
        Ich habs mal ein wenig aufgeräumt (hatte gerade keine
        Lust, was vernünftiges zu machen ;-) Ich denke, Du
        wurstelst Dich durch. Ich habe die Borland-spezifischen
        Sachen rausgenommen, aber vielleicht kompiliert das
        bei Dir sogar ohne diese. Ich hoffe, der Borland-Compiler
        unterstützt die aktuelle Include-Deklaration der Header.

        TVector2.h

        class TVector2 {
        float *vec;
        int cantcomp;
        public:
        TVector2(int n=0);
        TVector2(const TVector2 &);
        ~TVector2();
        int   Count    () const { return cantcomp; }
        void  Set      (float value, int index) { vec[index] = value; }
        float Get      (int index) const { return vec[index]; }
        float MediaGeo () const;
        float CompMay  () const;
        float CompMen  () const;
        float Rango    () const { return CompMay() - CompMen(); }
        };
        TVector2.cpp
        #include "TVector2.h"
        #include <iostream>
        #include <cassert>
        #include <cstring>
        #include <cmath>
        TVector2::TVector2(int n) : cantcomp(n) {  // Constructor
        vec = new float[ Count() ]; assert(vec != 0);
        memset( vec, 0, sizeof(*vec) * Count() );
        }
        TVector2::~TVector2() { // Destructor
        delete [] vec;
        }
        TVector2::TVector2(const TVector2& tv) { 
        cantcomp = tv.Count();
        vec = new float[ Count() ]; assert(vec != 0);
        memcpy( vec, tv.vec, sizeof(*vec) * Count() );
        }
        float TVector2::MediaGeo() const {
        float medg = 1.f;
        for (int i=0; i<Count(); i++)
        medg *= vec[i];
        return pow( medg, 1.0/Count() );
        }
        float TVector2::CompMay() const {
        float maycomp = vec[0];
        for( int i=1; i<Count(); i++ )
        if( maycomp < vec[i] ) maycomp = vec[i];
        return maycomp;
        }
        float TVector2::CompMen()  const {
        float mencomp = vec[0];
        for( int i=1; i<Count(); i++ )
        if( mencomp > vec[i] ) mencomp = vec[i];
        return mencomp;
        }
        Main.cpp
        #include "TVector2.h"
        #include <iostream>
        #include <cstdlib>
        void Leer(TVector2& v) 
        {
        for (int i=0; i<v.Count(); i++) {
        float value;
        std::cout << "Entre el " << (i+1) << " componente del vector: " << std::flush;
        std::cin >> value; 
        v.Set(value, i);
        }
        }
        int main(int argc, char* argv[])
        {
        int cantcomp=0;
        using namespace std;
        cout << "Cuantas componentes desea, que tenga el vector?: " << endl;
        cin >> cantcomp;
        TVector2 v(cantcomp);
        cout << "Componentes del vector: " << endl;
        Leer(v);
        cout << "Media geometrica: " << v.MediaGeo() <<endl;
        cout << "La componente de mayor valor es: "  << v.CompMay() <<endl;
        cout << "La componente de menor valor es: "  << v.CompMen() <<endl;
        cout << "El rango es: " << v.Rango() << endl;
        getchar(); 
        getchar(); 
        return 0;
        }

        Grüße

        CMБ

  2. Antwort von nach 10 Stunden 0 hilfreich
    Re: Improper use of typedef und Function call miss

    Hallo

    Lange her, dass ich in C/C++ was gemacht habe, aberkann es sein, dass du deinen TVector2 a nie erzeugst? v.CompMen() <<endl;
    cout << "El rango es: " << v.Rango(TVector2 a)
    <<endl;

    Hier deklarist du a ja nur als TVector2, da wird aber der Konstruktor nicht ausgeführt und damit existiert das Objekt noch nicht wirklich. Probier mal folgendes aus:
    TVector2 a = new TVector2;
    cout << "El rango es: " << v.Rango(TVector2 a);

    Kann aber sein, dass ich komplett falsch liege.

    lg
    JL

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!