Code schreiben C++ |
SSD unregistriert
|
|
Hallo ich habe gerade probleme bei dieser Aufgabe .
Passt der Konstruktor soweit ?
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
|
* CTitle.h
*
* Created on: 11.07.2015
* Author: mnl
*/
#ifndef CTITLE_H_
#define CTITLE_H_
#include <string>
using namespace std;
/**
* Diese Klasse beschreibt einen MP3-kodierten Titel (Song).
*/
class CTitle
{
private:
/** Name (Titel) des Songs */
string m_name;
/** Ausführende(r) (Interpret, Gruppe, Orchester o. ä.) */
string m_performer;
/** Die Dauer des Titels in Sekunden. */
int m_duration;
/** Die Bitrate in bit/s. */
int m_bitRate;
/** Die Größe (Anzahl der Bytes) der Audiodaten. */
int m_contentSize;
public:
/**
* Erzeugt ein neues Objekt, dessen Attribute mit den angegebenen
* Werten initialisiert werden.
*
* Falls Name oder Ausführende(r) (performer) leer sind, werden
* die Default-Werte verwendet.
*
* Die Angabe der Bitrate erfolgt in bit/s.
*
* Die Bitrate muss zwischen 32000 und 320000 bit/s liegen.
* Falls diese Zusicherung verletzt wird, werden die Attribute
* m_bitRate, m_duration und m_contentSize auf 0 gesetzt.
*/
CTitle(int contentSize = 0, int duration = 0,
string name = "(Untitled)", string performer = "(Unknown)",
int bitRate = 128000);
/**
* Diese Methode liefert den Namen des Titels.
*/
string getName() const;
/**
* Diese Methode liefert den Ausführenden (Performer).
*/
string getPerformer() const;
/**
* Diese Methode liefert die Dauer (Länge) des Titels in Sekunden.
*/
int getDuration() const;
};
#endif /* CTITLE_H_ */
|
|
cpp
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
|
CTitle.cpp
*
* Created on: 13.07.2015
* Author: Michael
*/
#include "CTitle.h"
CTitle::CTitle(int contentSize, int duration, string name, string performer,
int bitRate)
{
if(m_bitrate>= 32000 && m_bitrate <= 320000 ){
m_bitrate = bitrate;
}
else {
m_contentSize = 0;
m_duration = 0;
m_duration = 0;
}
}
string CTitle::getName() const
{
return "";
}
string CTitle::getPerformer() const
{
return "";
}
int CTitle::getDuration() const
{
return 0;
}
|
|
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
SSD hat dieses Bild (verkleinerte Version) angehängt:
|
|
29.04.2017 11:59 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
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:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
|
#include "CPlaylist.h"
CPlaylist::CPlaylist(int initialSize){
if (initialSize <= 0){
initialSize = 5;
}
m_arraySize = initialSize;
} |
|
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:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
|
#include "CPlaylist.h"
CPlaylist::CPlaylist(int initialSize){
if (initialSize <= 0){
initialSize = 5;
}
m_arraySize = initialSize;
m_titles = (CTitle**)malloc(m_arraySize * sizeof(CTitle*));
if (m_titles == NULL){
throw "Failed to allocate memory.";
}
} |
|
Solltest du noch weitere Erklärungen benötigen, kannst du dich jederzeit melden.
Mit freundlichen Grüßen
InformaTiger
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
08.05.2017 14:27 |
|
|
SSD unregistriert
|
|
Wie kommst du auf diese Bedingung ?
if (initialSize <= 0){
initialSize = 5;
Woher weisst du das wenn initialSize <0 ist ,
es gleich 5 sein soll?
|
|
09.05.2017 12:34 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
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:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
|
#include "CPlaylist.h"
CPlaylist::CPlaylist(int initialSize = 5){
if (initialSize <= 0){
initialSize = 5;
}
m_arraySize = initialSize;
m_titles = (CTitle**)malloc(m_arraySize * sizeof(CTitle*));
if (m_titles == NULL){
throw "Failed to allocate memory.";
}
} |
|
Mit freundlichen Grüßen
InformaTiger
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
09.05.2017 18:02 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
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):
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
|
void CPlaylist::add(CTitle* title){
if (m_nextFree + 1 >= m_arraySize){
m_titles = realloc(m_titles, m_arraySize + 5);
if (m_titles == NULL){
throw "Failed to allocate memory";
}
m_arraySize += 5;
}
*(m_titles+m_nextFree++) = title;
} |
|
Mit freundlichen Grüßen
InformaTiger
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
10.05.2017 08:46 |
|
|
SSD unregistriert
|
|
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 09:16 |
|
|
SSD unregistriert
|
|
|
10.05.2017 22:10 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
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
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
10.05.2017 22:14 |
|
|
SSD unregistriert
|
|
So etwa?
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
|
int temp_mtitles;
int const CPlaylist::totalPlayTime(){
for( int i = 0 , i>0, i++){
temp_mtitles = temp_mtitles +m_titles;
CTitle** temp = new CTitle(temp_mtitles);
return** temp;
}
|
|
Oder soll ich bei der for schleife m_arraySize++ machen?
|
|
10.05.2017 23:31 |
|
|
SSD unregistriert
|
|
Ich will es nochmal über meinen Weg probieren
Ich habe ee mal probiert
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
|
#include <string>
#include<iostream>
using namespace std;
#include "CPlaylist.h"
#include "CTitle.h"
CPlaylist::CPlaylist(int initialSize ){
if (initialSize <= 0){
initialSize = 5;
}
m_arraySize = initialSize;
m_titles = (CTitle**)malloc(m_arraySize * sizeof(CTitle*));
if (m_titles == NULL){
throw "Failed to allocate memory.";
}
}
CPlaylist::~CPlaylist(){
free(m_titles);
}
void CPlaylist::add(CTitle* title){
if (m_nextFree + 1 >= m_arraySize){
m_titles = realloc(m_titles, m_arraySize + 5);
if (m_titles == NULL){
throw "Failed to allocate memory";
}
m_arraySize += 5;
}
*(m_titles+m_nextFree++) = title;
}
}
int const CPlaylist::totalPlayTime(){
for( int i = 0; i<m_arraySize; i++){
int temp_mtitles;
temp_mtitles = temp_mtitles[i] +m_titles;
CTitle* temp = new CTitle(temp_mtitles);
return* temp;
}
}
|
|
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 09:47 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
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
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
11.05.2017 10:40 |
|
|
|
|
|
|
|