Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
13.11.2001, 20:18
Son-Goten



hi leutz!
also.. ich hab da ein problem... *was, wirklich?!* ;)

ich werde mir einfach nicht über die bedeutung von arrays/vektoren klar...
ich lerne c++ mit volkards, allerdings sind gerade die lektionen über arrays völlig unzureichend......
mir ist klar, dass....
....int xyz[5] ein array mit 5 speichern(oder so?) ist...
....diese speicher mit z.B. cout<<xyz[0] bis [4] aufgerufen werden können....
aber was in gottes namen bringt mir das außer weniger übersicht?!

danke
goten

--


Dieser Beitrag wurde am 13.11.2001 um 20:19 von Son-Goten bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
13.11.2001, 20:25
Mazze



Es bringt dir sehr viel!
Wie willst du denn eine String darstellen?
Also ich würd das mit
char sz[256];
machen!
Das war eines von sehr vielen Beispielen, bei denen man einfach Arrays braucht!

--

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

zum Seitenanfang zum Seitenende Profil || Suche
002
13.11.2001, 20:27
greyhound000



Frage:
Was bringen Punktvariablen oder wie die heisen?
Ich meine die Sterne?
Hab das Kapitel im Buch net gecheckt...

--

zum Seitenanfang zum Seitenende Profil || Suche
003
13.11.2001, 20:29
Mazze



Soll das verarsche sein?

--

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

zum Seitenanfang zum Seitenende Profil || Suche
004
13.11.2001, 20:30
thinktank



ned ganz int xyz[5] ist ein array mit 6 Feldern (oder ?? :)), aber bei char str[5] sind es eigentlich 5 , da noch ein Nullbyte(oder wie wird das genannt :(?) dran gehängt werden muss. Das ist so, weil man bei C++ bei 0 anfängt zu Zählen ( ich kann nichts dafür :) ). Wieso unüberischtlicher ?
Stell dir vor du willst ein Schachbrett machen, was wäre geeigneter als ein array ?

int schachbrett[4/*x*/][3/*y*/] = BAUER; // oder so ;)

--

zum Seitenanfang zum Seitenende Profil || Suche
005
13.11.2001, 20:41
Another1



allgemeinee array def: type array[size]{[size2]...]};

und size is genau die size des arrays. Nur das in C 0 das 1. element is und size-1 das letzte

mensch das sind grundlagen leude :P

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
006
13.11.2001, 20:44
Son-Goten



char sz[256];

naja... klar, dass man bei char oft mehr als ein zeichen braucht....
aber bei dem schachbrettbeispiel kann ich trotzdem nicht so ganz folgen ;)
ein schachbrett hat doch 8*8 felder? da sag ich doch lieber, dass der bauer auf dem feld x=2 und y=1 steht, oder so....

--

zum Seitenanfang zum Seitenende Profil || Suche
007
13.11.2001, 20:57
Archangel



tja, das würdest du lieber sagen, aber das gefällt C nich :p

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
008
13.11.2001, 21:10
Psychodad



@greyhound: Punktvariable?
Du meinst Pointer bzw Zeiger nehm ich an.
Alles was du in Variablen speicherst wird irgendwo im (erstmal) RAM abgelegt.
Wenn du nu die Variable mit dem gespeicherten Wert aufrufst, dann wird erst mal geschaut wo die Variable bzw deren Inhalt im RAM is.
Bei Pointern aber, wird nicht der Wert der Variablen gespeichert, sondern wo der Wert im RAM zu finden ist.
Rufst Du nu den Pointer auf, so steht da sofort wo das im RAM ist, und der Zugriff erfoglt wesentlich schneller.
Bsp.:Du suchst dein Matchbox-Auto *g*
Du hast dir bei ner normalen Variable aufm Zettel geschrieben, dass das ein Matchi is, das grün is. Toll - nu musste aber immer noch dein ganzes Zimmer durchsuchen.
Bei nem Pointer haste Dir aufgeschrieben wo es ist (Linker Schieber ganz unten). Also bist Du schneller.

--

zum Seitenanfang zum Seitenende Profil || Suche
009
13.11.2001, 21:10
Son-Goten



wieso?
so schwer ist das doch nicht zu programmieren?
nö, nicht wirklich.... o.k., das programm *piepsstimme* könnte leicht groß und langsam werden, aber es ist doch möglich, jeder figur 2 werte zuzuordnen.... ooops... da wären wir ja bei den arrays.....anstatt x1, x2, x3, x4, x5, x6, x7, x8 und dasselbe nochmal bei y zu definieren, schreibt man einfach x[8] und y[8]........ hey.... das könnt ich ja morgen mal als denkspurtaufgabe schreiben ;)
achso, mal zur weiteren logik: natürlich MÜSSEN jeder figur auf dem feld 2 werte zugeordnet werden... aber hier wäre doch selbst die array-schreibweise zu kompliziert?? ohne jetzt von den zugmöglichkeiten der einzelnen figuren zu sprechen ( könnte man ja sehr gut in klassen unterbringen), für jeden zug umständlich etwas wie xpos=x[3]; ypos=y[5] zu schreiben bringt´s doch auch nicht....

--

zum Seitenanfang zum Seitenende Profil || Suche
010
13.11.2001, 21:14
Son-Goten



@dad ich glaub, er spielt nimmer mit matchbox.... ;))))
ich versuch´s mal anders....
also... stell dir vor, bei dir im zimmer versteckt sich irgendwo pamela andersson...................................................... ;))))))))))))))))))

--

zum Seitenanfang zum Seitenende Profil || Suche
011
13.11.2001, 21:40
Psychodad



*rofl*
Jep wär vielleicht besser vorstellbar!

--

zum Seitenanfang zum Seitenende Profil || Suche
012
13.11.2001, 22:03
Laser



ok wenn du es noch nicht verstanden hast:
Nehmen wir als Beispiel: Du mußt 10 werte einlesen und dann ausgeben.
normalerweise würdest du jetzt 10 variablen deklarieren, jede einzelne einlesen lassen und dann ausgeben lassen.
Stattdessen kannst du ein array benutzen.
hier mußt du den code zum einlesen und ausgeben nur einmal schreiben und auch nur das eine array deklarieren anstatt von 10 variabeln.
um die werte jetzt einzulesen bzw. auszugeben benuzt du z. B. eine
for-schleife:
for(y=0;y<10;<++)
{
cout << "Werte eingeben:"<<endl;
cin >> x[y]
}
das kannst du dann auf das ausgeben übertragen.
ich finde das sehr viel einfacher als die erste möglichkeit(ist natürlich ein doofes beispiel)

--

zum Seitenanfang zum Seitenende Profil || Suche
013
13.11.2001, 22:05
Kriz



Wofür braucht man Arrays?

>>> Dazu muß man ja wohl nichts mehr sagen <<<

--

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
014
16.11.2001, 16:52
draft



Wie bereits angedeutet, sind Arrays fuer dynamischen Code unumgaenglich. Wenn ich derartigen "Code" lese...:

Quellcode:
int variable1;
int variable2;
int noch_ne_variable;
int ok_eine_brauch_ich_noch;
cout << "bitte 1. Wert eingeben" << endl;
cin >> variable1;
cout << "bitte 2. Wert eingeben" << endl;
cin >> variable2:
...

...tun mir die Augen weh. Ohne Felder ist es einfach nicht moeglich, einen Speicherbereich zu allokieren, dessen Umfang erst zur Laufzeit bekannt wird.
Aber vor allem natuerlich sind Felder ein sehr, sehr nuetzlicher Partner fuer Schleifen, da sich ein Zaehler effizient als Feldindex verwenden laesst.
Doch zunaechst eine kurze Beschreibung, wie es sich technisch mit Arrays verhaelt...
Das Array ist eine Ansammlung /gleicher/ Datentypen im Speicher, die sich ueber einen Index, eine Platznummer ansprechen lassen.

int array[4]; allokiert Platz fuer 4 4-Bytes-grosze Integer, auf die du ueber i = 0 bis i = 3 zugreifen kannst (i = Index, "Die Zahl zwischen den Klammern").
Schauen wir zum genaueren Verstaendnis in den RAM-Speicher:

#[ ] [ ] [ ] [ ]#[ ] [ ] [ ] [ ]#[ ] [ ] [ ] [ ]#[ ] [ ] [ ] [ ]#[ ] [ ] [ ][ ][ ][ ][ ]
| array[0] | array[1] | array[2] | array[3] |
| | | |
array[0]-| | | |
array[1]------------| | |
array[2]--------------------------| |
array[3]----------------------------------------|

[ ] steht fuer ein Speichersegment zu einem Byte. Da ein Integer 4 Bytes belegt, habe ich die jeweiligen Integerbereiche mit einem # getrennt- der Uebersicht halber.
Bei der Deklaration eines Feldes lassen sich mehrere Elemente auf einmal ansprechen, etwa durch;

Quellcode:
int array[4] = {1, 2, 3, 4};

Dabei wird der erste Wert der geschweiften Klammer dem ersten Element des Feldes zugewiesen, waere also Aequivalent zu array[0] = 1;. Dies macht dann z.b. Sinn, wenn man den allokierten Speicher eines Feldes schnell von eventuell uebrigen gebliebenem Muell leeren will; int array[4] = {0, 0, 0, 0};.
Bei dieser sofortigen Wertezuweisung (und nur dabei!) muss uebrigens keine zu allokierende Element-Nummer angegeben werden.

Quellcode:
int array[] = {6, 2, 100, 44};

...wuerde also ebenfalls ein Feld von 4 Elementen erstellen, denen gleich die entsprechenden Werte zugewiesen werden. Das ist z.b. bei Strings recht praktisch, wenn man nicht alle Buchstaben zaehlen moechte :);

Quellcode:
char edelstring[] = "hallo!";

...gleicht:

Quellcode:
char edelstring[6];
edelstring[0] = 'h';
edelstring[1] = 'a';
edelstring[2] = 'l';
edelstring[3] = 'l';
edelstring[4] = 'o';
edelstring[5] = '!';
edelstring[6] = 0;

Beim expliziten Ansprechen eines Feldes wird die Platznummer im Feld-Operatoren angegeben. Mit array[2] kann man uebrigens genauso umgehen, wie mit ich_bin_ein_einzelner_integer.

---

Nun zu den Zeigern...

Ein Zeiger enthaelt die absolute Speicheradresse einer Variablen. Nutzt du die Variable in einem Stueck Code, weiszt du nicht, wo sich diese befindet. Dies stellt bei der Werteuebergabe an Funktionen/Klassen dann ein Problem dar, wenn die Variable selbst bearbeitet werden soll. Es werden naemlich ohne Zeiger nur Kopien uebergeben. Schicken wir nun aber eine Speicheradresse an eine Funktion und schreiben auf diese Adresse, so wird logischerweise auch der Variableninhalt geaendert. Es ist die absolute, eindeutige Adresse, welche auf jeden Fall auf das Orginalobjekt zugreift.

int variable;

Speicher:

1 2 3 4 5 6 7 8 9 10
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
|variable |

Die Zahlen ueber den einzelnen Speichersegmenten stehen fuer deren Adressen, die ich der Einfachkeit halber einfach mal als 1-10 bezeichne. unsere Variable belegt nun also bytes 1-4...

Quellcode:
int *pointer = &variable;

In pointer steht nun die Adresse 1, die wir ihm durch den Operatoren & zugewiesen haben. Schreiben wir nun auf pointer, werden Bytes 1-4 bearbeitet, was automatisch auch den Wert von variable aendert.

Quellcode:
#include <stdio.h>
void funktion(int *pointer)
{
*pointer = 5;
}
main()
{
int variable = 6;
printf( "Vor Funktionsaufruf ist variable = %d\n", variable );
funktion( &variable );
printf( "Nach Funktionsaufruf ist variable = %d", variable );
getchar( );
}

---
Hoffe, das ist jetzt klar...

--

zum Seitenanfang zum Seitenende Profil || Suche
015
16.11.2001, 17:32
Tron



@draft:
es muss
char edelstring[7]
heissen
ich denk mal das war nur ein tippfehler, aber net dass da jemand was falsches mitbekommt...
char edelstring[7] resertviert 7 chars mit den indizes 0 bis 6!

btw: der * gehoert (gemaes gutem programmierstil) zum datentyp und nicht zur variablen
also
int* foobar
und nicht
int *foobar

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
016
16.11.2001, 19:00
Mazze



Man kann es so oder so machen!
Ich bevorzuge auch int *foobar

--

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

zum Seitenanfang zum Seitenende Profil || Suche
017
16.11.2001, 23:15
Hessie J.



@Tron: Wahrscheinlich ist es ja auch gegen den guten Stil, zwei Pointer auf einmal zu definieren, aber da macht man es ja auch so:Quellcode:int *a, *b;

--


Dieser Beitrag wurde am 16.11.2001 um 23:17 von Hessie J. bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche