Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Arrays und Dos

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
10.11.2003, 23:27 Uhr
~landus
Gast


Hallo,

ich habe eine Frage zu Arrays unter Dos.
Unter 32Bit Sytemen ist die Grösse eines Arrays ja nur durch des Speichers begrenzt...

Wie ist das bei Dos? Also wenn ich ein int Array[2000]
anlege bekomme ich zwar vom compiler keinen Fehlér aber
da steht dann nur "müll" drin. Ein int Array[1000] macht dagegen keine probleme. Compilire ich das für 32bit gibts bei 2000 keine Fehler:

Also konkret ist beim compiler für 16bit die Arraygrösse begrenzt?

Danke

landus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.11.2003, 23:55 Uhr
Hans
Library Walker
(Operator)



Zitat:
~landus postete
Hallo,

ich habe eine Frage zu Arrays unter Dos.
Unter 32Bit Sytemen ist die Grösse eines Arrays ja nur durch des Speichers begrenzt...

Wie ist das bei Dos? Also wenn ich ein int Array[2000]
anlege bekomme ich zwar vom compiler keinen Fehlér aber
da steht dann nur "müll" drin. Ein int Array[1000] macht dagegen keine probleme.


Ob in dem Array Müll drin steht oder nicht, hängt nicht von der Grösse ab, sondern davon, ob Du es initialisierst oder nicht. Das macht der Compiler nämlich nicht. Nehmen wir also mal an, das Programm sieht etwa so aus
C++:
#include <stdio.h>

int main()
{
  int t, array[1000];

  for(t=0; t<1000; t++)
     printf ("%d\n", array[t]);

  return 0;
}



Wenn Du dieses Programm so ablaufen lässt, liefert es Dir auch nur Müll, weil in dem Array irgendwas drin steht, das noch keinerlei Bedeutung hat. Eben das, was dort im Speicher steht, wo der Compiler das Array hingelegt hat.
Wenn Du da einen sinnvollen Inhalt drin haben willst, musst Du es vorher initialisieren, d.h. mit Inhalt füllen, der für den weiteren Gebrauch einen Sinn ergibt. In der regel schreibt man dazu lauter Nullen darein, also so:

C++:
#include <stdio.h>

int main()
{
  int t, array[1000];

  for(t=0; t<1000; t++)   /* Array initialisieren; hier mit Nullen füllen */
     array[t] = 0;

  for(t=0; t<1000; t++)
     printf ("%d\n", array[t]);

  return 0;
}


So liefert Dir das Programm 1000 Nullen. Und für weiteren Gebrauch hat das Array einen definierten Inhalt.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.11.2003, 00:01 Uhr
Pablo
Supertux
(Operator)


Ganz genau, wenn du int a; hast, dann hat a nicht den Wert 0 sondern irgendeinen Wert. Ich glaube, das ist die Adresse, weiß ich aber in Wirklichkeit nicht (also @virtual, @beefy nicht hauen! ) . Du musst dann die Variable initialisieren. Das ist typischer Anfänger Fehler, weil man von anderen Sprachen gewönht ist, die Variable nicht zu initialisieren (bsp: VB)
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 11.11.2003 um 00:01 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.11.2003, 00:24 Uhr
Hans
Library Walker
(Operator)



Zitat:
Pablo Yanez Trujillo postete
Ganz genau, wenn du int a; hast, dann hat a nicht den Wert 0 sondern irgendeinen Wert. Ich glaube, das ist die Adresse, weiß ich aber in Wirklichkeit nicht

Hi Pablo,
es ist, wie Du zuerst geschrieben hast: irgendein Wert. Wenn an der Stelle zuvor ein Bild im Speicher lag, sind es Bytes dieses Bildes. Lag dort vorher ein Text, sind es ASCII-Codes, die jetzt als int interpretiert werden. War dort vorher ein Programm, so sind es Teile des Programmcodes, die jetzt als int interpretiert werden. Also wie man sieht, kann es alles Mögliche sein, nur meisst nichts Sinnvolles!

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.11.2003, 09:20 Uhr
ao

(Operator)



Zitat:
~landus postete
Also konkret ist beim compiler für 16bit die Arraygrösse begrenzt?



Die 16-Bit-Compiler, die ich von früher kenne (ja, ja, damals), hatten verschiedene "Speichermodelle". Es gab "near" und "far" Daten, und meistens auch "huge". Die Größenbegrenzungen sind (AFAIR):

near: 64 KB für alle Variablen zusammen (1 Datensegment für das ganze Programm)
far: 64 KB pro Variable (also 64 K pro Array)
huge: 2 GB insgesamt.

In der Verarbeitung sind near-Daten am schnellsten und huge-Daten am langsamsten.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.11.2003, 10:20 Uhr
~landus
Gast


Erstmal danke für die vielen Antworten!

also das mit dem Initialisieren ist mir klar, hab ich auch gemacht.
Also ich habe jetzt durch Probieren rausgefunden, dass die "magische" Grenze bei 1999 liegt. Zur Info ich benutze Borland 4.0 -> is alt aber geht nicht anders... Und das ganze muss ich für dos compilieren also als 16bit Anwendung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.11.2003, 10:24 Uhr
virtual
Sexiest Bit alive
(Operator)


Bei mir liegt die "magische" Grenze bei 0, bei anderen möglicherweise bei 4711. Hans hat doch schon dargestellt, daß es keine magische, sondern eine zufällige Grenze ist. Die mag auf Deinem Rechner, bei Deinem Programm, bei Deinem Compiler und Deiner Installation immer die gleiche sein, aber sie ist in keiner weise übertragbar auf andere.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.11.2003, 10:36 Uhr
~landus
Gast


@ virtual ich hab doch geschriebe, dass ich das array vorher mit 0 vorinitialisiere, dann darf doch nix anderes drinn stehen oder verstehe ich das jetzt falsch...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.11.2003, 11:18 Uhr
ao

(Operator)


landus, ich verstehe dich nicht. Erklär mal genauer: Welches Problem macht ein int array[2000], das ein int array[1000] nicht macht? Zeig deinen Code und beschreibe, was passiert.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.11.2003, 11:19 Uhr
virtual
Sexiest Bit alive
(Operator)


Sorry, hast nix falsch verstanden:
Die magische Grenze dürfte in diesem Fall genau daher kommen, daß Dein Segement zu klein wird, um die 2000 Werte aufzunehmen. Ich habe mich seit Jahren nicht mehr mit DOS auseinandergesetzt, kann Dir da eigentlich nicht mehr zu sagen, als ao.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: