Die letzten 10 Beiträge |
as_string |
Ich denke, Du solltest Dir wirklich zuerst die Grundlagen aneignen, glaube mir, macht viel mehr Sinn!
Gruß
Marco |
Victor |
Ok ich gebe jetzt einfach auf und fange mit einer neuen Aufgabe an .
Ich glaube das ist noch einfach zu schwer für mich im Moment.
Vielleicht wird es mit der Zeit besser .
Melde mich glaube ich heute noch mit ner neuen Aufgabe
|
as_string |
Das mit dem letzten Index und der Arraygröße hast Du gerade falschrum verstanden:
Beim Anlegen eines neuen Arrays musst Du die Größe angeben. Die ist hier m_numberOfEntries + 1, weil das neue eins größer sein soll, das hat also schon gestimmt gehabt.
Aber beim kopieren des neuen Eintrags an letzter Stelle des neuen Arrays musst Du den letzten Index nehmen. Der ist aber immer genau eins kleiner als die Größe des Arrays (ist doch logisch: Wenn Du 3 "Dinger" in der Hand hast und diese von 0 an durchnummerierst, also dem ersten gibst Du den index 0, dann 1 dann 2, dann ist der höchste Index 2 obwohl Du 3 in der Hand hast).
Wenn Du aber von m_numberOfEntries + 1 wieder 1 abziehst, dann kommt m_numberOfEntries raus (Du brauchst nicht +1 und dann wieder -1 schreiben, das hatte ich nur so gemacht, um zu verdeutlichen, dass ich eigentlich von der Arraygröße eine Eins abgezogen habe, was aber in diesem Fall eben gerade zum alten m_numberOfEntries-Wert führt).
Schlagen könnte ich Dich dafür, dass Du schon wieder m_numberofSize benutzt! Die Variable gibt es hier doch überhaupt gar nicht und hat es auch noch nie gegeben! Sei doch mal etwas konzentriert, ist ja wirklich schlimm... Das hat auch nichts damit zu tun, ob Du Dir schwer tust mit Programmieren oder nicht, sondern ist schlicht Schlamperei!
Schlimm finde ich auch, dass Du immer noch die Zuweisungen falsch herum machst!
Angenommen ich habe zwei int-Variablen a und b, a habe den Wert 1 und b den Wert 2. Welchen Wert haben beide dann nach der Zeile:
a = b;
Die Zeile 34 ist wieder völliger Blödsinn. Du schreibst im Kommentar richtig, was Du machen willst. Da schreibst Du was von neuem Array, wo bitte kommt aber das neue Array in Deiner Anweisung überhaupt auch nur vor??? Das kann doch nicht sein, wenn ich schreibe, ich will was von m_entries ins neue Array kopieren das neue Array überhaupt gar nicht vorkommt. Davon abgesehen ist die Zuweisungsrichtung auch wieder falsch, vermute ich.
Zeile 37 verwendet i. Das ist aber nach dem Schleifendurchlauf auf dem Wert von m_numberOfEntries und der letzte Index ist dann nicht i+1 sonder m_numberOfEntries. Allerdings ist da auch wieder ein neues Problem: Du verwendest die ganze Zeit die Variable i, die ist aber nirgends deklariert. Welchen Typ hat den die Variable überhaupt, das steht ja nirgends.
Dann würde ich außerhalb der for-Schleife i. A. die Indexvariable der for-Schleife i gar nicht mehr verwenden. Eigentlich willst Du ja auf das letzte Element von newEntries zugriefen, das ist aber einfach newEntries[m_numberOfEntries] wie ich schon mehrfach geschrieben habe.
Was ich aber nicht verstehe: Du hast in der Schleife jetzt ein if() mit einem Datumsvergleich eingebaut (beim if fehlt übrigens das i) und schiebst dann auch an der richtigen Stelle den neuen Termin ein. Das machst Du übrigens ab diesem Zeitpunkt dann immer. Du musst Dir irgendwie merken, ob Du entry schon ins neue Array kopiert hast oder nicht! Du darfst entry nur einmal einfügen. Insbesondere darfst Du entry auch nur dann an die letzte Stelle kopieren, wenn Du vorher das noch nicht eingefügt hast. Ich verstehe auch gar nicht, warum wir jetzt mit der einfachen Sache angefangen hatten, dass wir die Sortierung für den Moment mal ignorieren und einfach immer hinten einfügen, aber Du jetzt wieder diese if-Anweisung überhaupt drin hast.
Danach musst Du Dir noch überlegen, was eigentlich mit dem Zielindex des neuen Arrays ist, wenn Du entry schon eingefügt hast. Ich habe das jetzt schon einige Male versucht zu erklären, bringt wohl auch nichts, wenn ich es nochmal versuche...
Gruß
Marco |
Victor |
Hatte vergessen das kopieren zu korriegieren:
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:
|
* CCalendar.cpp
*
* Created on: 21.08.2017
* Author: vaio
*/
#include "CCalendar.h"
CCalendar::CCalendar() {
}
CCalendar::~CCalendar() {
if( m_entries >=0 ){
delete m_entries;
}
}
Calendar& operator+=(const CCalendarEntry& entry){
CCalendarEntry * oldEntries = m_entries;
CCalendarEntry * newEntries = new CCalendarEntry [
(m_numberOfEntries + 1) - 1 ];
for(i=0; i<m_numberofSize; i++){
f( (entry.getDate() < m_entries[i].getDate())) {
entry = newEntries[i] ;
}
oldEntries[i] = entry;kopiere jedes einzelne Element vom m_entries Array in das neu angelegt Array um.
}
newEntries[i+1]= entry ; D
m_entries = newEntries; // m_entries auf das neue Array zeigen lassen
delete [] oldEntries; // das alte Array zerlegen
}
|
|
|
Victor |
Ich habe auch die if Bedingung ein wenig eingebaut mithilfe des obigen codes.
Kann man nicht statt einer bool variable irgendwas anderes machen?
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:
|
* CCalendar.cpp
*
* Created on: 21.08.2017
* Author: vaio
*/
#include "CCalendar.h"
CCalendar::CCalendar() {
}
CCalendar::~CCalendar() {
if( m_entries >=0 ){
delete m_entries;
}
}
Calendar& operator+=(const CCalendarEntry& entry){
CCalendarEntry * oldEntries = m_entries;
CCalendarEntry * newEntries = new CCalendarEntry [
(m_numberOfEntries + 1) - 1 ];
for(i=0; i<m_numberofSize; i++){
f( (entry.getDate() < m_entries[i].getDate())) {
newEntries[i] = entry;
...........................................................................................
}
oldEntries[i] = entry;kopiere jedes einzelne Element vom m_entries Array in das neu angelegt Array um.
}
entry = newEntries[i+1]; D
m_entries = newEntries; // m_entries auf das neue Array zeigen lassen
delete [] oldEntries; // das alte Array zerlegen
}
|
|
|
Victor |
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:
|
* CCalendar.cpp
*
* Created on: 21.08.2017
* Author: vaio
*/
#include "CCalendar.h"
CCalendar::CCalendar() {
}
CCalendar::~CCalendar() {
if( m_entries >=0 ){
delete m_entries;
}
}
Calendar& operator+=(const CCalendarEntry& entry){
CCalendarEntry * oldEntries = m_entries;
CCalendarEntry * newEntries = new CCalendarEntry [
(m_numberOfEntries + 1) - 1 ];
for(i=0; i<m_numberofSize; i++){
oldEntries[i] = entry;kopiere jedes einzelne Element vom m_entries Array in das neu angelegt Array um.
}
entry = newEntries[i+1]; D
m_entries = newEntries; // m_entries auf das neue Array zeigen lassen
delete [] oldEntries; // das alte Array zerlegen
}
|
|
Wo muss ich m_numberOfEntries++ hinschreiben ?
Ist mir nicht klar ?
Warum heisst das neu angelegte Array entry und nicht newEntry ?
CCalendarEntry * newEntries = new CCalendarEntry [
(m_numberOfEntries + 1) - 1 ]; |
as_string |
Das sieht ja schon deutlich vernünftiger aus, aber...
Zeile 31: bei einer Zuweisung mit dem Gleichheitszeichen, wird von rechts nach links kopiert, dem linken wird das rechte zugwiesen, nicht umgekehrt. Wenn Du also in das neue Array kopieren willst, muss das logischerweise links stehen.
Zeile 32 willst Du ja nur einmal machen, nachdem Du alle anderen Elemente schon kopiert hast. Das darf dann nicht in der for-Schleife stehen, sonst wird das doch auch bei jedem Schleifendurchlauf ausgeführt und nicht nur einmal.
Dann verstehe ich nicht, warum Du in der Anweisung etwas komplett anderes kopierst, als Du im Kommentar schreibst. Du willst das neu übergebene entry irgendwo hin kopieren. Also haben wir gelernt dass es rechts stehen muss weil von rechts nach links kopiert wird. Aber in der ganzen Zeile steht nichts von entry.
Dann darf links nicht i in der eckigen Klammer stehen. Da die Anweisung ja so wie so außerhalb der for-Schleife stehen muss, darf da gar kein i mehr vorkommen. Stattdessen musst Du Dir überlegen, was der höchste Index ist, der noch in dem neu angelegten Array drin ist.
Du hast das Array oben mit der Größe m_numberOfEntries + 1 angelegt (vorsicht! Du hast schon wieder ei. Kleines o geschrieben, so kann er die Variable nicht finden!). Die Indizes eines Arrays gehen in C++ immer von 0 bis Arraygröße minus eins. Der höchste Index wäre hier also (m_numberOfEntries + 1) - 1 = m_numberOfEntries.
Deine Zuweisung muss also wie aussehen?
Am Ende musst Du noch m_numberOfEntries um einschließlich zählen, das fehlt auch noch.
Gruß
Marco |
Victor |
Ich habe jetzt versucht das zu machen was du gesagt hast :
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:
|
* CCalendar.cpp
*
* Created on: 21.08.2017
* Author: vaio
*/
#include "CCalendar.h"
CCalendar::CCalendar() {
}
CCalendar::~CCalendar() {
if( m_entries >=0 ){
delete m_entries;
}
}
Calendar& operator+=(const CCalendarEntry& entry){
CCalendarEntry * oldEntries = m_entries;
CCalendarEntry * newEntries = new CCalendarEntry [m_numberofEntries + 1];
for(i=1; i<m_numberofSize; i++){
oldEntries[i] = newEntries[i];kopiere jedes einzelne Element vom m_entries Array in das neu angelegt Array um.
newEntries [i] = newEntries[i+1]; Danach kopierst Du das übergebene entry an die letzte Stelle des neu angelegten Arrays, die ja noch frei sein muss, weil Du es ja um eins größer angelegt hattest.
}
m_entries = newEntries; // m_entries auf das neue Array zeigen lassen
delete [] oldEntries; // das alte Array zerlegen
}
|
|
Mir ist es egal ob du denkst ,dass ich nichts peile .
Ich will es irgendwie selbst schaffen
e |
Victor |
Woher wusstest du das das Array bereits sortiert ist ?
In der Aufgabenstellung steht das ja nicht |
as_string |
alternativ könnte man auch schreiben:
code: |
1:
2:
3:
4:
5:
6:
|
if(alreadeInserted)
newEntries[i + 1] = m_entries[i];
else
newEntries[i] = m_entries[i];
|
|
aber ich mag es kurz und knackig...
Gruß
Marco |
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen. |
|
|