Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 20.07.2003, 19:19 Titel: Anzahl der Elemente eines Arrays |
|
|
Kennt einer eine Funktion mit der ich herausfinden kann, wieviele Elemente ein Array hat? _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
offend-r Mini JLI'ler
Anmeldedatum: 20.07.2003 Beiträge: 7
Medaillen: Keine
|
Verfasst am: 20.07.2003, 19:26 Titel: |
|
|
Ich wies nur das Windows bei jeder Array Deklarierung am Ende einen bestimmten wert implementiert, welcher? -> MSDN
Also müsstes du nur alle Elemente durchschauen und bei diesem Wert ist dann das Ende des Arrays erreicht. Eigendlich ist es der Speicherblock nach dem letzten Element des gültigen Bereichs sprich bei
int array[5]; wäre array[5] eben dieser Wert.
Windows weist diesen Wert nämlich deshalb zu da es diesen beim beenden des Programmes diesen prüft und falls er sich änderte eine Fehlermeldung ausgibt. _________________ Alle Kriege enstehe des Geldes willen - Platon |
|
Nach oben |
|
|
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 20.07.2003, 19:55 Titel: |
|
|
so geht das nich. er will ja wahrscheinlich einen "fremden" Array überprüfen. da kennt er das mit "int array[5]" nich. und man kann auch nicht den array durchlaufen, wie soll man wißen wann man stoppt?? der compiler setzt z.B. "[3]" in die adreße
Startwert + 4*sizeof(int)
und sizeof(int) gibt halt die größe eines ints zurück.
was meinst du mit "gültiger bereich" der compiler speichert garnicht wie groß der Array ist, deshalb mus man in schleifen auch aufpaßen das man nicht "über den eigendlichen Array geht".
wenn man schreibt:
int Array[10];
Array[48] = 74;
dan wird halt der werte den Speicher-teilen zugewiesen die sizeof(int)*39 nach dem "gedachten" Array liegen!!!!
das ist ganz interessant... wenn man schreibt:
int Array[1] = {0, 0};
int Array_der_zweite[1] = {0, 0};
Array[2] = 50;
dan hätte THEORETISCH Array_der_zweite[0] den wert 50. aber ob Array_der_zweite auch gleich nach dem ersten angelegt wird is ne andere frage. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 20.07.2003, 20:35 Titel: |
|
|
offend-r hat Folgendes geschrieben: | Eigendlich ist es der Speicherblock nach dem letzten Element des gültigen Bereichs sprich bei
int array[5]; wäre array[5] eben dieser Wert. |
Das stimme aber nicht. array[4] wäre der letzte gültige Wert.
Die Zahl, die man bei der Deklaration eines Arrays angibt, bestimmt die Anzahl der Elemente.
array[0] ist das 1. Element.
array[1] ist das 2. Element.
...
array[4] ist das 5. und somit das letzte Element.
@TheMillenium
Versuchs mal mit strlen(). Vielleicht funzt es - kA. Bei char-Feldern funktioniert es auf jeden Fall.
Sonst könntest du mal probieren(falls das syntaktisch korrekt ist):
Code: | int elemente=sizeof(array)/4; |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 20.07.2003, 20:42 Titel: |
|
|
Code: | int elemente=sizeof(array)/4; |
das stimmt nich. array ist(soviel ich weis)ein zeiger auf das erste element!!!
deshlab kann man ja auch sagen
array(anfang!!)+4*sizeof(int)
also ist demnach "array" lediglich ein Zeiger auf'n int!!! |
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 20.07.2003, 20:48 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: |
Sonst könntest du mal probieren(falls das syntaktisch korrekt ist):
Code: | int elemente=sizeof(array)/4; |
|
Warum durch 4?
und strlen ist leider nur für char felder da...
naja mal weiter in der MSDN schauen... _________________ The source of all power is in its destiny...
Zuletzt bearbeitet von TheMillenium am 20.07.2003, 20:51, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 20.07.2003, 20:50 Titel: |
|
|
TheMillenium hat Folgendes geschrieben: | Warum durch 4? |
Weil ein integer AFAIK 4 Bytes einnimmt. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 20.07.2003, 20:51 Titel: |
|
|
Lord: Bei deiner Rechnung müsste 1 rauskommen. Da ein Pointer 4 Byte hat.
TheMillenium: Ich kann dir da nur STL Vektoren empfehlen(::size()). Bei normalen C-Arrays muss man auf die Größe selber aufpassen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
nEp Junior JLI'ler
Anmeldedatum: 03.06.2003 Beiträge: 75
Medaillen: Keine
|
Verfasst am: 20.07.2003, 21:02 Titel: |
|
|
Ok ich bin jetzt schon ziemlich im Suff, aber wo ist das Problem ?!
Für einen int-Array einfach z.B. :
Code: |
#include <iostream>
using namespace std;
int main()
{
int a[10];
cout << "Größe des Arrays: " << (sizeof(a) / sizeof(int)) << "\n";
return 0;
}
|
hab mehr getrunken, und es geht immer noch.. habs gerade in VC gemacht und hat gefunzt
Da hat man die Elementanzahl des Arrays. Und anstatt durch 4 zu teilen, teilt man eben einfach durch sizeof(int), da die Größe eines int von OS zu OS unterschiedlich sein kann.
Zuletzt bearbeitet von nEp am 20.07.2003, 22:24, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 20.07.2003, 21:07 Titel: |
|
|
Hab ich doch schon vorgeschlagen.
Is aber falsch, da wenn du "a" angibst, ein Pointer auf das erste Element zurückgegeben wird^^ _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 20.07.2003, 21:08 Titel: |
|
|
ich hab es schon mal gesagt: "a" ganz ganz allein is nur ein zeiger auf das erste element!!!!! |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 20.07.2003, 21:11 Titel: |
|
|
nEp: Trink noch ein bisschen mehr, dann merkst du, dass es falsch ist. ;) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 20.07.2003, 21:31 Titel: |
|
|
bei char ist das doch so:
char zeichen[10]
dann kann ich doch das ende so prüfen
zeichen[10]==0
==>Ende
das Ende wird da durch ein 0 festgelegt nicht zu verwechseln mit '0'.
geht das auch hier? _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 20.07.2003, 21:48 Titel: |
|
|
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. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 21.07.2003, 07:32 Titel: |
|
|
offend-r hat Folgendes geschrieben: | ...Ich wies nur das Windows bei jeder Array Deklarierung am Ende einen bestimmten wert implementiert, welcher? -> MSDN... |
TheMillenium hat Folgendes geschrieben: | ...bei char ist das doch so:
char zeichen[10]
dann kann ich doch das ende so prüfen
zeichen[10]==0... |
The Lord of Programming hat Folgendes geschrieben: | ...@TheMillenium
Versuchs mal mit strlen(). Vielleicht funzt es - kA. Bei char-Feldern funktioniert es auf jeden Fall.... |
Ich glaube, Ihr bringt hier was gehörig durcheinander. Habt Ihr schonmal was von nullterminierten Strings gehört? Dabei handelt es sich nämlich um ein Char-Array, wo der Inhalt (die Zeichenkette) durch eine NULL ( 0 ) als letztes Element in seiner Länge festgelegt wird. Dies wird aber automatisch von Eurem Compiler erledigt, wenn Ihr eine Zeichenkette in einer Variablen speichert. StrLen() funktioniert auch nur bei Nullterminierten Strings! Übergib mal ein beliebiges Char-Array, wo das letzte Element KEINE Null ist, und schau mal was passiert!
Ihr wollt allerdings die Länge eines beliebigen Arrays! Und bei Arrays egal welchen Typs gibt es keine Endezeichen! Solltet Ihr soetwas wie
das hier probieren:
nigs hat Folgendes geschrieben: | ...int Array[10];
Array[48] = 74; ... |
, dann sollte jeder ordentliche Compiler bereits beim Kompilieren einen Fehler melden.(was MSVC++ schonmal nicht macht!)
Da die Länge eines Arrays immer!!! zur Kompilierzeit bekannt sein muss, verstehe ich nicht, wozu man eine Funktion zur Längenbestimmung braucht, eben weil man sie doch bereits explizit beim Programmieren vereinbaren muss!
Solltest Du allerdings Dein Array zur Laufzeit dynamisch erweitern wollen, dann hat das nixs mehr mit richtigen Arrays im Speicher (denn diese werden in aufeinanderfolgenden Speicherblöcken abgelegt) zu tun, und Du musst selbst für eine ordnungsgemäße Implementation sorgen. Dabei gehört neben der Speicherfreigabe auch eine ordentliche Verwaltung Deines "Arrays" dazu. Und dabei kannst Du die Länge auch gleich mit bestimmen oder abspeichern.
Hazel hat Folgendes geschrieben: | ...Bei normalen C-Arrays muss man auf die Größe selber aufpassen... |
Er sagt es, was Fakt ist!
nigs hat Folgendes geschrieben: | array ist(soviel ich weis)ein zeiger auf das erste element!!! |
Du weist es richtig.
Und genauso dereferenziert das Programm dann die Speicherstelle von der es Lesen soll, denn:
1. Es hat einen Zeiger auf die erste Stelle im Speicher.
2. Es weiss, wieviel Byte eine Stelle des Arrays im Speicher einnimmt (durch Typdeklaration des Arrays).
3. Es kennt den Index, den man ihm übergibt.
Anhand dieser drei Werte kann vom richtigen Speicherplatz gelesen werden.
-->setze Instruction Pointer auf Speicherstelle ( "Arrayanfang==Name" + "Länge des Arraytyps==Typ" * "Index==Feldindex")
Anhand dieser Funktion dürfte auch klar sein, warum Arrays in C immer bei 0 anfangen und nicht bei 1.
Zuletzt bearbeitet von Mr.X am 21.07.2003, 08:59, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
|