Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Länge eines Arrays

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 < [ 3 ] [ 4 ] [ 5 ]
010
25.07.2003, 08:40 Uhr
ao

(Operator)


Du könntest dir den Speicher auch zur Laufzeit holen, dann hast du dieses Rumgefiddel mit der Stackgröße nicht:

C++:
int main (void)
{
    char * array = malloc (10000000);  /* Speicher anfordern */
    if (NULL == array) /* Nachgucken, obs geklappt hat */
    {
        printf ("Fehler: zuwenig Speicher");
        return 1;
    }

    /* hier die Arbeit tun */

    free (array); /* Speicher loslassen nicht vergessen */
    return 0;
}



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
25.07.2003, 09:34 Uhr
0xdeadbeef
Gott
(Operator)


Ich habs grad mal getestet, bei mir frißt der auch sowas hier:

C++:
main(){char c[2048576];}


Dementsprechend gehe ich davon aus, dass dein Betriebssystem das nicht hinkriegt. Welches Betriebssystem benutzt du?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
25.07.2003, 10:36 Uhr
ao

(Operator)


Ich weiß nicht, was die ganze Aufregung um die Stackgröße soll. Selbst wenn man das char-Array nur benutzt, um die Zahl in ASCII zu speichern und selbst wenn man sich auf die Hälfte dessen beschränkt, was Marian auf den Stack kriegt (also rund ein halbes MB), damit das Programm auch noch ein bißchen Platz zum Laufen hat, kann man damit eine Zahl mit 500.000 Stellen darstellen.

Wenn man mehr Speicher braucht, nimmt man halt malloc

Wie lange braucht dein Computer, um so ein Monster auf prim zu testen?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
25.07.2003, 10:40 Uhr
0xdeadbeef
Gott
(Operator)


Hm. Gängige Primzahl-Prüfalgorithmen skalieren linear. Wenn wir also annehmen, dass eine Zahl mit 10000 Stellen ein Jahr braucht, wären das 10^490000 Jahre, plus/minus ein paar hundert Größenordnungen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 25.07.2003 um 10:40 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
25.07.2003, 13:02 Uhr
~Marian
Gast


@0xdeadbeef: Ich benutze Windows ME (am anfang schnell. Mit der Zeit aber sch****)

@ao: Wo reserviert denn malloc und realloc den Speicher? Ich dachte das wäre der Stack. Kommt es dann nicht wieder irgendwann zu einem Overflow? Ich glaube ich muss mich unbedingt mehr mit Registern und dem ganzen Kram beschäftigen...

@ao & 0xdeadbeef: "Mein" System (im Grunde ist es von meinem Vater, aber der kann nicht programmieren) muss nicht alle Zahlen auf Primzahlen testen. Bei den meisten kann er schon von vornherein sagen, dass muss eine Primzahl sein oder die Zahlen von da bis da brauch ich erst gar nicht prüfen, weil es sowieso keine sind. Auf diese Art und Weise umgehe ich gerade in den großen Zahlen einige Fälle und bin damit auch einiges schneller!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
25.07.2003, 13:39 Uhr
0xdeadbeef
Gott
(Operator)


Stimmt natürlich, der Algorithmus skaliert linear mit der Größe des kleinsten Primfaktors, und die steigt natürlich nicht linear. Ich war grad irgendwie noch bei Primfaktorzerlegung, mein Fehler. Wenn du allerdings das Pech haben solltest, eine 500.000 Stellen lange Primzahl zu überprüfen, dauert das so gut wie ewig. Übrigens dürften bei derart langen Zahlen selbst die Grundrechenarten ne ganze Weile dauern.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
25.07.2003, 14:28 Uhr
ao

(Operator)



Zitat:
~Marian postete
@0xdeadbeef: Ich benutze Windows ME (am anfang schnell. Mit der Zeit aber sch****)


Meinst du damit, wenn es einen Tag lang läuft, ist es langsamer als wenn es frisch gebootet ist?

jetzt hör ich euch schon wieder geiern: "Windows ME einen ganzen Tag lang laufen lassen??? Buaahaaahaaa, der glaubt wohl auch an den Osterhasen!"

Im Ernst, wenn die Geschwindigkeit nachläßt, kann das an einem Speicherleck liegen, und bei so was fällt mein erster Verdacht auf Applikationen, nicht aufs Betriebssystem. Ich habe schon ewig nicht mehr vor einem 9x- oder ME-System gesessen, gibts da eigentlich auch einen Taskmanager, der den Speicherverbrauch anzeigen kann? Solltest du mal prüfen.


Zitat:

@ao: Wo reserviert denn malloc und realloc den Speicher? Ich dachte das wäre der Stack. Kommt es dann nicht wieder irgendwann zu einem Overflow? Ich glaube ich muss mich unbedingt mehr mit Registern und dem ganzen Kram beschäftigen...



Nein, auf dem Stack liegen nur die lokalen Objekte:

C++:
int glob;
void bla (int x, float y)
{
    int a;
    char name [64];
    char *dynamicname = malloc [1000];
}


Hier liegen x, y, a und name auf dem Stack. Der Compiler kann sie auch in Registern halten, muß er aber nicht, und das ist für dich auch nicht unterscheidbar. Stackvariablen werden beim Betreten der Funktion angelegt und beim Verlassen nach außen (d.h. per return) automatisch wieder zerstört. Ein Aufrufen innerer Funktionen gilt hier nicht als Verlassen; die Stackvariablen überdauern das und sind nach der Rückkehr aus der inneren Funktion noch gültig.

glob liegt im globalen Datensegment und der Speicher, auf den dynamicname zeigt, befindet sich auf dem Heap (dem Speichervorrat, den das Betriebssystem verwaltet). dynamicname selbst ist lokal und liegt damit ebenfalls auf dem Stack.

Globale Daten leben so lange, wie das Programm läuft und werden von der Laufzeitumgebung spätestens bis zum Betreten von main angelegt und frühestens nach dem Verlassen von main aufgeräumt. Heapvariablen bleiben solange gültig, bis sie vom Programm explizit freigegeben werden (mit free(), wenn der Speicher mit malloc geholt wurde, und mit delete, wenn er mit new geholt wurde). Wenn das Programm das vergißt, bleibt der Speicher zugewiesen und ist verloren.

Manche Betriebssysteme (auch Windows, soweit ich weiß) geben beim Beenden eines Programms allen Speicher frei, den dieses noch belegt hatte, räumen also hinter dem Programm auf. Aber darauf darf man sich als Programmierer nicht verlassen; das Vergessen von free ist in jedem Fall ein Programmierfehler.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
25.07.2003, 18:32 Uhr
~Marian
Gast


Wow...
1. Danke. Jetzt habe ich endlich mal kappiert, was es mit dem Stack auf sich hat und wenn ich es so überdenke ist es sogar logisch!

2. Das mit der Reservierung von Speicher ist ja ganz schön derb. Ich hoffe ich habe es nicht zu oft vergessen (man soll sich ja nicht auf Windows verlassen). Wie lange bleibt der Speicher denn verloren? Ist er nach einem reboot wieder frei oder für wirklich ewig verloren?

3. Was ME angeht. Es wird von Tag zu Tag langsamer und ich schalte den Computer öftere Male an und aus. Nach defragmentieren wird er natürlich wieder etwas schneller, aber der Müllt sich so schnell wieder zu! Es ist wirklich nicht mehr schön. Aber als ich das System neu draufgespielt hatte und alles eingerichtet hatte, war es wirklich godlike.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
25.07.2003, 19:44 Uhr
0xdeadbeef
Gott
(Operator)


Ich bin der Meinung, dass so ziemlich alle Betriebssysteme hinter dem Programm aufräumen - oder vielmehr die Speicherpages als freigegeben betrachtet und sie nachher einem anderen Programm zuteilt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
25.07.2003, 20:09 Uhr
virtual
Sexiest Bit alive
(Operator)


@deadbeef
das ist ja auch der Grund, weshalb Speicherlöcher von vielen als ein Kavaliersdelikt angesehen werden. Wenn man diese Leute dann Demons (oder unter Windows Services) schreiben läßt, hat man die Kacke am Dampfen.
--
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 < [ 3 ] [ 4 ] [ 5 ]     [ 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: