Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
27.10.2002, 11:12
voidi



also ich habe eine klasse schafe und nun möchte ich ein paar schafe erzeugen und zwar in einem array:
Quellcode:
CSchafe schaf[40];

for(i=0;i<(rand(2,10));i++)   //ob das mit rand so geht weiss ich nich, ich kenne den befehl in c++ nich
{

schaf(i).m_age = soundso;    //runde klammer weil er bei [] italic macht
...

}

ist das so im großen und ganzem möglich?

--

2far.net

<Teranite> ich hab nen arschmaessigen traffic


Dieser Beitrag wurde am 27.10.2002 um 11:14 von voidi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
27.10.2002, 11:29
[RMen]OneStone



Naja fast. Du hast Konstruktor und Destruktor vergessen.

Quellcode:
CSchaf * pSchafe[10];

int main()
{
    for(int i = 0; i < 10; i++)
    {
        pSchafe[ i ] = new CSchaf(); // neues Schaf anlegen
        pSchafe[ i ]->m_nAge = rand() %20 + 10; // zwischen 20 und 30 Jahre alt
    }

    // mach was mit die Schafe

    for(int j = 0; j < 10; j++)
        delete pSchafe[ j ];

    return 0;
}

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
002
27.10.2002, 11:34
voidi



Zitat:

pSchafe[ i ] = new CSchaf(); // neues Schaf anlegen

newbie frage:

ist new CSchaf() dein Konstruktor ?

und warum verwendest du hier

Zitat:
CSchaf * pSchafe[10];

einen zeiger?

--

2far.net

<Teranite> ich hab nen arschmaessigen traffic


Dieser Beitrag wurde am 27.10.2002 um 11:37 von voidi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
27.10.2002, 13:36
[RMen]OneStone



CSchaf sollte dann als Konstruktor in der CSchaf definiert und implementiert sein.

Also ich verwende keinen Zeiger auf nen Array sondern nen Array von Zeigern. Da dier ein Konstruktor auch immer nen Pointer zurückgeben wird, ist es sinnvoll das so zumachen.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
004
27.10.2002, 14:32
Kriz



Naja... Normalerweise macht man das so:

Quellcode:CSchaf* pSchafe[10];
int main()
{
    for(int i=0; i<10; i++)
    {
        pSchafe[ i ] = new CSchaf(); // neues Schaf anlegen
        pSchafe[ i ]->m_nAge = rand() %20 + 10; // zwischen 20 und 30 Jahre alt
    }
    // mach was mit den Schafen
    for(i=0; i<10; i++) delete pSchafe[ i ]; // Alle erzeugten Schafe löschen
    delete [] pSchafe; // Schaf-Array löschen
    pSchafe = NULL; // Zeiger auf NULL zeigen lassen (ist sicherer)
    return 0;
}

Wenn man 10 Schaf-Pointer erzeugt, dann sollte man diese auch danach wieder löschen und nicht nur die 10 Schaf-Objekte. Zur Sicherheit sollte man dann den Basispointer pSchaf noch auf NULL zeigen lassen.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 27.10.2002 um 14:32 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
27.10.2002, 17:12
Mazze



Wo ist eigentlich hier das Problem?
Quellcode:
CSchaf Schafe[10];
int main()
{
    for(int i = 0; i < 10; i++)
        Schafe[ i ].m_nAge = rand() %20 + 10; // zwischen 20 und 30 Jahre

    // mach was mit den Schafen
    return 0;
}

cu
Matze

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
006
27.10.2002, 18:35
Prefect



Hmm, in chronologischer Reihenfolge:

Quellcode:
CSchafe schaf[40];

for(i=0;i<2+(rand()%9);i++)   //ob das mit rand so geht weiss ich nich, ich kenne den befehl in c++ nich
  schaf[ i ].m_age = soundso;

_Möglich_ ist das so. Allerdings macht es nicht viel Sinn, aus mehreren Gründen:
1. Du willst sicherlich nicht nur eine zufällige Anzahl von Schafen initialisieren, sondern alle Schafe. Wenn du eine zufällige Anzahl an Schafen initialisierst sind Bugs vorprogrammiert.
2. Der obige Code ruft in _jeder_ Iteration rand() auf (rand() gibt eine Zahl von 0 bis RAND_MAX zurück). Das heißt, der Wert, mit dem i verglichen wird, ist in jeder Iteration ein anderer! Das kann nicht Sinn der Sache sein.

OneStone:
1. Wenn du sowieso den Standardkonstruktor verwendest brauchst du keine Pointer. Klar kannst du Pointer verwenden, aber das hilft dem originalen Poster nicht weiter.
2. pSchafe[ i ] = new CSchaf; // ohne Klammern
3. (Haarspalterei) rand() % 20 + 10 gibt einen Wert im Bereich [10..29] [blah.. auch nicht 20..29 ;)]

Kriz:
1. Ebenfalls new CSchaf; ohne Klammern.
2. Du solltest pSchafe besser nicht delete'n wenn du es nicht per new auf dem Heap alloziierst...

Mazze: Da gibt's kein Problem. Aber warum einfach, wenn's auch kompliziert geht? ;)

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.


Dieser Beitrag wurde am 27.10.2002 um 19:00 von Prefect bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
27.10.2002, 20:43
voidi



Zitat:
Prefect postete
2. Du solltest pSchafe besser nicht delete'n wenn du es nicht per new auf dem Heap alloziierst...

noch ne newbfrage: was genau ist ein heap?
ich weiss ,glaub ich, dass es irgendwas mit stack und speicher zu tun hat
(bitte nich haun)

ich habe mal gelesen, das man mithilfe des konstruktors gleich werte an das schaf übergeben kann, falls der konstruktor entsprechend aufgebaut ist, also
Quellcode:schaf[ i ] = CSchaf(alter,größe,etc.)
stimmt das?

edit und wozu ist das "new" da ?

--

2far.net

<Teranite> ich hab nen arschmaessigen traffic


Dieser Beitrag wurde am 27.10.2002 um 20:44 von voidi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
27.10.2002, 20:57
theDon



mit new alloziert man speicher vom heap. heap ist der sog. freispeicher.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
009
28.10.2002, 10:52
Prefect



Der gesamte Speicherbereich, auf den ein Programm zugreifen kann, ist in mehrere Bereiche unterteilt, die man manchmal auch Segmente nennt (obwohl sie mit den "Segmenten", die die x86-Prozessoren haben, erstmal nichts zu tun haben):
- Codesegment (unter Unix "text") enthält das kompilierte Programm
- Datensegment (unter Unix "data" und "bss" für 0-initialisierte Daten) enthält alle globalen Variablen des Programms
- der Stack enthält alle lokalen Variablen, also die Variablen, die du innerhalb einer Funktion deklarierst sowie die Parameter der Funktion
- der Heap ist ein Datenblock, auf dem du dynamisch, je nach Anforderung, Speicher reservieren kannst (per malloc() oder new). Das ist sehr nützlich, wenn du erst zur Laufzeit weißt, ob du 10 oder 100 Schafe zählen willst

Quellcode:
int *array;

void foo(int count)
{
  int i;

  array = (int*)malloc(sizeof(int)*count);

  for(i = 0; i < count; i++)
    array[ i ] = rand();

  free(array);
}

array ist ein Pointer als globale Variable und liegt somit im Datensegment.
*array ist das Array, auf den der Pointer array zeigt. Der Speicher wurde mit malloc() reserviert, befindet sich also auf dem Heap.
i ist eine lokale Variable und liegt daher auf dem Stack.
count ist ein Parameter und liegt daher ebenfalls auf dem Stack.

(Übrigens... der Code da oben ist nicht ernst zu nehmen. Wer eine globale Variable im echten Leben so verwendet hat ein ernsthaftes Problem)

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
010
28.10.2002, 14:44
blair



dürfte man fragen wieso onestone überhaupt schafe dynamisch allokiert?
hast du das krankhafte bedürfnis deinen heap zu fragmentieren?

<edit>
eine quelle die nicht genannt werden will (vieleicht doch, aber ich nenn sie einfach nicht) hat mich darauf aufmerksam gemacht, das du ja evtl phOS verwendest, und das entweder keine heap fragmention oder kein heap (wahrscheinlicher) kennt...
sollte das der fall sein, betrachte meinen post als gegenstandslos

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs


Dieser Beitrag wurde am 28.10.2002 um 14:49 von Blair bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
011
28.10.2002, 15:03
Kriz



Rofl... Plair, tu pöser Purche, tu!

=)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
012
28.10.2002, 17:01
CorDharel



Zitat:
noch ne newbfrage: was genau ist ein heap?
ich weiss ,glaub ich, dass es irgendwas mit stack und speicher zu tun hat
(bitte nich haun)

Ich frage mich warum du denkst dass das ne n00bfrage ist, oder weiss z.Bsp. deine Mutter etwa was Heap ist?

Schlimm ists höchstens wenn du fragst wo du C++ kaufen kannst ;)

@Blair
Heap fragmentieren 0wnt :D

Vor allem mit Schafen... ;)

--

Greetz CorDharel

Leader der HolyShitBastards

zum Seitenanfang zum Seitenende Profil || Suche
013
28.10.2002, 18:36
apfelkorn



@Prefect:

Zitat:

(Übrigens... der Code da oben ist nicht ernst zu nehmen. Wer eine globale Variable im echten Leben so verwendet hat ein ernsthaftes Problem)

Sag das bitte zu John Carmack.
Wer das alles nachvollziehen will, soll sich mal die Tokenizer-Funktion von Quake und Quake 2 fürs Consolenscripting reinziehen...

--

zum Seitenanfang zum Seitenende Profil || Suche
014
28.10.2002, 20:12
Kriz



JC ist eh ein lebender C/C++ Compiler, der sieht die Welt nur noch in binären Abfolgen =)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
015
30.10.2002, 17:54
Prefect



@apfelkorn: Wenn John Carmack globale Variablen verwendet macht es meistens einen Sinn, auch wenn es halt Performancehacks sind. In meinem Beispiel macht es gar keinen Sinn, denn die gezeigte Funktion ändert letztendlich nichts an der globalen Variable array.
Vor dem Aufruf der Funktion ist die Variable in einem undefinierten Zustand. In der Funktion zeigt sie dann einmal zeitweise auf einen Block im Heap, aber nach dem Funktionsaufruf ist die Variable wieder in einem "undefinierten" Zustand: sie zeigt irgendwo in den Heap, an eine Stelle, auf die man so nicht zugreifen sollte.
array könnte also genausogut eine lokale Variable sein (oder ein Parameter, aber das wäre nochmal um Größenordnungen gestörter).

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche