Ansistring Array als Klassenelement initialisieren
-
@audacia: Warum drehst Du ihm ein statisches Objekt an? Er kann doch ein Konstruktor in seiner Struct definieren und es darüber initialisieren.
-
Floyd schrieb:
Jap, danke - dann mache ich es so.
Um weiteren Kommentaren dazu vorzubeugen: du bist dir der Implikationen bewußt, wenn du die Variable statisch machst?
Floyd schrieb:
also, manchmal tauchen Linker-Fehler auf, normalerweise kan man sich die Linker Zuordnungen irgendwie anschauen - wenn ich das richtig in Erinnerung habe ... wenn offensichtlich nicht - bitte um Nachsicht
...
So ganz genau kann ich mir immer noch nicht vorstellen, was du möchtest. Du kannst deine .obj-Dateien mit TDUMP analysieren oder den Linker eine .map-Datei erstellen lassen; vielleicht ist das, was du brauchst.
witte schrieb:
@audacia: Warum drehst Du ihm ein statisches Objekt an? Er kann doch ein Konstruktor in seiner Struct definieren und es darüber initialisieren.
Lies nochmal:
audacia schrieb:
Die Initialisierung muß ja für jedes Objekt deiner Klasse durchgeführt werden, und daher gehört sie in den Konstruktor. Dort mußt du allerdings jedes Element separat und auf dem herkömmlichen Wege zuweisen [...].
-
Um weiteren Kommentaren dazu vorzubeugen: du bist dir der Implikationen bewußt, wenn du die Variable statisch machst?
Jap - die Problematik von statischen variablen (sie heißen ja nicht umsonst so ..) ist mir bekannt - mhh..
Die Initialisierung jedes einzelnen Elementes ist etwas nervig ...
-
Hi Leute,
bevor ich hier ganz viel Code reinstelle - kurz eine Erläuterung, ich lese gerade das Buch von R. kaiser über C++ (meiner Meinung nach sehr gut!) und wollte zu einem Beispiel ein kleines Programm "drumherum" basteln - ich bin allerdings auf einige Probleme gestoßen - im Moment aber vor Allem ein Syntax Fehler, den ich partout seit 2 Tagen ich zu finden nicht in der lage bin ...
Die beiden Klassen (zu mehr hab ich es noch nicht gebracht) sollen später eine Funktion GaussElimination(double a[][n], double b[], double x[] ,double p[], int n)
"versorgen" - d.h. aus einem Text Eingaben der Form:"a0= [any_real_Number] a1= [another_real_number] ...an=[last_coefficient] b0= [any_real_number] ... bm=[last_result];"
Das entspricht dann einer Matrix, wie folgt:
a00 * x + a01 * x +... + a0n * x = b0
a10 * x + a11 * x +... + a1n * x = b1
. . . .
. . . .
. . . .
an0 * x + an1 * x + ... + ann * x = bnAlso brauche ich ein 2-dimensionales, dynamisches array, das mit Werten gefüllt wird, die ich aus nem Text auslese. Mit festen Arrays ist mir das ganze schon gelungen - ich würde aber gerne meine aktuellen Bereicherungen an c++-Wissen (dynamische, 1-diemnsionale Arrays) mit benutzen - und außerdem diesen f****** Fehler finden .
struct cmd { union function { bool gauss; bool add; bool sub; bool mul; bool div; }; void Delete () { CAS->RiEdCAS->Lines->Clear(); } AnsiString HighestDelimiter(AnsiString s) { for(int i=0; i<=s.Length(); i++) { AnsiString tmp = s; if(tmp.Pos(";") != 0) { s = s.SubString(tmp.Pos(";"), (tmp.Length()-tmp.Pos(";"))); } } return s; } AnsiString CleanUp(AnsiString s) { s.Trim(); return s; } }; struct gauss { int numbera; int numberb; int countaorb(AnsiString aorb, AnsiString s) // Determines number of a's or b's { int number = 0; for(int i=0; i != -1; i++) { if(s.Pos(aorb+IntToStr(i)+"=") != 0) { number++; } if(s.Pos(aorb+IntToStr(i)+"=") == 0 ) { i = -2; } if( (s.Pos(aorb+IntToStr(i)+"=") == 0) && (i ==0) ) { return 0; } return number; } int* Positionaorb(AnsiString aorb, AnsiString s, int number) // figures (hopefully) correct position of suceeding number { int* pos = new int[number]; for(int i=0; i<=number; i++) { AnsiString tmp = IntToStr(i); pos[i]= (s.Pos(aorb+tmp+"=")+ tmp.Length()+2 ); } return pos[]; } double* valuea(AnsiString s, int pos[], int numbera, int numberb) // creates rows times cols number of arrays dynamically { // unfinished !!! if(numberb !=0) // function shall return a dynamically created Array double*[][] { for(int i=0; i<= numbera/numberb; i++) { double* (a+IntToStr(i)) = new double[numbera/numberb]; // creates rows times cols number of arrays (will this work?) } } else {return Null;} for(int i=0; i<=numberb; i++) { ((a+IntToStr(i))+i) = (a+IntToStr(j)); // numbera /row = numbera/numberb for(j=0; j<=numbera/numberb; j++) { // AnsiString tmp = s.SubString(*(pos+j), (*(pos+j+1) - *(pos+j))); *((a+IntToStr(j))+j) = tmp.ToDouble(); } // i have no idea how to achieve one pointer pointing on the the other array ... } return 0; } };
Danke für jeden der sich das antut ...
Benutze BCB 4.Fragt wenn noch etwas nebulös erscheint.Grüße,
floyd
-
Floyd schrieb:
im Moment aber vor Allem ein Syntax Fehler, den ich partout seit 2 Tagen ich zu finden nicht in der lage bin ...
Steige auf C++Builder >=2006 um, dann findest du den Fehler sofort.
(Und falls nicht: schau mal, wo du den in Zeile 45 geöffneten Block wieder schließt.)Weitere Hinweise zur Syntax:
- Die eckigen Klammern in Z. 69 sind falsch.
- Was du mit Z. 78 bezweckst, erschließt sich mir auch nach zweimaligem Durchlesen nicht.
- In C++ gibt es kein Schlüsselwort namens Null (Z. 82), lediglich den numerischen Wert 0, das aus C stammende Makro NULL, das meist über 0 oder ((void*)0) definiert ist, oder im kommenden Standard nullptr.
Inhaltlich habe ich mir den Code nicht weiter angesehen, aber meine beim Überfliegen aufgekommenen Gedanken möchte ich dir dennoch mitteilen:
- In einer normalen C++-Anwendung benutzt man new selten, new[] äußerst selten und delete bestenfalls nie. Bitte lies hier, warum es std::auto_ptr gibt, und suche bei Google nach std::vector.
- Nackte Zeiger zurückzugeben gehört sich nicht (es sei denn, es handelt sich um eine VCL-Komponente, die von ihrem Owner freigegeben wird). Nimm einen Smart-Pointer (allerdings nicht std::auto_ptr - wie im verlinkten Artikel zu lesen ist, darfst du von auto_ptr keine temporären Kopien erstellen, was auch die Verwendung als Funktionsrückgabewert ausschließt. Hierfür ist z.B. der shared_ptr aus Boost oder dem TR1 geeignet.)
- Im Gegensatz zu Java oder Delphi gibt es keine allgemeingültige Nomenklaturkonvention für C++. Dies ist durchaus charakteristisch für die Sprache, in der man sich nicht einmal auf einen allgemein verwendbaren String-Typ, einen tauglichen Smart-Pointer in der Standardbibliothek und dergleichen einigen konnte. Dennoch ist es ratsam, in eigenen Programmen einer Konvention - wenn es sein muß, auch einer eigenen - konsequent zu folgen.
- Auch deine inhaltliche Namensgebung könnte etwas explanativer sein. Die Benutzer deines Codes (auch du selbst!) profitieren deutlich davon, wenn bereits dem Funktionsnamen zu entnehmen ist, was die Funktion tut, und die Parameternamen bereits aussagen, was die Funktion übergeben zu bekommen wünscht. Es ist besser, wenn die Benutzer deinen Code nicht durchlesen müssen, um seinen Zweck zu verstehen.
-
Danke für deine Hinweise !!
Das fehlende Bracket-Highlighting stört schon sehr im BCB 4 ... vermutlich ist das der Grund, warum ich den Fehler mit der 5. version gesehen hätte. Die Hinweise zu <shared_ptr> und insbesondere zur Verwendung von Vektoren sind mir bekannt - ich habe das Konzept der Zeiger auch gerade erst gelernt
.
In wirklichen projekten würde ich diese natürlich implementieren.
Nur zur Erklärung: Zeile 78 sollte viele Arrays mit der bezeichnung "a0[numbera/numberb], a1[numbera/numberb], a2[numbera/numberb] ..."
anlegen - aber ich glaube, das geht so nicht - nicht wahr ?
Eine variable im bezeichner durchlaufen zu lassen... (war ne spontane Idee..)
Die eckigen Klammern in Z.69 sollten da auch gar nicht sein - ich glaube die hatte ich eingefügt, als mir nix besseres mehr eingefallen ist ...Grüße,
Floyd
-
Floyd schrieb:
Die Hinweise zu <shared_ptr> und insbesondere zur Verwendung von Vektoren sind mir bekannt - ich habe das Konzept der Zeiger auch gerade erst gelernt
.
In wirklichen projekten würde ich diese natürlich implementieren.
Dann ist es ja gut
Floyd schrieb:
Nur zur Erklärung: Zeile 78 sollte viele Arrays mit der bezeichnung "a0[numbera/numberb], a1[numbera/numberb], a2[numbera/numberb] ..."
anlegen - aber ich glaube, das geht so nicht - nicht wahr ?Nein, das geht nicht. Nimm einen std::vector.
-
Hi,
eine Frage zu den shared Pointern habe ich noch -
und zwar: gibts die Lib auch schon im BCB 4 ? oder kann ich den C++-Standard irgendwie unabhängig von der IDE aktualisieren ? (ich vermute mal nein ..)der bcb 6 ist mir zu teuer
-
Hallo
Den shared_ptr gibts auch nicht im BCB5, oder im neuesten Studio.
Noch ist dieser nur ein Teil der externen boost-Library, die du aus dem Netz laden must. Aber wenn du nur den shared_ptr daraus haben willst, reciht es wenn du die entsprechende Headerdatei findest und einbindest, ohne extra die komplette Library zu kompilieren.
Erst im nächsten C++ Standard wird dieser ptr bei hoffentlich jedem Kompiler dabeisein.bis bald
akari
-
danke - auch der Job ist erledigt. So kann ich mit shared pointern arbeiten, Erfahrungen mit vektoren habe ich bereits .
Mhhh. 2 Fragen noch: 1. Ich bekomme nun plötzlich den fehler "[linker fehler] unresolved external "modul_name_der_euch_nix_sagt ::" referenced from C:\"Pfad_der_ebenfalls_nix_sagt"\projekt.obj
Ähm ja - das dumme ist, ich wusste mal, wie man die Dinger beseitigt, ich glaube, der Linker weiß manchmal nicht mehr, was er denn eigentlich Linken soll, wenn einfach bestimmte Funktionen o.Ä. rausgelöscht werden. Also frage ich nochmal, wie beseitigt man diese Linker fehler ?
2. ich habe mal gehört (ganz unbestimmt), dass vektoren bei bestimmten sachen langsamer sein sollen, als pointer?
danke,
floyd
-
Mhh.. ich finde den Fehler nicht ...
Ich habe jede Datei, die irgendwie mit dem Projekt zu tun hat, durchsucht - nirgends taucht das angegebene Modul, welches falsch oder gar nicht gelinkt wird, in falscher Schreibweise auf. Welche Bewandnis haben denn diese OBJ dateien?P.S. Das mit den vektoren klappt ganz nett - wozu brauch man schon dynamische Arrays ?
-
Floyd schrieb:
Ähm ja - das dumme ist, ich wusste mal, wie man die Dinger beseitigt, ich glaube, der Linker weiß manchmal nicht mehr, was er denn eigentlich Linken soll, wenn einfach bestimmte Funktionen o.Ä. rausgelöscht werden. Also frage ich nochmal, wie beseitigt man diese Linker fehler ?
Das ist hochgradig davon abhängig, wie die Modul- und Symbolnamen, die uns nichts sagen sollen, lauten.
Floyd schrieb:
Welche Bewandnis haben denn diese OBJ dateien?
Jede .cpp-Datei deines Projekts wird vom Compiler zu einer .obj-Datei übersetzt, in der sich der noch nicht an fixe Adressen gebundene Code sowie eine Symbol-Import- und Exportliste befinden. Der Linker ist dafür verantwortlich, für jeden Symbolimport einen passenden -export zu finden, allen Code und alle Daten zusammenzufügen und die endgültigen Adressen festzulegen.
-
Ok, kann es sein, dass ich für meine eigens verfassten Klassen Funktionen (inline Funktionen) irgendwas in die Header-Datei schreiben muss ? - Soweit bin ich gekommen. Ich schätze mal, da wo "Anwenderdeklarationen" steht
.
Ok, soweit: Bevor ich da was kaputt spiele, wie macht man das genau, für eine in einer Klasse x deklarierten methode y ?
Danke für eure Hilfe ( = Zeit) - aber ich hoffe ich stelle mich nicht zu dämlich (=aufwendig) an.
-
audacia schrieb:
Das ist hochgradig davon abhängig, wie die Modul- und Symbolnamen, die uns nichts sagen sollen, lauten.
Ok - also, das eine ist ein Pfad auf meiner Festplatte in Laufwerk C und das andere der Name des Moduls, in dem ich die Klasse geschrieben habe, samt den Methoden, um die es anfangs ging.
Auffällig war, dass in der Fehlermeldung t_modul_name klein geschrieben war - sowohl das "t" als auch der Name. Eigentlich heißt es ja immer TForm1 und nicht tform1 - aber das nur am Rande, ich weiß nicht, ob das was heißen könnte.
-
nervig - ich finde den Linker Fehler echt nicht - ich hab im Header gesucht und alles durchwühlt, was es an Einstellungen gibt.
Ok, sagt mir, was ihr an Info's braucht ... ich weiß nicht, wo hier was schief läuft! Ich könnte natürlich auch nen neuen Thread aufmachen...
-
Schicke doch mal die Linker-Fehlermeldungen, und die Header-Datei von Klasse x, wo die Methode y fehlen könnte. Hinweis: Hast Du in der C++-Datei vor Methode y das X:: vorangestellt? Wäre jetzt mein Tip auf dem Lottoschein.
-
Ok, geht klar:
[Linker Fehler] Unresolved External 'tcas::' referenced from D:\MEINE PROGRAMME\RECHNER_NEU\RECHNER.OBJ.
Zur Erklärung: Rechner_neu ist der name des Projektes, die Klasse heißt eigentlich TCAS (also großgeschrieben - falls das was heißen könnte).
Sie besteht aus 2 Units (Rechner.h und CAS.h
).
der Header der Unit 2 (der untere) ist wohl der wichtigere, in Unit 2 wurde die fragliche Methode deklariert.Vielen dank für eure Mühe - das kann man in den Foren ja gar nicht genug sagen...
Header Unit 1:
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Dialogs.hpp> #include <Menus.hpp> #include <ComCtrls.hpp> //--------------------------------------------------------------------------- class TRechner : public TForm { __published: // Von der IDE verwaltete Komponenten TEdit *EdInput; TButton *ButResult; TGroupBox *GroupBox1; TOpenDialog *OpenDialog1; TSaveDialog *SaveDialog1; TGroupBox *GroupBox2; TMemo *MemoResults; TGroupBox *GroupBox3; TMainMenu *MainMenu1; TMenuItem *Savetofile1; TMenuItem *Exit1; TMenuItem *Datei1; TLabel *Label1; TButton *ButAdd; TButton *ButSubtract; TButton *ButMultiply; TButton *ButDivide; TButton *ButDel; TButton *ButQSum; TButton *ButFibo; TButton *ButGoldSec; TButton *ButPythagoras; TButton *ButSqareSum; TButton *ButGoldbach; TMenuItem *Info1; TMenuItem *Bearbeiten; TMenuItem *Rckgngig1; TButton *Butpi; TButton *ButBinary; TButton *ButCAS; void __fastcall Exit1Click(TObject *Sender); void __fastcall ButAddClick(TObject *Sender); void __fastcall ButResultClick(TObject *Sender); void __fastcall ButSubtractClick(TObject *Sender); void __fastcall ButMultiplyClick(TObject *Sender); void __fastcall ButDivideClick(TObject *Sender); void __fastcall ButDelClick(TObject *Sender); void __fastcall ButQSumClick(TObject *Sender); void __fastcall EdInputKeyPress(TObject *Sender, char &Key); void __fastcall ButFiboClick(TObject *Sender); void __fastcall ButGoldSecClick(TObject *Sender); void __fastcall ButPythagorasClick(TObject *Sender); void __fastcall Savetofile1Click(TObject *Sender); void __fastcall Info1Click(TObject *Sender); void __fastcall ButGoldbachClick(TObject *Sender); void __fastcall Rckgngig1Click(TObject *Sender); void __fastcall ButpiClick(TObject *Sender); void __fastcall ButBinaryClick(TObject *Sender); void __fastcall Button1Click(TObject *Sender); void __fastcall ButCASClick(TObject *Sender); //void __fastcall FormKeyPress(TObject *Sender, char &Key); //auskommentiert private: // Anwenderdeklarationen public: // Anwenderdeklarationen __fastcall TRechner(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TRechner *Rechner; //--------------------------------------------------------------------------- #endif
Header Uni2 (CAS) :
//--------------------------------------------------------------------------- #ifndef Unit2H #define Unit2H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ComCtrls.hpp> //--------------------------------------------------------------------------- class TCAS : public TForm { __published: // Von der IDE verwaltete Komponenten TRichEdit *RiEdCAS; TGroupBox *GrBEd; TButton *ButExe; TButton *ButDel; private: // Anwenderdeklarationen public: // Anwenderdeklarationen __fastcall TCAS(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TCAS *CAS; //--------------------------------------------------------------------------- #endif
-
witte schrieb:
Schicke doch mal die Linker-Fehlermeldungen, und die Header-Datei von Klasse x, wo die Methode y fehlen könnte. Hinweis: Hast Du in der C++-Datei vor Methode y das X:: vorangestellt? Wäre jetzt mein Tip auf dem Lottoschein.
Nein - der Hinweis von mir war Quatsch - ich nehme an, das muss man nur, wenn man Methoden für die vom Builder erstellte Klasse (hier TCAS) schreibt - das habe ich aber nicht, ich habe auf TCAS selbst Klassen geschrieben - hoffentlich ist "auf" hier die richtige Präposition ...
-
Im BCB6 gibt es unter Projekt->Optionen->Erweiterter Linker die Option "Linken ohne Groß/Kleinschreibung". Hast Du dort rumgespielt?
-
mhh.. im BCB 4 habe ich das noch nicht gesehen ...rumgespielt habe ich leider daher auch nicht damit