Code schreiben C++ |
29.04.2017, 11:59 | Auf diesen Beitrag antworten » | ||||||||||
SSD | Code schreiben C++ Hallo ich habe gerade probleme bei dieser Aufgabe . Passt der Konstruktor soweit ?
cpp
Die Header war so gegeben mit Hinweisen. Bekomme folgende Fehler: Wir proggen mit eclipse. Description Resource Path Location Type 'bitrate' was not declared in this scope CTitle.cpp /CTitle line 15 C/C++ Problem 'm_bitrate' was not declared in this scope CTitle.cpp /CTitle line 13 C/C++ Problem Symbol 'bitrate' could not be resolved CTitle.cpp /CTitle line 15 Semantic Error Symbol 'm_bitrate' could not be resolved CTitle.cpp /CTitle line 13 Semantic Error Symbol 'm_bitrate' could not be resolved CTitle.cpp /CTitle line 13 Semantic Error Symbol 'm_bitrate' could not be resolved CTitle.cpp /CTitle line 15 Semantic Error Member 'm_bitRate' was not initialized in this constructor CTitle.cpp /CTitle line 10 Code Analysis Problem |
||||||||||
|
|||||||||||
07.05.2017, 13:57 | Auf diesen Beitrag antworten » | ||||||||||
SSD |
Bin jetzt bei Aufgabenteil 2 . Habe versucht den Konstruktor zu implementieren . Bin aber nicht sicher ob er richtig ist? Welche Zusicherung muss beim Konstruktor beachtet werden? Wie allokiert man genau Speicher? |
||||||||||
08.05.2017, 14:27 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | Hallo SSD, hat sich dein Problem von Beitrag 1 bereits erledigt? Zum Konstruktor in Beitrag 2 kann ich folgendes anmerken: deine Playlist bekommt derzeit immer die initialSize 5; unabängig davon was der Benutzer deines Codes angeben möchte. Außerdem solltest du grundsätzlich wenn du einen leeren Konstruktor verwendest "void" als parameter typ angeben, da in C und C++ ansonsten jeder beliebige Wert an deinen Konstruktor übergeben werden kann. Dein Code sollte somit ungefähr so aussehen:
Speicher kannst du mit malloc allokieren. Du gibst die Größe des Speicherblocks an, den du reservieren möchtest und erhälst vom Betriebssystem einen Zeiger (engl. Pointer) auf den Datenblock. Falls der Vorgang schief geht, erhälst du einen Nullpointer der in Hexadezimaler Form als 0x0 dargestellt wird. Der daraus resultierende Quelltext könnte etwa so aussehen:
Solltest du noch weitere Erklärungen benötigen, kannst du dich jederzeit melden. ![]() Mit freundlichen Grüßen InformaTiger |
||||||||||
09.05.2017, 12:34 | Auf diesen Beitrag antworten » | ||||||||||
SSD | Wie kommst du auf diese Bedingung ? if (initialSize <= 0){ initialSize = 5; Woher weisst du das wenn initialSize <0 ist , es gleich 5 sein soll? |
||||||||||
Anzeige | |||||||||||
|
|||||||||||
09.05.2017, 18:02 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | Nun ja, falls die initialSize negativ oder 0 ist wird kein Speicher reserviert beziehungsweise du erhältst einen Fehler. In der Angabe steht außerdem, dass initialSize standardmäßig 5 sein soll. Ich habe es nur eben verpasst, initialSize als optionalen Parameter zu definieren. Sollte dann wohl etwa so aussehen:
Mit freundlichen Grüßen InformaTiger |
||||||||||
10.05.2017, 00:39 | Auf diesen Beitrag antworten » | ||||||||||
SSD | Geht es auch so?
Wie soll ich die add Methode weiter implementieren? |
||||||||||
10.05.2017, 08:46 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | Ja klar, der einzige unterschied zu meinem Code ist, dass du bei der Erstellung der Playlist zwingend einen Wert für initialSize mitgeben musst und ich nicht. In C++ kann man Parameter als optional markieren indem man ihnen in der Methodendefinition einen Wert verpasst (wie in meinem zweiten Beispiel). Bei deiner add-Methode musst du nicht zwingend mit Pointerarithmetik arbeiten: du kannst auch die gängige Array Schreibweise verwenden; das ist aber Geschmacksache. Ansonsten passt das so. Es sollte dann ungefähr so weitergehen (ungetestet):
Mit freundlichen Grüßen InformaTiger |
||||||||||
10.05.2017, 09:16 | Auf diesen Beitrag antworten » | ||||||||||
SSD | Kannst du mir wenn es geht noch einmal die Code Zeilen erklären ? Vor allem das mit realloc ? Warum m_arraySize+5? Und das +=? |
||||||||||
10.05.2017, 10:49 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | Klar. Also ich überprüfe in Zeile 2 ob die aktuelle Anzahl plus eins (das neue Element) die Arraygröße übersteigt und falls ja, reallokiere (realloc erweitert bzw verkleinert einen bestehenden Speicherblock) ich den Speicher mit der Größe m_arraySize + 5 (steht in der Angabe). Und das += ist nur eine andere Schreibweise für m_arraySize = m_arraySize + 5. Ich hoffe das hilft. ![]() Mit freundlichen Grüßen InformaTiger |
||||||||||
10.05.2017, 22:10 | Auf diesen Beitrag antworten » | ||||||||||
SSD | Tipps für die g)? |
||||||||||
10.05.2017, 22:14 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | Du musst nur über alle Titel in der Songliste (von 0 bis m_arraySize) durch iterieren und beim jeweiligen Eintrag in m_titles die Spieldauer herausholen. Dies summierst du auf eine lokale Variable auf und gibst diese am Ende deiner Funktion zurück. Das sollte den Job für dich erledigen ![]() Mit freundlichen Grüßen InformaTiger |
||||||||||
10.05.2017, 23:31 | Auf diesen Beitrag antworten » | ||||||||||
SSD | So etwa?
Oder soll ich bei der for schleife m_arraySize++ machen? |
||||||||||
11.05.2017, 08:37 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | Nicht ganz, deine temporäre Variable sollte innerhalb des Funktionsblocks liegen und bei der for-schleife musst du anstatt der Beistriche Semikolons setzen. Außerdem solltest du die Bedingung i > 0 noch einmal überdenken: es sollte wohl vermutlich i < m_arraySize heißen, wenn du von 0 bis m_arraySize durch iterieren willst. m_arraySize darfst du während der Schleife auf keinen Fall hochzählen, da du ansonsten ja über den Speicherbereich hinausgreifst. Zu guter letzt sollte deine Spielzeit doch vom Typ int sein, das heißt wenn du in Zeile 4 einen CTitle* daraus machst hat das ganze relativ wenig Sinn. Stattdessen solltest du dir einen Titel aus dem Array herausholen und dessen Spielzeit auf die temporäre Variable aufsummieren. So in etwa:
Mit freundlichen Grüßen InformaTiger |
||||||||||
11.05.2017, 09:47 | Auf diesen Beitrag antworten » | ||||||||||
SSD | Ich will es nochmal über meinen Weg probieren ![]() Ich habe ee mal probiert
Wo liegen die Fehler jetzt? Ich habe auch bei Eclipse noch Fehlermeldungen leider ![]() Description Resource Path Location Type expected declaration before '}' token CPlaylist.cpp /CTitle line 46 C/C++ Problem invalid conversion from 'void*' to 'CTitle**' [-fpermissive] CPlaylist.cpp /CTitle line 37 C/C++ Problem No return, in function returning non-void CPlaylist.cpp /CTitle line 49 Code Analysis Problem |
||||||||||
11.05.2017, 10:40 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | Es kann so leider nie funktionieren. Deine Schleife läuft genau einmal und bricht dann ab weil der return Befehl aufgerufen wird. Zudem gibt dieser einen CTitle Zeiger zurück obwohl in der Methodendeklaration als Typ Integer angegeben wurde. Dazu kommt, dass dein temp_mtitles in jedem Schleifendurchlauf neu erzeugt wird und seinen Wert deshalb jedesmal überschreibt. Verwende deshalb bitte meinen Weg, wie ich ihn im obigen Beispiel beschrieben habe. Ansonsten kann ich dir leider nicht mehr helfen. Mit freundlichen Grüßen InformaTiger |
||||||||||
11.05.2017, 10:57 | Auf diesen Beitrag antworten » | ||||||||||
SSD | Ok alles klar ![]() |
||||||||||
11.05.2017, 11:31 | Auf diesen Beitrag antworten » | ||||||||||
SSD | totalPlayTime = m_titles[i].getDuration(); Kannst du mir vielleicht ein wenig diese Zeile erklären ? Viel Kundschaft scheint du ja in diesem Forum nicht zu haben ![]() |
||||||||||
11.05.2017, 20:21 | Auf diesen Beitrag antworten » | ||||||||||
InformaTiger | Nein, das habe ich in der Tat nicht ![]() ![]() Diese Zeile macht nichts anderes als bei deinem Array den i-ten CTitle herauszuholen und über die Methode getDuration() die du in deiner CTitle-Klasse definiert hast abzurufen. Und da sollte selbstverständlich ein += statt dem = stehen. Mein Fehler, sorry. Mit freundlichen Grüßen InformaTiger |
|
Verwandte Themen
Die Beliebtesten » |
Die Größten » |
Die Neuesten » |
|