mit 'new' ein Array erweitern

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

mit 'new' ein Array erweitern

Beitrag von naums » Fr Mai 27, 2011 4:55 pm

Hallihallöchen,

Folgender Code gibt eine Compilerfehlermeldung zurück:

arch.h:

Code: Alles auswählen

#ifndef sorting_arch
#define sorting_arch

namespace arch{
    int menu(void);
    int newEntry(void);
       
    class Collection
    {
        public:
            class CD
            {
                public:
                    int length;         // Länge der CD in Sekunden
                    char title[30];     // Titel der CD, weniger als 30 Zeichen!
            };  
            
            CD *collection; 
            unsigned int elements; 
            
            ~Collection(void);
            
            int createNewCD(char title[30], int length);
            
            int showLengst(void);
            int getLengst(void);
            int getList(void);
    };
}

#endif
arch.cpp:

Code: Alles auswählen

#include "arch.h"
#include "style.h"
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace Style;

namespace arch{

int menu()
{
    clrscr();
    home();
    //setBold();
    std::cout << "Ermitteln Sie die Längste Ihrer CDs - Hauptmenü";
    //UnsetAllAttributes();
    gotoxy(3,4);
    std::cout << "Zur Navigation geben Sie eine der folgenden Buchstaben ein, "<<   
            "und bestätigen Sie mit ENTER";
    gotoxy(4,8);
    std::cout << "N - Neue CDs eintragen";
    gotoxy(4,10);
    std::cout << "E - Vorhandene CDs verändern";
    gotoxy(4,12);
    std::cout << "A - Anzeigen aller CDs einschließlich Länge";
    gotoxy(4,14);
    std::cout << "L - Anzeigen der längsten CD";
    gotoxy(4,16);
    std::cout << "B - Programm beenden";
    
    gotoxy(2,20);
    
    std::cin.clear();
    char eingabe=getchar();
    
    if (eingabe=='n' || eingabe=='N') { return 1; }
    else if (eingabe=='e' || eingabe=='E') { return 2; }
    else if (eingabe=='a' || eingabe=='A') { return 3; }
    else if (eingabe=='l' || eingabe=='L') { return 4; }
    else if (eingabe=='b' || eingabe=='B') { return 5; }
    else { return 0; }
}

int Collection::showLengst()
{
    if (elements==0)
    {
        return 6;
    }

    int lengst=getLengst();

    clrscr();
    home();
    
    std::cout << "Ihre Längste CD:";
    gotoxy(3,4);
    std::cout << collection[lengst].title << "| Länge: " << collection[lengst].length;
    gotoxy(3,6);
    std::cout << "Drücken Sie einen Knopf um zum Menü zurückzukehren.";
    gotoxy(3,9);
    std::cin.clear();
    getchar();
    return 0;
}

Collection::~Collection()
{
    int i=0;
    while (i<elements)
    {
        delete [] *collection;
        i++;
    }
}

int Collection::createNewCD(char title[30], int length)
{
    collection[elements]=new CD;
    strncpy(title, collection[elements].title, 30);
    collection[elements].length=length;
    elements++;
}

int Collection::getLengst()
{
    int lengstElement[elements];
    int i=0; int tmp;
    while (i<elements)
    {
        lengstElement[i]=i;
        i++;
    }
    
    bool thru=false; i=0;
    while (thru==false)
    {
        if (collection[i].length<collection[i+1].length)
        {
            lengstElement[i]=i+1;
            lengstElement[i+1]=i;
            i=0;
        }
        if (i>=elements)
        {
            thru=true;
        }
        i++;
    }
	
	return lengstElement[0];
}

}
Compilerfehler (GCC):
arch.cpp: In destructor ‘arch::Collection::~Collection()’:
arch.cpp:73: error: type ‘class arch::Collection::CD’ argument given to ‘delete’, expected pointer
arch.cpp: In member function ‘int arch::Collection::createNewCD(char*, int)’:
arch.cpp:80: error: no match for ‘operator=’ in ‘*(((arch::Collection*)this)->arch::Collection::collection + ((unsigned int)(((arch::Collection*)this)->arch::Collection::elements * 36u))) = (arch::Collection::CD*)operator new(36u)’
arch.h:12: note: candidates are: arch::Collection::CD& arch::Collection::CD::operator=(const arch::Collection::CD&)
Wie also muss ich hier delete verwenden (vllt. kann mir jmd. allgemein erklären wie delete zu verwenden ist, ich schau mir auf die Seite im Wiki nochmal an ;) )
Warum kann ich collection nicht mit 'new CD;' erweitern?

Vielen Dank im Voraus für eure Hilfe.

MfG Naums
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: mit 'new' ein Array erweitern

Beitrag von cloidnerux » Fr Mai 27, 2011 5:34 pm

New und delete sind Equivalent zu malloc und free, beziehen sich also Auf Pointer.
Ein Pointer ist, wie du wissen solltest, ein Zeiger auf ein Stück Speicher.
Aber dieses Stückchen Speicher, auf das der Pointer verweist, muss erstmal existieren, sprich du musst entweder auf eine Variable verweisen oder ein Stück speicher anfordern.
Angeforderter Speicher steht anderen Programmen nicht mehr zur Verfügung und sollte, sobald nicht mehr benötigt, freigegeben werden, mit delete.
Das heißt, die Verwendung von new und delete erfordert, das du mit Pointern statt mit Variablen arbeitest.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: mit 'new' ein Array erweitern

Beitrag von naums » Fr Mai 27, 2011 7:11 pm

Okay, habe alles so umgeändert, dass collection nun ein Array von Zeigern ist. Jetz kriege ich allerdings diesen Compilerfehler: ( CD *collection[]; )
arch.cpp:59: error: request for member ‘title’ in ‘((arch::Collection*)this)->arch::Collection::collection[lengst]’, which is of non-class type ‘arch::Collection::CD*’
arch.cpp:59: error: request for member ‘length’ in ‘((arch::Collection*)this)->arch::Collection::collection[lengst]’, which is of non-class type ‘arch::Collection::CD*’
(ähnliche Fehler entfernt, siehe Z. 81,82 und 99)
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: mit 'new' ein Array erweitern

Beitrag von cloidnerux » Fr Mai 27, 2011 7:22 pm

Bist du dir sicher, das du die Derefernzierungoperatoren richtig Verwendest?
Der Punktoperator funktioniert nur bei Variablen:

Code: Alles auswählen

MyClass myObject();
myObject.func1(); //<- Richtig
myObject->func1(); //<- Falsch
Der "->" funktioniert nur bei Pointern.

Code: Alles auswählen

MyClass *myObject;
myObject.func1(); //<- Falsch
myObject->func1(); //<-Richtig
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: mit 'new' ein Array erweitern

Beitrag von naums » Fr Mai 27, 2011 7:29 pm

Okay... tatsächlich. Klappt. ^^
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: mit 'new' ein Array erweitern

Beitrag von Xin » Sa Mai 28, 2011 12:24 pm

Wachsende Arrays findest Du übrigens in C++ mit dem Template std::vector<>.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: mit 'new' ein Array erweitern

Beitrag von naums » Sa Mai 28, 2011 3:01 pm

???.

Ich krieg jetz grade nen SegFault, beim zugriff auf das neue Objekt CD.

bei

Code: Alles auswählen

collection[element]=new CD;
strncpy(collection[element]->title,title,30); 
Bitte um Hilfe. ;)

MfG Naums
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: mit 'new' ein Array erweitern

Beitrag von cloidnerux » Sa Mai 28, 2011 3:14 pm

Du solltest den Konstruktor Aufrufen:

Code: Alles auswählen

collection[element]=new CD();
Und dann könntest du, wenn du schon C++ nutzt, auch C++ strings nutzen.
Das macht die Sache einfacher.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: mit 'new' ein Array erweitern

Beitrag von naums » Sa Mai 28, 2011 5:13 pm

Immernoch Segfault, aber ich schaus mir dann mal genauer mit dem GDB an. ;)
.globl truth
truth:
mov r0, #42
mov pc, lr

Antworten