Zum Inhalt springen

T.Error

Mitglieder
  • Gesamte Inhalte

    13
  • Benutzer seit

  • Letzter Besuch

  1. oh mann ich bin auch ein doedel hat sich aufgeklaert - ich hab im falschen sql-statement nach dem fehler gesucht, da ich nur das eine statement als debug-ausgabe auf die konsole ausgegeben habe. typischer fall von pebcak also is wohl das beste zeichen, dass ich fuer heute mal aufhoeren sollte zu arbeiten .... so long TechnicalError
  2. heyho zusammen bin da heute auf ein problem gestossen, fuer das ich bisher nirgendwo eine loesung finden konnte. ich schreibe derzeit ein programm mit c++ und qt, welches daten aus einer datenbank abfragen soll. das suchkriterium wird dabei vom nutzer eingegeben und automatisch wildcards ('%') am anfang und ende eingefuegt. in der regel funktioniert das auch alles wie gewollt (zB kommt bei der suche nach 'ndre', was der datenbank als '%ndre%' uebergeben wird, gibt die datenbank "Andreas" zurueck). nur in einigen faellen wirft dir datenbank einen seltsamen fehler aus: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 QMYSQL: Unable to execute query. das passiert zum beispiel nach der abfrage nach 'madd': ... AND (( p.Vorname LIKE '%madd%' ) OR ( p.Nachname LIKE '%madd%' )) ( als letzter teil des WHERE-teils ... der rest sollte uninteressant sein ) auch in verschiedenen anderen kontruierten konstellationen tritt der fehler auf. hat jemand eine idee wie und warum der fehler dabei zustande kommt und wie man ihn dann umgehen kann? mfg TechnicalError
  3. T.Error

    template-klassen

    hm stimmt. denkfehler meinerseits. ich kann dafür natürlich auch die normale insert-funktion der klasse LIST benutzen ... template <class T> void LIST<T>::insertElem(T* pI); danke für den denkanstoß ... ne lösung kann manchmal so trivial sein grüße TError
  4. moin zusammen. ich hätt mal ne frage eine template-klasse betreffend: ich möchte gern eine funktion wie folgt definieren: template <class T> void LIST<LOAN<T> >::insertLoan(...) {...} dabei sind sowohl LIST als auch LOAN eine template-klasse. nun habe ich aber das problem, dass ich nicht weiß wie ich diese funktion in der LIST-klasse (ich bin der meinung, dass diese dort hinein muss) deklariert werden muss. so auf jeden fall nicht: template <class T> class LIST { ... public: void insertLoan(...); } ... ich bin der meinung, dass ich die lösung in den letzten tagen irgendwo schonmal gesehen hab. nur ist diese auch nach stundenlangem googlen nicht wieder auffindbar :old grüße TechnichalError
  5. tjoa nach langem und nervtötendem rumprobiere möchte ich hier meinen fortschritt posten ... ich komm an selbem problem "mal wieder" nich weiter. hab, soweit es nötig war, alles auf pointer umgestellt, es lässt sich problemlos compilieren, nur passiert nicht das, wie es von mir beabsichtig ist. die änderungen zum "original": [LIT.h in pulbic] virtual bool operator==(const LIT *other) =0; [PERSON.cpp] bool PERSON::operator==(const LIT* other) { PERSON* tmp(this); PERSON* obj; obj=(PERSON*)other; return ((tmp->Fname==obj->Fname) && (tmp->Lname==obj->Lname)); } interessant wäre da evtl auch ein paar ausschnitte aus der STRING-klasse: class STRING { private: int len; char* pBuf; public: STRING(); STRING(const char* pStr); STRING(const STRING& other); STRING(char C, int n); ~STRING(); int getLen(); STRING& operator=(const STRING& other); STRING& operator=(const char* pStr); bool operator==(const STRING& other); friend ostream& operator<<(ostream& OS, const STRING& other) { OS<<other.pBuf; return OS; } }; STRING& STRING::operator=(const STRING& other) { len=other.len; pBuf=new char[len+1]; strncpy(pBuf, other.pBuf, len); return *this; } STRING& STRING::operator=(const char* pStr) { len=strlen(pStr); pBuf=new char[len+1]; strncpy(pBuf, pStr, len); return *this; } bool STRING::operator==(const STRING& other) { STRING tmp(*this); return !strcmp(tmp.pBuf, other.pBuf); } die dazugehörige main-funktion, um das zu testen lautet: int main() { PERSON* a; PERSON* b; PERSON* c; a=new PERSON(1, "user", "fname", "lname"); b=new PERSON(2, "user", "fname", "lname"); c=new PERSON(3, "in", "out", "done"); if(a== cout<<"a==b\n"; if(a==c) cout<<"a==c\n"; return 0; } [/code] die beiden if-abfragen werden beide als false interpretiert. nur weiß ich nicht warum ... irgendwo muss der fehler liegen. wenn sich irgendwer dem ganzen wirrwar annehmen würde währ ich demjenigen äußerst dankbar ... aber warscheinlich seh ich mal weider den wld vor lauter bäumen nicht grüße technichal.error
  6. hm pointer zu benutzen klingt echt nach nem plan ... ich arbeite ja auch später im zugriff auf die objekte der klasse PERSON mit nem pointer der klasse LIT ... aber auf die pointer auch dort zu benutzen muss man erstma kommen :floet: danke für den tipp grüße T.Error
  7. mkay danke für die antworten ... fehler erkannt. da hab ich wohl den ganzen spaß nich komplett durchdacht gehabt ... pure virtual war übrigens gewollt ... bin ich mal gespannt, obs am ende trotzdem so funktioniert, wie ich mir das vorgestellt hab grüße T.Error
  8. STRING ist eine von mir selbst definierte klasse
  9. guten morgen zusammen hab da ein kleines problem, welches ich nun verzweifelt seit geraumer zeit zu lösen versuche, aber bisher kläglich daran scheitere. zum problem: in einer klasse, die auf einer basisklasse basiert, möchte ich den vergleichsoperator "==" überladen. der überladene operator soll aber auch als virtuelle funktion in der basisklasse existieren, damit er auch in anderen, von der basisklasse abgeleiteten klassen, nutzbar ist wichtige ausschnitte aus der klassendefinition: [LIT.h] class LIT { private: int Id; STRING Title; public: LIT(); void setId(int num); void setTitle(const STRING& Str); void setTitle(const char* pStr); int getId(); STRING& getTitle(); virtual bool operator==(const LIT& other) =0; }; [PERSON.h] class PERSON : public LIT { private: STRING Fname; STRING Lname; public: PERSON(int num); PERSON(int num, const char* title, const char* Pname, const char* Sname); PERSON(int num, const STRING& title, const STRING& Pname, const STRING& Sname); STRING& getFname(); STRING& getLname(); int getId(); STRING& getTitle(); bool operator==(const PERSON& other); }; [PERSON.cpp] bool PERSON::operator==(const PERSON& other) { PERSON tmp(*this); return ((tmp.Fname==other.Fname) && (tmp.Lname==other.Lname)); } das versuche ich dann mit einer kleinen mainfunktion zu testen: int main() { PERSON a(1, "user", "fname", "lname"); PERSON b(2, "user", "fname", "lname"); PERSON c(3, "in", "out", "done"); if(a== cout<<"a==b\n"; if(a==c) cout<<"a==c\n"; return 0; } [/code] der compiler wirft dann diese fehlermeldung raus: [code] PERSON.cpp: In member function ‘bool PERSON::operator==(const PERSON&)’: PERSON.cpp:73: error: cannot declare variable ‘tmp’ to be of abstract type ‘PERSON’ PERSON.h:6: note: because the following virtual functions are pure within ‘PERSON’: LIT.h:19: note: virtual bool LIT::operator==(const LIT&) engine.cpp: In function ‘int main()’: engine.cpp:44: error: cannot declare variable ‘a’ to be of abstract type ‘PERSON’ PERSON.h:6: note: since type ‘PERSON’ has pure virtual functions engine.cpp:45: error: cannot declare variable ‘b’ to be of abstract type ‘PERSON’ PERSON.h:6: note: since type ‘PERSON’ has pure virtual functions engine.cpp:46: error: cannot declare variable ‘c’ to be of abstract type ‘PERSON’ PERSON.h:6: note: since type ‘PERSON’ has pure virtual functions wenn ich den eintrag "virtual bool operator==(const LIT& other) =0;" aus der LIST.h entferne läuft das programm ohne zu murren. dem entnehme ich, dass der compiler ein problem mit der virtuellen funktion hat, wobei ich mir nicht erklären kann welches. kann mich da jemand aufklären? MfG T.Error
  10. dann ist ja gut. danke dir nochaml für deine hilfe. greez Technical.Error
  11. auch für den fall, dass der int-wert definitiv maximal 2 stellen besitzt? (was bei mir der fall wäre - denn eigentlich möchte ich in vLen die länge eines strings speichern, welcher maximal 64 zeichen umfasst)
  12. hm stimmt. vLen um eins größer und vLen[2]=0 hilft. danke für die schnelle hilfe grüße Tchnical.Error
  13. Hallo zusammen, im rahmen meiner belegarbeit für dieses semester bin ich auf ein für mich unerklärliches kuriosum gestoßen: wenn ich eine datei mit fopen öffne, dann irgendetwas mit der funktion sprintf mache und danach fclose rufe, bekomme ich einen speicherzugriffsfehler, da der filepointer umgesetzt wurde. als (minimalisierter) c-quelltext sieht das ganze so aus: int main() { FILE *pUD; char vLen[2]; int i=12; pUD=fopen("UserData", "ab"); if(!pUD) printf("could not open file!"); printf("%i\n", (int)pUD); /*der filepointer nach int gecastet, damit man diesen kontrollieren kann*/ sprintf(vLen, "%d", i); printf("%i\n", (int)pUD); fclose(pUD); return 0; } wenn ich diese quelltext kompiliere (per gcc (SUSE Linux) 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036]) bekomm ich folgende auswurf in der konsole: 134529064 134529024 Speicherzugriffsfehler über gedanken/vorschläge, warum das so ist und wie man das am besten beheben kann, würde ich mich freuen MfG Technical.Error

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...