JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Anzahl der Elemente eines Arrays
Gehe zu Seite Zurück  1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 09:48    Titel: Antworten mit Zitat

Hazel hat Folgendes geschrieben:
Wenn du das Array so definierst,
Code:

char array[10]

//... dann ist

if(array[10] == 0) // falsch
..


Das letzte Element auf das du zugreifen kannst ist dann 9.


Hazel ich hab wirklich gedacht, du wärst kompetent...

ok dann noch mal:

char array[10]

heißt du kannst array[0] bis array[9] benutzen, okay?

array[10] erhält den Wert 0, damit wird das Ende des Arrays eindeutig festgelegt!!!

Oder beleg mal den Array mit nem Text und dann mach mal das array[5]=0;

tja da hat der array nur noch 5 Zeichen, super, oder?

Oder lese einfach nochmal das Kapitel über char...
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 09:55    Titel: Antworten mit Zitat

@TheMillenium
Sagmal hast Du meinen Post gelesen? Sieht nicht so aus!

TheMillenium hat Folgendes geschrieben:
array[10] erhält den Wert 0, damit wird das Ende des Arrays eindeutig festgelegt!!!

So ein Käse!
Ich dachte eigentlich, ich hätte es ausreichend erklärt in meinem vorherigen Post, was es mit der 0 auf sich hat.



Hast Du das auch mal ausprobiert, bevor Du sowas postest?

--->Acces Violation
Die Anweisung in"0x0xxxx" verweist auf den Speicher "ox00000000"! Der Vorgang 'read' konnte nicht ausgeführt werden!..... usw.<---

Hazel hat Recht!


Zuletzt bearbeitet von Mr.X am 21.07.2003, 10:10, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 09:59    Titel: Antworten mit Zitat

TheMillienium, ich habe wirklich gedacht du wärst kompetent!

Zitat:

heißt du kannst array[0] bis array[9] benutzen, okay?

array[10] erhält den Wert 0, damit wird das Ende des Arrays eindeutig festgelegt!!!


Das ist leider falsch. Mit bla array[10] reservierst du dir Speicher für 10 Elemente, mehr nicht. Der Inhalt des Speichers wird dabei nicht angerührt.

Oder lese einfach nochmal das Kapitel über Arrays...

Warum soll ich das Kapitel über char lesen? Ein character ist ein Variablentyp der genau 1 Zeichen speichern kann. Was du willst ist aber eine Zeichenkette, was nichts anderes ist als ein Array.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R


Zuletzt bearbeitet von Hazel am 21.07.2003, 10:06, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 10:04    Titel: Antworten mit Zitat

Hier nochmal 2 Auszüge aus dem Buch "C++ in 21 Tagen" für TheMillenium.

Zitat:

Zeichen-Variablen (vom Typ char) sind in der Regel 1 Byte groß und können damit 256 Werte (siehe Anhang C) aufnehmen. Eine Variable vom Typ char kann als kleine Zahl (0-255) oder als Teil des ASCII-Zeichensatzes interpretiert werden. ASCII steht für American Standard Code for Information Interchange (amerikanischer Standard-Code für den Informationsaustausch). Mit dem ASCII-Zeichensatz und seinem ISO-Gegenstück (International Standards Organization) können alle Buchstaben, Zahlen und Satzzeichen codiert werden.


Zitat:

Wenn Sie in das Element LongArray[50] schreiben, ignoriert der Compiler die Tatsache, daß es kein derartiges Element gibt, berechnet die Verschiebung zum ersten Element - 200 Byte - und schreibt den Wert an diese Speicherstelle - ohne Rücksicht darauf, was an dieser Speicherstelle bereits abgelegt ist. Dort können nahezu beliebige Daten stehen, so daß das Überschreiben mit den neuen Daten zu unvorhersehbaren Ergebnissen führen kann. Wenn man Glück hat, stürzt das Programm sofort ab. Andernfalls erhält man wesentlich später im Programm seltsame Ergebnisse und kann nur schwer herausfinden, was hier schiefgegangen ist.

Verstehst du? Da wird nix gleich 0 gesetzt damit man das Ende erkennt.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nEp
Junior JLI'ler



Anmeldedatum: 03.06.2003
Beiträge: 75

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 11:18    Titel: Antworten mit Zitat

So wie ich das gepostet habe geht es natürlich Razz
Probier es einfach mal
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nEp
Junior JLI'ler



Anmeldedatum: 03.06.2003
Beiträge: 75

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 11:21    Titel: Antworten mit Zitat

The Lord of Programming hat Folgendes geschrieben:
Hab ich doch schon vorgeschlagen.
Is aber falsch, da wenn du "a" angibst, ein Pointer auf das erste Element zurückgegeben wird^^


Korrekt. Das muss ja auch so sein. Und deshalb liefert dir sizeof die Größe dieses ganzen Blockes in Bytes zurück. Um nun aber die Elementanzahl rauszubekommen musst du das eben noch durch die Größe des Datentyps des Arrays teilen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 11:48    Titel: Antworten mit Zitat

Ok wenn ihr nicht hören wollt, dann seid ihr alle halt Newbs, sorry ist so.

Macht mal das!!!

Code:

#include <iostream.h>

int main()
{
   char test[10]="abcdefghi";

   cout << test << endl;

   test[5]=0;

   cout << test << endl;

   return 0;
}


Ausgabe:
Code:

abcdefghi
abcde




[EDIT]
oder besser noch das:
Code:

#include <iostream.h>

int main()
{
   char test[10]="abcdefghi";
   int i=0;

   while(test[i]!=0)
      i++;

   cout << "Zeichen von test: " << i << endl;

   cout << test << endl;

   test[5]=0;

   cout << test << endl;

   return 0;
}

Ausgabe:
Code:

Zeichen von test: 9
abcdefghi
abcde



Na Hazel, nächstes mal nicht einfach die Zeilen überfliegen, sondern richtig lesen udn verstehen und besser noch merken! Wink
[/EDIT]

[EDIT2]
Sorry Hazel, aber mich regt es halt einfach auf, wenn du halt Fakten keinen Glauben schenken magst...
[/EDIT2]
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 12:11    Titel: Antworten mit Zitat

nEp hat Folgendes geschrieben:
So wie ich das gepostet habe geht es natürlich Razz
Probier es einfach mal
....
Und deshalb liefert dir sizeof die Größe dieses ganzen Blockes in Bytes zurück.

NEIN, FALSCH!
sizeof ermittelt die Byte-Länge anhand der Typvereinbarung!!! sizeof liefert keine Länge von irgendwelchen Speicherblöcken! Und so wie Du es gepostet hast, geht es eben nicht, weil Du die Bytelänge des Pointers (== 4Byte) durch die Bytelänge einer Integer-Zahl (== 4Byte) teilst. Und da kommt immer 1 raus, egal wie lang das Array nun wirklich ist!


TheMillenium hat Folgendes geschrieben:
Ok wenn ihr nicht hören wollt, dann seid ihr alle halt Newbs, sorry ist so.
Macht mal das!!!
Code:
#include <iostream.h>
int main()
{
char test[10]="abcdefghi";...

OMG, Du hast wirklich meinen Post nicht durchgelesen und demzufolge nicht verstanden.
Also nochmal nur für Dich Wink

Du reservierst mit der Anweisung char test[10] im Speicher 10 * 1 Byte, wobei in der Variablen test die erste Speicheradresse dieses Speicherbereiches abgelegt wird.
Nun folgt weiter in Deiner Anweisung an den Compiler ="abcdefghi", was der Compiler als eine 2. Anweisung ansieht, aus Gründen der Einfachheit kann man das aber gleich so schreiben wie Du, indem man eine Variable deklariert und gleich definiert (initialisiert).
Für den Compiler bleiben es aber 2 verschiedene Anweisungen!!! Was passiert nun? In Deiner Anweisung ="abcdefghi" übergibst Du dem Compiler einen Nullterminierten String. Das Du die Null nicht explizit mit angeben musst liegt daran, weil der Compiler Dir diese Arbeit abnimmt! Und das alles hat noch rein garnichts mit dem Array zu tun.
So, der Compiler sorgt nun dafür, das beginnend bei der Speicherstelle test alle 1 Byte lang ein Zeichen aus dem übergebenem String abgelegt wird! Nachdem er diese Zeichenkette in diesem Array abgelegt hat, nutzt er das nächste freie Element des Arrays, um darin eine 0 zu schreiben, welche besagt, das die Zeichenkette hier endet, und nicht das Array!!!

Du hast also geschrieben char test[10]="abcdefghi"! Warum konntest Du keinen 10. Buchstaben in Deiner Zeichenkette übergeben, obwohl Du doch 10 char-Felder hast? ganz einfach, weil ein Feld des Arrays für die 0 übrig bleiben muss!

Nachfolgend gibts Du die Anweisung test[5] = 0;. Ich weiss ja nicht was Du uns damit sagen willst, aber an der Array-Länge veränderst Du NICHTS damit! Du bewirkst lediglich, das bei einer auf das Array angewendeten String-Funktion (wie strleng()) das erste Vorkommen einer 0 als Ende der Zeichenkette interpretiert wird! Das Wichtigste ist aber, das Dein Array von solchen Anweisungen unberührt bleibt und weiterhin 10 Felder a 1 Byte lang im Speicher liegt.






[EDIT]
Hazel hat Folgendes geschrieben:
[EDIT] Mr. X war schneller. Wink

Wink Dafür musste ich aber zwecks Rechtschreibfehler mehr editieren^^[/EDIT]


Zuletzt bearbeitet von Mr.X am 21.07.2003, 12:25, insgesamt 12-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 12:13    Titel: Antworten mit Zitat

Du hast die Zeichenkette am Anfang gleich initialisiert, davon wurde aber die ganze Zeit nicht gesprochen. Wenn du das so machst wie in deinem Programm ist das natürlich richtig, weil du ein Array für 10 chars erstellst und 9 Buchstaben plus die binäre Null anhängst(passiert automatisch, da Zeichenkettenkonstanten immer Null-terminiert sind). Du hast nach Arrays ganz allgemein gefragt... probier dein Beispiel mal mit Integers.

Code:

#include <iostream.h>

int main()
{
   int test[5]={1,2,3,4,5};

   int i=0;

   while(test[i]!=0)
      i++;

   cout << "Elemente in test: " << i << endl;

   return 0;
}


Bei mir kam da 14 raus. Sollte bei dir anders sein.

Hast du dir die Buchausschnitte und Mr.X Posts überhaupt durchgelesen?

[EDIT] Mr. X war schneller. ;)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gl_echse
JLI'ler



Anmeldedatum: 01.01.2003
Beiträge: 105

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 13:30    Titel: Antworten mit Zitat

nochmal für alle: bei:
Code:

char *penis = "123";

werden 4 byte reserviert, da man laut definition strings in "" schreibt, und ein string in c mit einem 0 als letztes byte beendet wird, um funktionen wie strlen(), etc. überhaupt möglich ist.
Code:

char penis = "1";

Wäre z.B. auch ein fehler, da bei "" am ende ein 0-byte angehängt wird. Es müsste also heißen
Code:

entweder:
char penis[2] = "1";

oder:
char penis = '1';


z.T. strlen:
strlen lässt den string mit einer for-schleife überprüfen (ab dem einstiegspunkt im speicher, was ja char* aufzeigt) , an welcher stelle d terminierende 0-byte kommt, und kann somit die länge des strings überprüfen. Das von millenium aufgeführte problem zeigt, dass auch z.B. cout die länge eines strings benötigt, und daher strlen() benutzt.

2. man kann per array auch auf nichtdeklarierte elemente zugreifen:

Code:

char penis[10]
//...
penis[20]=//...


da bei einem arry nur auf den anfang des reservierten speichers gezeigt wird, und der typ des inhalts aufgezeigt wird, würde in diesem beispiel penis[20] auf 21byte (21*1byte (wegen char) ) hinter dem anfang von penis zurückgegriffen werden. das ergäbe dann allerdings meistenz eine schutzverletzung Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 13:35    Titel: Antworten mit Zitat

Tja man soll bei der Penislänge halt nicht schummeln.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 14:39    Titel: Antworten mit Zitat

gl_echse hat Folgendes geschrieben:
2. man kann per array auch auf nichtdeklarierte elemente zugreifen:
Code:

char penis[10]
//...
penis[20]=//...

da bei einem arry nur auf den anfang des reservierten speichers gezeigt wird, und der typ des inhalts aufgezeigt wird, würde in diesem beispiel penis[20] auf 21byte (21*1byte (wegen char) ) hinter dem anfang von penis zurückgegriffen werden. das ergäbe dann allerdings meistenz eine schutzverletzung Wink

Wenn Du durch diesen Aufruf den reservierten Heap für Dein Programm überschreitest, dann kommt es zur ominösen Schutzverletzung (Acces Violation), die Dir Dein Betriebssystem, besser gesagt dessen Freispeicherverwaltung, meldet.
Bleibst Du innerhalb des Heaps mit diesem Aufruf, dann kommt zwar keine Acces Violation, allerdings hasst Du entweder im Stack- bzw. Datensegment Deines Heaps ein bis mehrere (kommt auf die Länge in Bytes an) Variablen verändert (eventuell nicht ganz so schlimm, und Dein Programm spuckt nur komische Werte aus), oder aber Du bist damit in das Segment mit dem Programmcode gekommen. Sollte dieser Bereich nun nicht 'read only' sein, dann wird Dein Programm mit Sicherheit entweder nur Mist machen oder gleich aufgeben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 15:36    Titel: Antworten mit Zitat

ok dann kam das wohl nicht so ganz rüber, egal jetzt haben wir das ja geklärt...

jetzt sind wir aber immer noch beim themea: Wie kann man ermitteln, wieviele Elemente ein Array hat oder ist dies unmöglich?
Legt man vielleicht ein zusätzliches Element an, dem man einen bestimmten Wert gibt um zu erkennen, ob man am Ende angelangt ist? Das wäre doch eine Möglichkeit?
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 15:46    Titel: Antworten mit Zitat

TheMillenium hat Folgendes geschrieben:
...Wie kann man ermitteln, wieviele Elemente ein Array hat oder ist dies unmöglich?

Unmöglich zur Laufzeit. Da du aber die Array-Größe bereits zur Kompilierzeit festgelegt haben musst, kennst Du die Array-Größe ja bereits.


TheMillenium hat Folgendes geschrieben:
Legt man vielleicht ein zusätzliches Element an, dem man einen bestimmten Wert gibt um zu erkennen, ob man am Ende angelangt ist? Das wäre doch eine Möglichkeit?

Du solltest Dir die Elementeanzahl in einer extra Variablen speichern. Ein Element im Array selbst ist ungünstig, wenn Du z.B. eine Struktur als Array-Element hast, dann wäre eine Struktur, die das Ende darstellt, Speicherverschwendung. Bedenke aber, im Speicher ist immer das gesamte Array, egal wieviele Elemente Du davon letztendlich wirklich nutzt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nEp
Junior JLI'ler



Anmeldedatum: 03.06.2003
Beiträge: 75

Medaillen: Keine

BeitragVerfasst am: 21.07.2003, 16:26    Titel: Antworten mit Zitat

Mr.X hat Folgendes geschrieben:

NEIN, FALSCH!
sizeof ermittelt die Byte-Länge anhand der Typvereinbarung!!! sizeof liefert keine Länge von irgendwelchen Speicherblöcken! Und so wie Du es gepostet hast, geht es eben nicht, weil Du die Bytelänge des Pointers (== 4Byte) durch die Bytelänge einer Integer-Zahl (== 4Byte) teilst. Und da kommt immer 1 raus, egal wie lang das Array nun wirklich ist!


Ähm und wieso geht das dann bei mir ?? Wenn ich das ausführe sagt er mir, egal welchen Datentyp ich verwende die Größe des Arrays in Elementen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2, 3  Weiter
Seite 2 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum