Announcement

Collapse
No announcement yet.

Linker Fehler bei Portierung in C++Builder

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Linker Fehler bei Portierung in C++Builder

    Hey zusammen,

    zunächst einmal solltet ihr wissen, dass ich normalerweise für Console programmiere und ich deshalb relativ wenig Ahnung C++ Builder, insbesondere von WINAPI Programmierung und Objektdateien habe.
    Für ein Projekt würde ich gerne ein ursprünglich für Console geschriebenes Programm in ein C++Builder Formular bringen.
    Das habe ich soweit schon hinbekommen (es lief schon!), aber jetzt meckert der Compiler immer wegen Linkerfehler:

    [Linker Fehler] Unresolved external 'TForm1::' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\PROJECT1.O BJ

    Kann mir jemand helfen, dieses Problem zu lösen? Ich bin so langsam echt am durchdrehen...
    Am Kern des Programmes sollte eigentlich kein Fehler (von der ein oder anderen Stilmacke vielleicht abgesehen) sein - die Konsolenversion lief auf DevC++ einwandfrei.
    Angepasst wurden lediglich die Eingabe (Button) und die Ausgabe (Edit).
    Allen im Voraus ganz herzlichen Dank!
    Ich hoffe ihr könnt mir helfen...

    Lg Jonas

    Hier ist die *.cpp:
    [highlight=c++]
    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    #include <cstdlib>
    #include <iostream>
    #include <random.h> //Importierte Header
    #include <stdio.h>
    #include <conio.h>
    #include <unistd.h>
    #include <sstream>
    #include <string.h>
    //---------------------------------------------------------------------------
    using namespace std;
    int count_switch, i; //Vars-Init
    int *K, *_E, *K_neu, *E_neu, *solverNo, *T1, *T2;
    string _S, Aufgabe, Loesung, TASK, RLT;
    AnsiString Buffer;
    //---------------------------Importfunktionen--------------------------------
    void Ableitung(int a, int b)
    {
    K_neu[i] = b*a;
    E_neu[i] = b - 1;
    }
    //--------------------------------------------
    string Streaming(string a, int b, int b2, int c, int Typ)
    {
    string Saver;
    stringstream sstr;
    if(Typ == 0)
    {
    if(i == count_switch && a != "-")
    {
    a = "";
    }

    if(b != 0 && c > 1)
    {
    sstr << a << b << "x^" << c;
    }
    else if(b != 0 && c == 1)
    {
    sstr << a << b << "x";
    }
    else if(b == 0)
    {
    sstr << "";
    }
    else if(c == 0)
    {
    sstr << a << b;
    }
    else
    {
    sstr << "";
    }
    sstr >> Saver;
    }
    else
    {
    if(i == count_switch && a != "-")
    {
    a = "";
    }

    if(b != 0 && c > 1)
    {
    sstr << a << "(" << b << "/" << b2 << ")" << "x^" << c;
    }
    else if(b != 0 && c == 1)
    {
    sstr << a << "(" << b << "/" << b2 << ")" << "x";
    }
    else if(b == 0)
    {
    sstr << "";
    }
    else if(c == 0)
    {
    sstr << a << "(" << b << "/" << b2 << ")";
    }
    else
    {
    sstr << "";
    }
    sstr >> Saver;
    }
    return Saver;
    }
    //--------------------------------------------
    int get_typ()
    {
    return (rand() % 2 + 1);
    }
    //--------------------------------------------
    void solver()
    {
    int RS;
    count_switch = rand() % 6 + 1;
    K = new int [count_switch];
    _E = new int [count_switch];
    K_neu = new int [count_switch];
    E_neu = new int [count_switch];
    solverNo = new int [count_switch];
    T1 = new int [count_switch];
    T2 = new int [count_switch];

    for(i=count_switch; i>=0; i--)
    {
    solverNo[i] = get_typ();
    if(solverNo[i] == 1)
    {
    K[i] = rand() % 20;
    _E[i] = i;
    RS = rand() % 2 + 1;
    switch(RS)
    {
    case 1: _S= "+";
    break;
    case 2: _S = "-";
    break;
    }
    Ableitung(K[i],_E[i]);
    TASK = TASK + Streaming(_S,K[i],0,_E[i],0);
    RLT = RLT + Streaming(_S,K_neu[i],0,E_neu[i],0);
    }
    else
    {
    T1[i] = rand() % 5 + 1;
    T2[i] = rand() % 12 + 2;
    _E[i] = i;
    RS = rand() % 2 + 1;
    switch(RS)
    {
    case 1: _S= "+";
    break;
    case 2: _S = "-";
    break;
    }
    Ableitung(T1[i],_E[i]);
    TASK = TASK + Streaming(_S, T1[i], T2[i], _E[i],1);
    RLT = RLT + Streaming(_S, K_neu[i], T2[i], E_neu[i],1);
    }
    }
    }

    //--------------------------------------------
    bool Destructor()
    {
    delete K, _E, K_neu, E_neu;
    return true;
    }
    //--------------------------------------------
    String Ansiconvert(const string& myString)
    {
    return String(myString.c_str());
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Aufgabe_buttonClick(TObject *Sender)
    {
    solver();
    Aufgabe->Text = "";
    Aufgabe->Text = Ansiconvert(TASK);
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Loesung_buttonClick(TObject *Sender)
    {
    Loesung->Text = "";
    Loesung->Text = Ansiconvert(RLT);
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::ResetClick(TObject *Sender)
    {
    Aufgabe->Text = "";
    Loesung->Text = "";
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    srand(time(NULL)/* + getpid()*/);
    }
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    //**************************Ende des Skripts*********************************
    [/highlight]
    Zuletzt editiert von JFBx; 26.06.2010, 18:54.

  • #2
    Es gibt hier eine Codeformatierung. Des Weiteren warum wird string der STL benutzt UND AnsiString?

    Vermutlich wird das Problem in der *.h Datei liegen
    Christian

    Comment


    • #3
      Am liebsten hätte ich ganz auf AnsiString verzichtet, aber Edit (C++ Builder) erwartet scheinbar AnsiString. Also war der simpelste Weg, am Ende den string in ansistring umzuformatieren um ihn auszugeben. Meinst du, da liegt das Problem?
      Und was meinst du mit Codeformatierung?
      Hast du irgentwelche Anhaltspunkte, wo das Problem im Header sein könnte?

      Danke für die Hilfe,
      Jonas

      Comment


      • #4
        Am liebsten hätte ich ganz auf AnsiString verzichtet, aber Edit (C++ Builder) erwartet scheinbar AnsiString.
        Sicher nicht, besser wäre es auf string der STL zu verzichten. Aber wozu einfach, wenn es auch kompliziert geht...

        Hast du irgentwelche Anhaltspunkte, wo das Problem im Header sein könnte?
        Vermutlich in der Deklaration der Form
        Christian

        Comment


        • #5
          *.h:
          [highlight=c++]
          //---------------------------------------------------------------------------

          #ifndef Unit1H
          #define Unit1H
          //---------------------------------------------------------------------------
          #include <Classes.hpp>
          #include <Controls.hpp>
          #include <StdCtrls.hpp>
          #include <Forms.hpp>
          #include <ExtCtrls.hpp>
          #include <jpeg.hpp>
          //---------------------------------------------------------------------------
          class TForm1 : public TForm
          {
          __published: // Von der IDE verwaltete Komponenten
          TEdit *Aufgabe;
          TEdit *Loesung;
          TButton *Aufgabe_button;
          TButton *Loesung_button;
          TButton *Reset;
          TImage *Image1;
          TLabel *Label1;
          TLabel *Label2;
          TLabel *Label3;
          void __fastcall Aufgabe_buttonClick(TObject *Sender);
          void __fastcall Loesung_buttonClick(TObject *Sender);
          void __fastcall ResetClick(TObject *Sender);
          void __fastcall FormCreate(TObject *Sender);
          private: // Anwender-Deklarationen
          public: // Anwender-Deklarationen
          __fastcall TForm1(TComponent* Owner);
          };
          //---------------------------------------------------------------------------
          extern PACKAGE TForm1 *Form1; // <======================|
          //---------------------------------------------------------------------------
          #endif

          [/highlight]
          ---------------------------

          Das ist der Header. So wie ich mir das denke müsste die markierte Zeile einen Fehler aufweisen oder? Allerdings ist mir bisher nichts aufgefallen...
          Zuletzt editiert von JFBx; 26.06.2010, 22:34.

          Comment


          • #6
            Bitte benutze zum formatieren des codes [code] [/code] oder noch besser [highlight=c++][/highlight].

            Danke!!! Liest sich einfach besser. Kann auch im nachhinein über den Editieren Button noch eingepflegt werden.

            Comment


            • #7
              Sofern die *.h Unit1 heisst sieht das ok aus

              http://www.marquardtnet.info/cecke/q...quicky_20.html

              Lösche mal alle Dateien die dort mit einem * beschrieben sind und compiliere & linke neu
              Zuletzt editiert von Christian Marquardt; 26.06.2010, 18:41.
              Christian

              Comment


              • #8
                Auch hallo,

                als Anhang ein Versuch das Programm mit Emba. RAD Studio 2010 nachzuprogrammieren. Es kompiliert und läuft fehlerfrei, allerdings wurden random.h und unistd.h auskommentiert.
                Attached Files
                MfG
                Cheat-Sheets for Developers / Programming Quotes

                Comment


                • #9
                  Ja, das Header-File heißt so...
                  Dein Vorschlag hat leider nicht geklappt. Von den mit * beschriebenen Dateien gab es:
                  -Projekt1.tds
                  -Projekt1.obj
                  -Unit1.obj
                  Ich hab alle gelöscht und neu kompilliert, das Problem bleibt. Hast du noch eine Idee?

                  @fanderlf: Danke für den Hinweis.

                  Lg Jonas

                  Comment


                  • #10
                    @Markus: Wow, danke für deine Mühe!! Leider braucht mein PC die Datei rtl140.bpl (und wahrscheinlich noch ein paar mehr) um das Programm zu laden. Ich vermute, dass ist eine Datei, die in der Entwicklungsumgebung enthalten ist...

                    Wenn ich richtig informiert bin, ist Emba. RAD Studio 2010 Delphi - oder?

                    Danke für euren Einsatz!

                    Lg Jonas

                    Comment


                    • #11
                      @Markus

                      Was könnte ihm dein "nachprogrammiertes" bringen? Dann auch nur eine exe in das ZIP zu packen anstatt die Sourcen

                      Leider braucht mein PC die Datei rtl140.bpl
                      Es ist falsch gelinkt

                      Aber hat sich ja dann erledigt....
                      Christian

                      Comment


                      • #12
                        Aber hat sich ja dann erledigt....
                        Naja, ich weiß Markus Mühe zu schätzen, aber ich hab im Moment noch keine Lösung für mein Problem. Weil zum einen hab ich nicht 200 Zeilen Programm in C++ geschrieben um dann Delphi zu nehmen, zum anderen läuft das Programm von Markus in seiner jetzigen Form bei mir nicht.
                        Habt ihr sonst keine Anhaltspunkte mehr?

                        Lg Jonas

                        Comment


                        • #13
                          Mühe
                          Danke für die Blumen. Die IDE kommt von hier (30 day trial) und verlangt zwecks Aktivierung ein paar Angaben. Anbei das C++-Projekt als Source und ein Screenshot der Anwendung.
                          Attached Files
                          MfG
                          Cheat-Sheets for Developers / Programming Quotes

                          Comment


                          • #14
                            Anbei das C++-Projekt als Source und ein Screenshot der Anwendung.
                            Die Datei hat doch bis auf den letzten Byte den gleichen Inhalt...Verwechslung?

                            Jonas

                            Comment


                            • #15
                              Verwechslung?
                              ...Eigentor (falsches Verzeichnis erwischt ), anbei ein neuer Versuch.
                              Aber soviel Arbeit ist das nicht: RAD Studio 2010 installieren, C++ Builder starten, neues Projekt, zwei TEdit und 3 TButtons Controls auf Form1 platzieren, Quellcode via Copy'n'Paste einfügen, zwei Headerdateien auskommentieren. Und dann kompilieren lassen...
                              Attached Files
                              MfG
                              Cheat-Sheets for Developers / Programming Quotes

                              Comment

                              Working...
                              X