JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=937277dd50f92c793234821e333713b3Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Anzahl der Elemente eines Arrays
Gehe zu Seite 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: 20.07.2003, 19:19    Titel: Anzahl der Elemente eines Arrays Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
offend-r
Mini JLI'ler



Anmeldedatum: 20.07.2003
Beiträge: 7

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 19:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nigs
Super JLI'ler



Anmeldedatum: 19.12.2002
Beiträge: 359

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 19:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 20:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nigs
Super JLI'ler



Anmeldedatum: 19.12.2002
Beiträge: 359

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 20:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TheMillenium
Dark JLI'ler



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

BeitragVerfasst am: 20.07.2003, 20:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 20:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 20:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nEp
Junior JLI'ler



Anmeldedatum: 03.06.2003
Beiträge: 75

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 21:02    Titel: Antworten mit Zitat

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 Razz

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 21:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nigs
Super JLI'ler



Anmeldedatum: 19.12.2002
Beiträge: 359

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 21:08    Titel: Antworten mit Zitat

ich hab es schon mal gesagt: "a" ganz ganz allein is nur ein zeiger auf das erste element!!!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

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

nEp: Trink noch ein bisschen mehr, dann merkst du, dass es falsch ist. ;)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
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: 20.07.2003, 21:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 20.07.2003, 21:48    Titel: Antworten mit Zitat

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
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, 07:32    Titel: Antworten mit Zitat

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
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 1, 2, 3  Weiter
Seite 1 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