Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » frage zu dynamischen Objekten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
17.12.2003, 15:51 Uhr
~haribobär
Gast


hallo jungs
habe hier ein beispielprogramm habe in der headerdatei eine struktur angelegt

C++:
struct Klausurergebniss
{
    
    char name[16];
    int matrikelnummer;
    int note;
};



ich will mein programm so ändern das ich meine daten die ich eingebe (name;matrikelnr;note) als dynamische objekte speichern und verwenden kann, unten ist ein beispielprogramm wie die ein- und ausgabe aussehen sollte, leider nur als statische objekte.
das ganze soll mit einem new operator geschehen
bin leider noch ein anfänger, könnte mir einer da helffen vielleicht schreibt er mir ein kleines beispielprogramm

vielen dank schon mal im voraus.



C++:
#include "core.h"    

int anzahl=0;
Klausurergebniss daten[5]={ };

void add()
{



cout<<"name"<<endl;
cin>>daten[anzahl].name;


cout<<"mat"<<endl;
cin>>daten[anzahl].matrikelnummer;


cout<<"note"<<endl;
cin>>daten[anzahl].note;

anzahl++;

}



void list()
{
for(int i =0;i<anzahl;i++)
{
cout<<daten[i].name<<daten[i].matrikelnummer<<daten[i].note;

}
}




Bearbeitung von 0xdeadbeef:

Was ist eigentlich so schwer daran, die cpp-tags zu benutzen?


Dieser Post wurde am 17.12.2003 um 16:03 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.12.2003, 15:55 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das geht so nicht ohne weiteres
entweder musst du ständig neuen speicher allokieren wenn der alte nicht reicht weil auch mit new musst du eine feste grösse vorgeben nur ist dies halt auch erst zur laufzeit möglich....
(oder du nimmst eine liste )

wenn du sowieso c++ verwenden kannst nimm eine containerklasse aus der STL z.b. std::vector...

wenn du beispiele dafür brauchst einfach mal die forumssuche betätigen und nach std::vector suchen da solltest du massenweise welche finden
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 17.12.2003 um 15:56 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.12.2003, 19:33 Uhr
~haribobär
Gast


Wie benutzt man denn die cpp-tags?


Also ich habe eine feste anzahl.
Ich will 64 Daten einlesen.

Das ganze sollte dann so in etwa aussehen.

C++:
Klausurergebniss* daten[64]={ };

daten[0]=new Klausurergebniss;


Nur wie gebe ich das ganze in der Funktion "add" ein
Ich kann ja nur auf die Adresse zugreifen und nicht auf das
Datenobjekt.
Ich muß dann ja erst den Namen dann die Nummer und dann die Note
eingeben
So und wenn ich dann das nächste mal die Funktion "add" aufrufe
will ich neue Werte eingeben.
aber halt ohne die anderen Werte zu überschreiben.


Dazu muß ich ja die Adresse erhöhen.
Jetzt weiß ich aber nicht wie ich das machen muß.

Ich würde es gerne mit einer for Schleife machen.
Die soll solange laufen bis sie die 1 Adresse mit 0 findet.

ZB:

C++:
for(int i=0;daten[i]==0;i++)
        }
        }



Also die größten Probleme sind wie gebe ich in der add Funktion die 3 Werte ein und wie erhöhe ich die Adresse damit ich bei jedem Funktionsaufruf
neue Werte hinzufügen kann.

Wäre echt nett wenn mir da jemand helfen könnte.
So das es auch ein c++ Anfänger versteht.


Bearbeitung von 0xdeadbeef:

WAS verdammt noch mal ist so VERFLUCHT SCHWER daran, die Tags zu benutzen? Schau beim Text eingeben mal auf die linke Seite, da steht was von Quellcode einfügen.


Dieser Post wurde am 17.12.2003 um 19:55 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.12.2003, 19:40 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


na wenn du schon weisst das es 64 sein sollen brauchst du doch kein new...

C++:
Klausurergebniss daten[64]; //hier hast du doch schon ein array der grösse 64 ....


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.12.2003, 19:54 Uhr
~haribobär
Gast


Ja aber ich muß es mit dem new machen.
Ich soll nicht schon im vorraus 64 Speicherplätze reservieren,
sondern erst wenn ich die Werte eingebe soll
es im Heap gespeichert werden und der Speicher erst dann angelegt weren
wenn neue Daten hinzugefügt werden.


Wenn ich die 64 Speicherplätze im vorraus reserviere
dann kann ich es ja so machen wie ich es oben im ersten Programm habe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.12.2003, 20:05 Uhr
derphilipder



Ich nehme mal an, dass er einfach new falsch verwendet...

C++:


Klausurergebniss* daten;//pointer auf Klausurergebnis

daten = new Klausurergebniss[n];//n ist während der Laufzeit einzugeben
                                             //damit zeigt Daten auf n großes Array

for(int i = 0; i<n; i++)
{
   daten[i].note = 0;//Alle Noten 0 setzen
}



for(i = 0; i<n; i++)
{
   if(daten[i].note==0)//Feldelement noch nicht beschrieben
   {
      add(daten[i]);
      break;
   }
}

//wobei du add so deklarieren musst:
//void add(Klausurergebnis&);//Du kannst dem übergebenen struct dann
                                       //direkt die eingelesenen Werte zuweisen




So mal ganz grob und ohne Gewähr...

edit: kann man eigentlich die Smileys im Quellcode deaktivieren?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"

Dieser Post wurde am 17.12.2003 um 20:07 Uhr von derphilipder editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.12.2003, 20:35 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das mit dem auf 0 setzten ist nicht nötig da du ja gleich eine variable (anzahl) mitgeführt hast die dir angibt welche datensätze valide sind und welche nicht.....

am ende nicht vergessen den allokierten speicher wieder freizugeben

C++:
delete [] daten;


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.12.2003, 20:43 Uhr
~haribobär
Gast


Kann ich die Note vielleich auch anders =0 setzen?

C++:

Klausurergebniss* daten={ };

daten=new Klausurergebniss[64];



Kann ich für n dann = 64 einsetzen?


wie gib ich in der add funktion ein?

Kann ich das so machen

C++:
cout << "gib name ein";
cin >> daten[ i ].name;




und die anderen werte dann genau so


Bearbeitung von Pablo:

CPP und /CPP tags richtig gesetzt


Dieser Post wurde am 17.12.2003 um 21:01 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.12.2003, 20:59 Uhr
derphilipder




Zitat:
Windalf postete
das mit dem auf 0 setzten ist nicht nötig da du ja gleich eine variable (anzahl) mitgeführt hast die dir angibt welche datensätze valide sind und welche nicht.....



Richtig! Da hat der Philip gepennt


@Haribobär - zweimal ja!

Klausurergebniss* daten={ };//Nein!
Kannst aber auch weglassen - siehe Windalf

Und dann so:

C++:
for(i = 0; i<n; i++)
{
   if(i == anzahl)
   {
      add(daten[ i ]);
      break;
   }
}




Falls Du Werte in einer Tour eingeben willst, musst Du für das break in der Schleife noch eine Abbruchbedingung haben, für den Fall, dass Du keine n Klausuergebnisse hast, aber mehr als einen eingeben willst! So wie es jetzt da steht, wird nur ein wert eingegeben und danach abgebrochen.
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"

Dieser Post wurde am 17.12.2003 um 21:04 Uhr von derphilipder editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.12.2003, 21:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also ich würde dir wie gesagt die stl-empfehlen und den namen auch nicht als char[16] sondern lieber als std::string
ach das mit den globalen variablen gefällt mir gar nicht
wenn du sowas machst könntest du auch gleich ein Klasse KlausurergebnisseDatenbank oder sowas basteln aber sei es drum hier mal mein Lösungsvorschlag der relativ nahe an deinem ist.
damit das mit den new überhaupt einen sinn ergibt hab ichs so gemacht das der immer 10 speicherplätze reserviert, wenn der speicher nicht ausreicht werden automatisch 10 neu speicherplätze reserviert für 10 weitere Namen....

C++:
#include <iostream>
using namespace std;

struct Klausurergebniss{char name[16];int matrikelnummer;int note;};

int anzahl,reserviert;
Klausurergebniss *daten;

void add(){
int i;
Klausurergebniss *temp;
    if(anzahl>=reserviert){    //wenn der speicherplatz nicht mehr ausreicht neuen speicher allokieren
        reserviert+=10;
        temp=new Klausurergebniss[reserviert];
        for(i=0;i<anzahl;++i)
            temp[i]=daten[i];
    delete [] daten;
    daten=temp;
    }

cout<<"name: ";
cin>>daten[anzahl].name;


cout<<"mat: ";
cin>>daten[anzahl].matrikelnummer;


cout<<"note: ";
cin>>daten[anzahl].note;

anzahl++;

}

void list(){
for(int i =0;i<anzahl;i++)
    cout<<daten[ i ].name<<"\t"<<daten[ i ].matrikelnummer<<"\t"<<daten[ i ].note<<endl;
}



int main(){

int end=0;
char wahl;
anzahl=0;
reserviert=10;
daten=new Klausurergebniss[reserviert];

while(!end){
    cout<<"(1) Datensatz hinzufuegen\n";
    cout<<"(2) Liste anzeigen\n";
    cout<<"(3) Ende\n";
    cout<<"Ihre Wahl: ";
    cin>>wahl;
    
    if(wahl=='1') add();
    if(wahl=='2') list();
    if(wahl=='3') end=1;

}
delete [] daten;
return 0;
}



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: