Code schreiben C++

Neue Frage »

Auf diesen Beitrag antworten »
SSD Code schreiben C++

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
 
Auf diesen Beitrag antworten »
SSD

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:
#ifndef CPLAYLIST_H_
#define CPLAYLIST_H_
#include <string>
#include<iostream>
using namespace std;
#include "CTitle.h"


class CPlaylist{

private:
	CTitle** m_titles;
	int m_nextFree = 0;
	int m_arraySize;

public:
	CPlaylist(int initialSize = 5);
	~CPlaylist();
	void add(CTitle* title);
	void const print();
	int const totalPlayTime();


};



#endif /* CPLAYLIST_H_ */



code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#include <string>
#include<iostream>
using namespace std;
#include  "CPlaylist.h"



CPlaylist::CPlaylist(){

	int initialSize = 5;

    m_nextFree = 0;
    m_arraySize = 0;


}



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?
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:

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

Mit freundlichen Grüßen
InformaTiger
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?
 
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:

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
Auf diesen Beitrag antworten »
SSD

Geht es auch so?
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:
/*
 * CPlaylist.cpp
 *
 *  Created on: 03.05.2017
 *      Author: Notebook Vaio
 */

#include <string>
#include<iostream>
using namespace std;
#include  "CPlaylist.h"
#include "CTitle.h"



CPlaylist::CPlaylist(int initialSize){

	if(initialSize>= 5 )
		m_arraySize = initialSize;
	else
		m_arraySize = 5;

	m_titles= (CTitle**)malloc(m_arraySize * sizeof(CTitle*));
	m_nextFree =0;


}
CPlaylist::~CPlaylist(){

	free(m_titles);

}

void CPlaylist::add(CTitle* title){
	*(m_titles+m_nextFree++) = title;


}





Wie soll ich die add Methode weiter implementieren?
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):

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
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 +=?
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. smile

Mit freundlichen Grüßen
InformaTiger
Auf diesen Beitrag antworten »
SSD

Tipps für die g)?
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 smile

Mit freundlichen Grüßen
InformaTiger
Auf diesen Beitrag antworten »
SSD

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?
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:

code:
1:
2:
3:
4:
5:
6:
7:
8:
int CPlaylist::totalPlayTime(){
    int totalPlayTime = 0;

    for (int i = 0; i < m_arraySize; i++){
        totalPlayTime += m_titles[i].getDuration();
    }
    return totalPlayTime;
}


Mit freundlichen Grüßen
InformaTiger
Auf diesen Beitrag antworten »
SSD

Ich will es nochmal über meinen Weg probieren großes Grinsen

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 großes Grinsen

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
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
Auf diesen Beitrag antworten »
SSD

Ok alles klar großes Grinsen
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 großes Grinsen
Auf diesen Beitrag antworten »
InformaTiger

Nein, das habe ich in der Tat nicht großes Grinsen großes Grinsen
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
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »