Zum Inhalt springen

Kadaj

Mitglieder
  • Gesamte Inhalte

    133
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Kadaj

  1. Dann scheint es ja doch einfacher zu sein, als ich dachte, trotzdem bekomme ich an genau dieser Stelle einen Fehler. So sieht das Programm aus: #include <iostream> using namespace std; #include "cstrg.h" int main() { CString M1 ="Max"; CString M2("Moritz"); CString M3; M3 = M1 + " und " + M2; cout << "Willhelm Busch: \n" << M3 << "\n"; M1="______________"; M1[0]='+'; M1[M1.GetLenght()-1]=M1[0]; cout << "test3\n"; cout << M1 << '\n'; return 0; } und so die Klasse, die ich dazu geschrieben habe: #include <iostream> #include <cstring> #include <cstdlib> #include <cctype> using namespace std; class CString; class CString{ private: char *buffer; int len; public: // Konstruktoren CString(); CString( const char *string ); // Dekonstruktor ~CString(); // Überladen der Operatoren CString operator=( const char *string ){ cout << "Aufruf in = *string\n"; if(strcmp(string,buffer) == 0) return *this; if(strlen(string) > 0) { if(isdigit(len)){ // ist len mit einer Zahl belegt? if(len > 0) delete [] buffer; } len = strlen(string); buffer = new char[len+1]; strncpy(buffer,string,len); } return *this; } friend CString operator+( CString m1, CString m2); friend ostream& operator<<(ostream& os, CString& m); char *GetName(){ return buffer; } char& operator[]( int x){ return buffer[x]; } /* char operator=( const char c ){ cout << "Aufruf in = char\n"; return c; } */ int GetLenght(){ return len; } }; ostream& operator<<(ostream& os, CString& m){ os << m.buffer; return os; } CString::CString(){ len = 0; buffer = new char[1]; buffer[0] = 0; } CString::CString( const char *string ){ if( strlen(string) != 0 ) { len = strlen(string); buffer = new char[len+1]; strcpy(buffer,string); } } CString::~CString(){ delete [] buffer; } CString operator+( CString m1, CString m2){ CString tmp; tmp.buffer = new char[m1.len+m2.len+1]; strncpy(tmp.buffer,m1.buffer,m1.len); strncat(tmp.buffer,m2.buffer,m2.len); return tmp; } Kompilieren lässt dich alles, aber beim Ausführen: ./stringoverload Willhelm Busch: Aufruf in = *string test3 + *** glibc detected *** ./stringoverload: double free or corruption (fasttop): 0x0804c088 *** ======= Backtrace: ========= /lib/libc.so.6(+0x6ff0b)[0xb767ef0b] /usr/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb7876b2f] /usr/lib/libstdc++.so.6(_ZdaPv+0x1b)[0xb7876b8b] ./stringoverload[0x8048960] ./stringoverload[0x8048be8] /lib/libc.so.6(__libc_start_main+0xf3)[0xb7628003] ./stringoverload[0x8048811] ======= Memory map: ======== 08048000-0804a000 r-xp 00000000 00:24 24686514 . . . Anstelle des "+"-Zeichen nach test3 müsste eigentlich der string +-----------+ ausgegeben werden, also hat das mir dem Überladen des []-Operators scheinbar nicht richtig funktioniert, oder sollte dieser Fehler ganz wo anders liegen? Ich hock da bestimmt schon 2 Stunden drüber und habe alle möglichen Schreibweisen der Operator-Überladung ausprobiert und neu erfunden :/
  2. aber mit dem []operator gebe ich doch nur ein char als return-Wert zurück. Ich kann doch den gleichen []operator nicht auf beiden Seiten des "=" verwenden, denn links will ich was schreiben und rechts was lesen. Ich muss doch also nur den =operator überladen um dieses Zeichen zuzuweisen. Wenn ich sowas wie M[num] = habe, dann muss ich das doch irgendwie so überladen, dass ich das einzelne char-Zeichen an genau diese Stelle schreibe. Vielleicht indem ich M[num] als char an die Funktion übergebe? char operator=( const char c ){ return c; } Wenn ich das implementiere, lässt es sich zwar übersetzen aber diese Funktion wird nicht aufgerufen...
  3. Hallochen, ich versuch grad ein Problem zu lösen, komm aber keinen Schritt weiter. Ich habe einen Quellcode und möchte dazu die entsprechende Klasse schreiben, so dass dieser Quellcode dann funktioniert. Nur für eine Stelle bekomme ich die Operator-Überladung nicht hin: M1[M1.GetLenght()-1]=M1[0]; M1 ist das Objejkt einer Klasse und beinhaltet unter anderem die Variable char *buffer. Ich habe mir gedacht, dass ich für die rechte Seite "M1[0]" folgendes brauche: char& operator[]( int x){ return buffer[x]; } somit habe ich schonmal das char-Zeichen. Aber wie überlade ich den "="-Operator, so dass ich die Funktion die Stelle merkt, an der das char-Zeichen gespeichert werden soll? Mein Ansatz ist: CString operator=( const char c ){ buffer[?] = c; return *this; } Aber ich weiß nicht woher ich den int-Wert nehmen soll, der in dem Quellcode mit angegeben ist. Hat jemand eine Idee? Gruß
  4. Hallo, ich hab mir Fedora 17 x64 installiert und hab bei der Installation einfach mal die test-updates mit reingenommen. Nun habe ich aber bei dem Versuch einer Installation von beispielsweise skype gemerkt, dass ich Abhängigkeitsprobleme bekomme: yum install qt-x11.i686 libXScrnSaver.i686 alsa-plugins-pulseaudio.i686 libXv.i686 . . . ---> Paket readline.i686 0:6.2-4.fc17 markiert, um installiert zu werden --> Führe Transaktionsprüfung aus ---> Paket keyutils-libs.i686 0:1.5.5-2.fc17 markiert, um installiert zu werden ---> Paket libX11.i686 0:1.4.99.901-2.fc17 markiert, um installiert zu werden --> Verarbeite Abhängigkeiten: libX11-common = 1.4.99.901-2.fc17 für Paket: libX11-1.4.99.901-2.fc17.i686 --> Abhängigkeitsauflösung beendet Fehler: Paket: libX11-1.4.99.901-2.fc17.i686 (fedora) Benötigt: libX11-common = 1.4.99.901-2.fc17 Installiert: libX11-common-1.5.0-2.fc17.noarch (@updates-testing) libX11-common = 1.5.0-2.fc17 Verfügbar: libX11-common-1.4.99.901-2.fc17.noarch (fedora) libX11-common = 1.4.99.901-2.fc17 Sie können versuchen mit --skip-broken das Problem zu umgehen. You could try running: rpm -Va --nofiles --nodigest Die Pakete zu überspringen ist Sinnlos, weil er somit wirklich alle überspringt und ich nciht weniger als alle davon brauche um mit skype weiter zu kommen. Weil meine zu aktuelle Version von libX11-common von den testing-updates gekommen ist, hab ich mir gedacht, "schmeiß sie einfach wieder raus!". Wobei "einfach" einfach untertrieben ist. Ich hab zunächst in den config-files von yum, die test-updates auf 0 gesetzt: [updates-testing] name=Fedora $releasever - $basearch - Test Updates failovermethod=priority #baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/$releasever/$basearch/ mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f$releasever&arch=$basearch enabled=0 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch [updates-testing-debuginfo] name=Fedora $releasever - $basearch - Test Updates Debug failovermethod=priority #baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/$releasever/$basearch/debug/ mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f$releasever&arch=$basearch enabled=0 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch [updates-testing-source] name=Fedora $releasever - Test Updates Source failovermethod=priority #baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/$releasever/SRPMS/ mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-source-f$releasever&arch=$basearch enabled=0 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch Nun muss ich das Paket libX11-common aber wieder downgraden. Der einfache Versuch von yum downgrade libX11-common blieb erfolglos: . . --> Abhängigkeitsauflösung beendet Fehler: Paket: libX11-1.5.0-2.fc17.x86_64 (@updates-testing) Benötigt: libX11-common = 1.5.0-2.fc17 Entfernen: libX11-common-1.5.0-2.fc17.noarch (@updates-testing) libX11-common = 1.5.0-2.fc17 Downgraded By: libX11-common-1.4.99.901-2.fc17.noarch (fedora) libX11-common = 1.4.99.901-2.fc17 Sie können versuchen mit --skip-broken das Problem zu umgehen. You could try running: rpm -Va --nofiles --nodigest Beim Versuch einer Neuinstallation: yum reinstall libX11-common Geladene Plugins: langpacks, presto, refresh-packagekit Installiertes Paket libX11-common-1.5.0-2.fc17.noarch (von updates-testing) nicht verfügbar. Fehler: Nichts zu tun will er das Paket aus dem Testupdate? Ist das ein Indiz dafür, dass ich die test-updates doch noch nicht abgeschalten habe? Vielleicht kennt sich jemand etwas besser mit yum aus? Gruß
  5. Kadaj

    Rechner fiept...

    Meiner Erfahrung nach machen sich defekte Spulen auf Grafikkarten eher durch Pixelfehler bemerkt. Ich hatte mal eine radeon9800 pro demoliert und auch ein paar spulen runtergerissen ( um der Dame von der Versicherung meinen defekten Rechner zu zeigen ). Allerdings hat sich das Anfangs nur durch einen gigantischen roten Fluss, der durch den Bildschirm lief, bemerkbar gemacht. Dann kann es nur das Mainboard sein. Meine 5. Grafikkarte, eine x1650 pro hatte auch mal einen Schaden davongetragen, der vom board kam und wenn die erste Grafikkarte auch in anderen Rechnern fiept, die neue nach einiger Zeit auch damit angefangen hat, dann kann es nur das board sein. Das Netzteil hätte nicht aufgehört zu fiepen, als du die Karte getauscht hast, wenn es denn das Netzteil wäre. Ja, 5€ sind dezent ausgedrückt ;-) Aber warum willst du einen anderen Sockel? Wenn du nur irgendein board willst, dann bist de mit 30-40€ dabei, aber wenn de doch ohnehin ein Prozessor hast, der auf den Sockel passt, dann brauchst de doch keinen anderen nehmen. Wenn de wirklich mal aufrüsten willst, dann kannst de beim "Aufrüsten" ohnehin alles neu kaufen, denn nen Rechner mit nem 775-Sockel ist aus heutiger Sicht nichts, was man noch aufrüsten sollte. Ich würde ihn noch verwenden bis er auseinander fällt und dann kann man sich immer noch einen neuen holen. Ein neuer Prozessor kann schon was rausholen, aber egal wie viel, es wird das Geld nicht wert sein, was du in ein neues board UND in einen neuen Prozessor investierst, denn wie du schon richtig erkannt hast, wenn du gleich ein richtig gutes board willst, dann kommt der RAM auch noch auf die Liste.
  6. Unglaublich :beagolisc kein Fehler mehr, aber ich hab doch die Vorwärtsdeklaration am Anfang gehabt:confused: Das hieße ja, dass ich zum Beispiel date nicht als member von person und gleichzeitig person als member von date deklarieren kann? Danke dir!
  7. Ah, nun hab ich es :-) Das war das Stichwort. Bei Zellen weiß ich ja vorher nicht was reingeschrieben wird und bei einigen Tausend Zellen kann man unmöglich jede einzeln anlegen. Nun verstehe ich sogar, was du mir damit sagen wolltest ;-) Also, heißt das, der Typ/das Element, welches für das übergebene Element/Zeichenkette etc. den wenigsten Speicher benötigt? Danke, dass ihr mich nicht aufgegeben habt^^ Gruß
  8. Hallo, ich hantiere grade ein wenig mit ein paar Beispielen zum THema Objekten rum. In folgendem Beispiel versuche ich das Objekt date als Element von person zu definieren: //member.h #include <iostream> #include <cstring> using namespace std; class person; class date; class person{ private: char *name; bool geschlecht; date Geb; public: enum geschlecht {MANN,FRAU}; person(); ~person(); void enter(); void show_member(); void show_data(); }; class date{ private: int day; int month; int year; public: friend class person; date(); date(int d, int m,int y); void set_date(); void get_date(); }; person::person(){ name = new char[ strlen("noname") + 1 ]; strncpy(name,"noname",strlen("noname")); name[ strlen("noname") + 1 ] = 0; geschlecht = MANN; Geb = date(); } person::~person(){ cout << name << " ist aus dem Rennen\n"; delete [] name; } void person::enter(){ char puffer[24]; cout << "Name: "; cin.ignore(); cin.getline(puffer,24); name = new char[ strlen(puffer) + 1 ]; strncpy(name,puffer,strlen(puffer)); name[ strlen(puffer) + 1 ] = 0; cout << "MANN oder FRAU? "; cin >> geschlecht; Geb.set_date(); } void person::show_member(){ Geb.get_date();} void person::show_data(){ cout << "Name: " << name << "("; if(geschlecht == FRAU) cout << "weiblich)"; else cout << "männlich)"; show_member(); } date::date(){ day = 1; month = 1; year = 2000; } date::date(int d, int m,int y){ day = d; month = m; year = y; } void date::set_date(){ cout << "Eingabe für: Tag: "; cin >> day; cout << "Eingabe für: Monat: "; cin >> month; cout << "Eingabe für: Jahr: "; cin >> year; } void date::get_date(){ cout << "Geburtsdatum: " << day << "." << month << "." << year << endl; } [/PHP] Der Compiler sagt: [PHP]In file included from member.cpp:1:0: member.h:14:10: error: field ‘Geb’ has incomplete type member.h: In constructor ‘person::person()’: member.h:45:5: error: ‘Geb’ was not declared in this scope member.h: In member function ‘void person::enter()’: member.h:65:5: error: ‘Geb’ was not declared in this scope member.h: In member function ‘void person::show_member()’: member.h:69:5: error: ‘Geb’ was not declared in this scope Das ist echt seltsam. 14 entspricht der Zeile "date Geb;". Muss ich an der Stelle an Stelle von class date(); ganz einfach class person::date(); verwenden? Wenn ich das aber mache, dann bekomme ich vom Compiler nur noch mehr Fehler: In file included from member.cpp:1:0: member.h:7:15: error: ‘date’ in ‘struct person’ does not name a type member.h:14:5: error: ‘date’ does not name a type member.h:25:19: error: qualified name does not name a class before ‘{’ token member.h: In constructor ‘person::person()’: member.h:45:5: error: ‘Geb’ was not declared in this scope member.h:45:16: error: ‘date’ was not declared in this scope member.h: In member function ‘void person::enter()’: member.h:65:5: error: ‘Geb’ was not declared in this scope member.h: In member function ‘void person::show_member()’: member.h:69:5: error: ‘Geb’ was not declared in this scope member.h: At global scope: member.h:80:1: error: ‘date’ does not name a type member.h:86:1: error: ‘date’ does not name a type member.h:93:6: error: ‘date’ has not been declared member.h: In function ‘void set_date()’: member.h:95:12: error: ‘day’ was not declared in this scope member.h:97:12: error: ‘month’ was not declared in this scope member.h:99:12: error: ‘year’ was not declared in this scope member.h: At global scope: member.h:102:6: error: ‘date’ has not been declared member.h: In function ‘void get_date()’: member.h:103:33: error: ‘day’ was not declared in this scope member.h:103:47: error: ‘month’ was not declared in this scope member.h:103:63: error: ‘year’ was not declared in this scope[/PHP] Wenn ich allerdings aus "date Geb;" einfach "date *Geb;" mache, dann lässt es sich übersetzen, was ja schonmal ganz schön ist, aber ich wollte, dass es auch so funktioniert. Was mach ich denn falsch? person als friend von date innerhalb von date zu definieren hat auch nichts gebracht. Wobei ich auch noch nicht ganz verstanden habe wozu ich friend brauche, wenn ich doch ohnehin nicht auf dessen private-Variablen zugreifen kann und die Methoden, die public sind auch so aufrufen kann. Ich hoffe ihr wisst was das Problem ist. Ich will einfach, dass date ein Element von person ist, aber nicht als Pointer oder Referenz. Kann jemand Abhilfe schaffen? Gruß
  9. Ah, langsam kommt Licht in die Geschichte! Also spaare ich nur Speicherplatz solange ich noch nicht alles beschrieben habe? Eine Tabelle ist ein gutes Beispiel, Also wächst der Speicher um genau das, was ich in alle "Zellen" schreibe. Wenn ich in alle Zellen die maximale Zeichenlänge reingeschrieben hätte, hätte ich also die selbe größe, die ich bei einem struct hätte, wenn ich kein ohne malloc bzw new arbeiten würde und gleich den vollen Arbeitsspeicher aushebe, wenn ich eine Variable von dieser Struktur anlege. Ist das nicht das selbe, wie ein struct, bei dem ich alle Elemente erst mit new allociere, beim Löschen mit delete freigebe oder beim Ändern mit realloc neu allociere? So wie ich das verstanden habe, würde ich damit das selbe erreichen. Wenn ich das richtig verstanden habe ( was sehr unwahrscheinlich ist^^ ), dann würde mich das wieder auf mein Anfangsproblem zurückbringen. Bevor ich genau eine Variante speichere, kann ich doch gleich genau diese anlegen. Oder meinst du ( wenn ich das mit der "Tabelle" richtig verstanden habe), dass die Elemente, die sich auch noch in der union befinden und vielleicht später deklariert werden, auch erst später allociert werden? Was mich aber auch wieder zu der Frage bringen würde, ob das nicht das selbe sei, wie ein struct mit malloc und free etc. Also an eurer Stelle würde ich an mir verzweifeln^^ Danke für die Hilfe!
  10. Tatsache, ich hatte nur die Zeit der letzten Beiträge gesehen. Wie ungeschickt...
  11. Die Anforderungen waren 3-4 TB, da spielt es doch keine Rolle ob es nun 10 oder 500 Mitarbeiter sind. 80 Mitarbeiter heißt ja nicht, dass jeder dieser Mitarbeiter ununterbrochen darauf zugreift. Normalerweise werden abends immer die Daten gesichert und ein inkrementelles Backup gemacht, was dann auf die NAS geschoben wird. Selbst, wenn die NAS als fileserver hinhalten muss, ist das kein Problem, in einem RAID 6, bzw. 10 oder 2 x RAID1 (was bei vielen Zugriffen bei gleicher Kapazität vielleicht sinnvoller wäre) ist die Lese-Schreib-Geschwindigkeit hoch genug. Ich hab schon einige Unternehmen gesehen, die dafür einfach nur eine NAS mit einem einfachen RAID 1 verwenden, auf der in regelmäßigen Abständen die Daten der Server gesichert werden. Der TO wollte ein RAID 5 oder 6 mit 3-4 TB Kapazität und die Qnap TS-410 erfüllt das. Das kommt aber sicherlich auch drauf an was genau man damit machen möchte, kommen Zugriffe von außen mittels DSF etc. hinzu, würde ich auch etwas anderes verwenden.
  12. Ich hab einen Qnap TS-410 NAS-Server. Der ist wie dafür gemacht, RAID 5, 6, 10 und 1-fähig und den bekommst du für ca. 250 €. Bei 800 MH rendieren sich die Kosten sicher auch ganz schnell; a würde ich auf keinen Fall `nen Storage-Server zusammenbauen. ... Vielleicht hab ich das grad auch falsch verstanden. Reden wir hier von einem RAID 51 bzw 61 ? Ein RAID 5, welches gespiegelt wird ist immerhin ein RAID 51, oder hast du dich nur etwas unglücklich ausgedrückt?
  13. Kadaj

    Rechner fiept...

    Wenn es beim Spielen eher autritt und sich sonst `ne halbe Stunde Zeit lässt, dann würde ich es schon auf`s Netzteil oder Motherboard einschränken. Wenn es das Netzteil wäre, dann wäre es mir unerklärlich, dass es beim Austausch der Grafikkarte aufhört und irgendwann wieder anfängt. Ich glaube eher, dass dein Mainboard defekt ist und deine Grafikkarte beschädigt hat, durch Überspannung oder was auch immer. Ich würde die Grafikkarte ( oder deine Alte ) mal in einen anderen Rechner einbauen und schaun was passiert. Wenn es mit einer der Karten in einen anderen Rechner auftritt, kann man vom Mainboard ausgehen, oder du hast ein sehr unglückliches Händchen beim Kauf. ;-) Ich musste mir vor einem Jahr auch mal ein neues Mainboard kaufen mit diesem Sockel und DDR2, bei ebay bekommst du sowas schon recht günstig.
  14. Danke für die Tipps. Ich werd mir das Buch erstmal bis zu Ende durchlesen, weil ich schon 300 Seiten gelesen hab und die C++-Prüfung immer näher rückt, aber ich werde mir anschließend eines dieser Bücher zulegen um mir den schlechten Stil wieder abzuhewöhnen :-) Danke für die Hilfe!
  15. In C sind mir unions tatsächlich noch nicht über den Weg gelaufen. Warum unions Speicherplatz spaaren, nur weil man nur das letzte Element, was man geschrieben hat, auch lesen kann, leuchtet mir immernoch nicht ganz ein, immerhin benötigen die Elemente, die ich ein paar Schritte zuvor gespeichert habe auch Speicherplatz. Scheinbar reicht mein Wissen noch nicht ganz aus um das nachvollziehen zu können. Parser für Packets oder Binärfiles sind dann doch schon etwas höherer Stoff. Vielleicht kommt die Erkenntniss ja mit den nächsten Seiten^^ Danke, euch beiden!
  16. Danke, das ging nicht ganz aus meinem Buch hervor. Welche praktischen Anwendungen sind denn damit sinnvoll?
  17. Hallochen, ich bin grad dabei mir Unions zu verinnerlichen, meine Quelle möchte ich lieber nicht Preis geben^^. Ich bin nicht sicher ob ich überhaupt verstanden habe worum es geht. Ich leg eine union mit dem Schlüsselwort union an, erstmal alles wie bei einem struct. Der Unterschied ist, dass ich immer nur auf ein Element in dem union zugreifen kann, nämlich das erste, auf das ich zugreife bzw. das erste, welches ich initialisiere. Damit spaare ich genau den Speicherplatz ein, den alle andere Elemente im union belegen würden ein. Soweit richtig? Als Beispiel also: ... union data { int Zahl; char Name[24]; char Nachname[24]; char Ort[32]; }; ... int main() { union data test; test.Zahl = 1; ...[/PHP] Somit habe ich eine Variable test vom Typ union data mit dem Sinn mir einen int zu speichern. Nun die alles entscheidene Frage: Wozu braucht man unions, bei denen man nur auf ein Element zugreifen kann, da man doch anstelle von [PHP] union data test; test.Zahl = 1; einfach folgendes schreiben kann: int test = 1;[/PHP] Immerhin ist das in meinen Augen nicht weniger nützlich, als die Variantre mit den unions, außerdem muss man bei unions auch wegen undefinierten Verhalten aufpassen. Kann mir bitte jemand das Licht anknipsen, was mir zur Erleuchtung verhilft? Gruß
  18. Achwas? Ich hatte mir auch schon einen Teil des C von A bis Z - Buches durchgelesen. Was genau ist denn schon jetzt stilistisch schlecht an dem bischen code? Ein anderes Buch? Soll mir nur Recht sein, nur welches? Ich habe allerdings nicht den Eindruck, dass ich mir dadurch überhaupt einen Stil angewöhne, ich lese mir nur durch wie was funktioniert und schreibe die Programme dann ohne mir das Buch zur Hilfe zu nehmen, meist nehm ich die man-Pages. Das habe ich mir in C angewöhnt. Ich musste im ersten Semester ein Programm als Beleg schreiben, welches portabel sein sollte. Daher habe ich immer mit gcc -Wall -pedantic kompiliert und der gcc hat mir alle // als Warnung angezeigt. Daher setz ich das jetzt immernoch so, ganz unbewusst... zählt das etwas auch schon zum schlechten Stil?^^ Gruß
  19. Ohman, dann war der Titel ja schon richtig gewählt^^ ist mir wohl beim Kopieren an eine andere Stelle passiert. Schon sind alle Fehler weg, ich danke dir ! :-)
  20. Guten Abend, ich bin zurzeit dabei mir das C++ - Buch von A-Z durchzulesen und wollte bei Seite 200 erstmal n kleines Programm schreiben, damit ich grade die Spielerei mit Arrays, die an Funktionen übergeben werden mal gemacht habe. Ich bin eher die Fehlermeldungen im gcc gewohnt und weiß jetzt leider nicht was der g++ mir mitteilen möchte. Sicher sind es ganz dummer Fehler und ich möchte mich schonmal im voraus dafür entschuldigen, aber vielleicht hat einer von euch Lust mal drüberzuschaun, ist natürlich erst Arbeit von ein paar Minuten, mir kommt es auch viel mehr auf die Fehlermeldungen des Compilers an: #include <iostream> #include <cstring> using namespace std; struct g_array{char array[7][8]; void print_field(g_array field); struct g_array init(g_array field); void print_field( g_array field ) { for(int i=0;i<7;i++) { for(int j=0;j<7;j++) { cout << " | " << field.array[i][j]; } cout << " | " << endl; cout << " ----------------------" << endl; } } struct g_array init(g_array field) { for(int i=0;i<7;i++) { for(int j=0;j<8;j++) { field.array[i][j] = 0; } } cout << "Initialisierung des Spielfeldes abgeschlossen:\n"; print_field( field ); return field; struct g_array insert(g_array field, char stone[1], int line) { if(field.array[line][7] < 6) { /* Stein von oben reinwerfen, wenn noch nicht voll */ field.array[ line ][ 6 - field.array[line][7] ] = stone[0]; /* Menge der Steine in der Reihe hochzählen */ field.array[line][7]++; } else { cout << "Reihe " << line << " ist schon voll!" << endl; cout << "Bitte wählen Sie eine andere Reihe...\n"; } return field; } int main() { char *spieler_x, *spieler_o, puffer[24]; char stone_x[1],stone_o[1]; g_array field; field = init(field); cout << "Herzlich willkommen bei Vier gewinnt!\n"; cout << "Bitte geben Sie den Name für den Spieler mit den Stein x ein: "; if( !( cin.getline(spieler_x,24) ) ) { cerr << "Fehler bei der Eingabe!"; return(0); } cout << "Bitte geben Sie den Name für den Spieler mit den Stein o ein: "; if( !( cin.getline(spieler_o,24) ) ) { cerr << "Fehler bei der Eingabe!"; return 0; } return 0; } [/PHP] Das hier meldet der g++: [PHP] viergewinnt.cpp:11:6: error: ‘void g_array::print_field(g_array)’ cannot be overloaded viergewinnt.cpp:8:6: error: with ‘void g_array::print_field(g_array)’ viergewinnt.cpp:24:16: error: ‘g_array g_array::init(g_array)’ cannot be overloaded viergewinnt.cpp:9:16: error: with ‘g_array g_array::init(g_array)’ viergewinnt.cpp:79:1: error: expected ‘}’ at end of input viergewinnt.cpp: In member function ‘int g_array::main()’: viergewinnt.cpp: At global scope: viergewinnt.cpp:79:1: error: expected unqualified-id at end of input Am wenigsten verstehe ich die letzte Meldung, kann mich jemand aufklären was der von mir will? Gruß
  21. Achso, verstehe. Was macht denn strtok, wenn gleich am Anfang mein Trennzeichen steht? Also ;Hermann;23434 [/PHP] Springt er in dem Fall auch einfach weiter, oder gibt er einen Leerstring zurück? Immerhin folgen hier keine 2 Trennzeichen hintereinander. Also ist es am besten, ich lasse garnicht erst zu, dass man Name oder Vorname nicht eingeben muss, oder gibt es eine bessere Lösung?
  22. Hallo, ich bin grade dabei ein Telefonbuch zu schreiben. Ich dachte auch, ich sei endlich fertig, bis ich zufällig einen Eintrag ohne Vorname eingegeben habe. Dann steht in meiner Ausgabedatei in einer Zeile: Klaus;;035247889 Wenn ich nun strtok aufrufe: if( i == 1 ) zeiger = strtok( puffer,";" ); /* für das erste Element */ else { printf("kurz vor strtok...\n"); zeiger = strtok( NULL,";\n" ); /* für 2. und 3. Element */ } [/PHP] dann bekomme ich einen Speicherzugriffsfehler, beim leeren Eintrag. puffer ist ein char, wo der ganze string, also: [PHP]Klaus;;035247889 drinne steht. Aber wie kann ich den Speicherzugriffsfehler von strtok umgehen, wenn zwei Trennzeichen hintereinander stehen? Hat jemand eine Idee?
  23. Ja, so hatte ich mir das gedacht. Ich hab schon gefunden, was ich gesucht hatte: int fcmp(void *ele1,void *ele2) { return strcmp( ((tPhoneEntry*)ele1)->Name, ((tPhoneEntry*)ele2)->Name ); } [/PHP] Ich wusste nicht, dass ich dem Programm auf die Weise verklickern kann, dass ich dem eine bestimmte Struktur übergebe, da hab ich wohl mal geschlafen ^^ Vielen Dank!
  24. Hallo, mir geht grad folgendes Problem durch den Kopf: Bei einer doppelt verketteten Liste habe ich eine Struktur, die wie folgt aussieht: typedef struct Cnctr { struct Cnctr *pNxt; struct Cnctr *pPrv; void *pItem; }tCnct; typedef struct { tCnct *pFirst; tCnct *pCurr; tCnct *pLast; }tList; [/PHP] Diese Struktur steht beispielsweise in einer Datei list.h mit Vorwärtsdeklarationen für die list.c. Dass mein pItem vom Typ void ist, ist ja gewollt, da ich beispielsweise ein Programm mit Telefoneinträgen und später ein Konto-Programm damit schreiben möchte und immer diese Struktur verwenden möchte, ohne sie zu verändern. Nun habe ich in meiner list.c eine Funktion von folgender Struktur: [PHP] void* addItemToList (tList* pList, void * pItem, int(*fcmp)(void*pItList,void*pItNew)); Nun habe ich aber eine weitere Datei, konto.c zum Beispiel und von mir aus noch ein Konto.h mit den Deklarationen und auch mit meiner Struktur, die ich dem pItem zuweisen möchte. Die könnte so aussehen: void *addEntry(tList *pList); [/PHP] Nun hab ich mein Element und kann in der funktion: 1. ein neuen Pointer anlegen, der die Datenstruktur für mein Bank-Konto hat 2. Speicher mit malloc reservieren 3. dem pItem die Struktur zuweisen 4. das Item einordnen Doch hier steig ich gedanklich ein wenig aus. Ich würde einfach meine Funktion addItemToList aufrufen und ihr meine pList und mein pItem übergeben, was ich grad angelegt habe. Weil die Funktion addItemToList meine Struktur nicht kennt muss ich das Ergebnis des Vergleichs übergeben, welcher beispielsweise den Vergleich newItem->Name und pList-pCurr->pItem->Name ausführt. Aber genau hier ist das Problem. Mein newItem hätte das Element ->Name, weil ich es ja grade erst angelegt habe, aber mein pList->pCurr hat es nicht, weil es ja nur ein voird* ist. Aber wie mache ich meinem Programm an der Stelle sonst klar, dass alle pItems von der Struktur konto oder wie auch immer sind. Ist mein gedankliches Problem zu verstehen? Ich kann sonst leider nichts posten, weil das alles erstmal Überlegungen auf nem Blatt Papier sind. Kann mir vielleicht trotzdem jemand helfen?
  25. Also nen Freund hat mir mal unter die Arme gegriffen, so sieht das Ergebnis aus: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct sBinarySortedTree { char *data; struct sBinarySortedTree *left; struct sBinarySortedTree *right; }tBinarySortedTree; tBinarySortedTree init={0}; /* init vom Typ tBinarySortedTree mit 0 initialisieren */ tBinarySortedTree *create() { tBinarySortedTree *newTree = malloc(sizeof(tBinarySortedTree)); /* Speicher reservieren */ if( newTree ) *newTree = init; return newTree; } void tree_log( tBinarySortedTree *tree, FILE *file ) { if( !file || !tree ) return; tree_log( tree->left, file ); if( tree->data ) fprintf( file, "%s\n", tree->data ); tree_log( tree->right, file ); } void printTree( tBinarySortedTree *tree ) { tree_log( tree, stdout ); } void addName( tBinarySortedTree *tree, char *data ) { if( !tree || !data ) return; if(tree->data==NULL) { tree->data=data; } else { if(strcmp(data,tree->data)<0) /* data ist kleiner, nach links */ { if(tree->left==NULL) tree->left=create(); addName( tree->left, data ); } else /* data ist größer, also nach rechts damit */ { if(tree->right==NULL) tree->right=create(); addName( tree->right ,data ); } } } #define BUFF_SIZE 64 void createInputPuffer( char **puffer ) { *puffer = malloc( BUFF_SIZE * sizeof( char ) ); if( !(*puffer) ) { fprintf( stderr, "could not create puffer\n" ); exit(EXIT_FAILURE); } } int main(int argc,char *argv[]) { FILE *file; /* Pointer für Logfile */ char *puffer = 0; /* Array für Namenseingabe */ tBinarySortedTree *myTree = 0; /* Wurzel des Baumes */ if(argc!=2) { perror("usage: <program> <logfile>"); exit(EXIT_FAILURE); } myTree=create(); if( !myTree ) { fprintf(stderr,"error:create Tree\n"); exit(EXIT_FAILURE); } createInputPuffer( &puffer ); while(strcmp(puffer,"qq")!=0) { printf("Geben Sie einen Namen ein. Zum Beenden 'qq' eingeben:\n"); fgets(puffer,BUFF_SIZE,stdin); puffer[strlen(puffer)-1]=0; if(strcmp(puffer,"qq")!=0) { addName( myTree, puffer ); createInputPuffer( &puffer ); } } printf("\nHier die Ausgabe für den gesamten Baum:\n"); printTree( myTree ); file=fopen(argv[1],"a+"); if( !file ) { fprintf(stderr, "error: open file: %s\n",argv[1]); exit(EXIT_FAILURE); } tree_log( myTree, file ); fclose(file); return EXIT_SUCCESS; } [/PHP] Vielen Dank für die Hilfe

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...