Seite 1 von 1

mit 'new' ein Array erweitern

Verfasst: Fr Mai 27, 2011 4:55 pm
von naums
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

Re: mit 'new' ein Array erweitern

Verfasst: Fr Mai 27, 2011 5:34 pm
von cloidnerux
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.

Re: mit 'new' ein Array erweitern

Verfasst: Fr Mai 27, 2011 7:11 pm
von naums
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)

Re: mit 'new' ein Array erweitern

Verfasst: Fr Mai 27, 2011 7:22 pm
von cloidnerux
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

Re: mit 'new' ein Array erweitern

Verfasst: Fr Mai 27, 2011 7:29 pm
von naums
Okay... tatsächlich. Klappt. ^^

Re: mit 'new' ein Array erweitern

Verfasst: Sa Mai 28, 2011 12:24 pm
von Xin
Wachsende Arrays findest Du übrigens in C++ mit dem Template std::vector<>.

Re: mit 'new' ein Array erweitern

Verfasst: Sa Mai 28, 2011 3:01 pm
von naums
???.

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

Re: mit 'new' ein Array erweitern

Verfasst: Sa Mai 28, 2011 3:14 pm
von cloidnerux
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.

Re: mit 'new' ein Array erweitern

Verfasst: Sa Mai 28, 2011 5:13 pm
von naums
Immernoch Segfault, aber ich schaus mir dann mal genauer mit dem GDB an. ;)