Maximaler Wert eines Integers

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von haiyyu.

    Maximaler Wert eines Integers

    Hallo erstmal.
    Ich habe eine eher simple Frage:

    Wie groß ist der maximale Wert eines Integers?

    Ich habe folgende Deklaration:

    VB.NET-Quellcode

    1. Dim inte(1000,1000,128) as integer


    Wenn ich nun die 1000 durch 2000 ersetzte, erhalte ich eine System.OutOfMemoryExeption

    Ich denke, dass es daran liegt, dass der Integer zu viele Dimensionen bzw. Werte enthält.

    Und nun zu meiner Frage: Wie viele Werte kann ein Integer enthalten?
    Ja genau das wollte ich wissen.

    Allerdings stimmt dann meine Rechnung nicht:

    Ich dachte, wenn ich einen Integer mit 1000,1000,128 erstelle, dann hat er 1000x1000x128 (also 128000000) Werte.
    Das ist aber weit unter deinem Wert.

    Stimmt denn meine Rechnung?
    Die Rechnung selbst stimmt schon (Arrays sind auch beim Deklarieren nullbasierend. D.h. es wären also 1001 * 1001 * 129 = 128256128 Einträge vorhanden).
    Das Problem wird allerdings nicht am maximalen Wert eines Integers liegen, sondern an der Anzahl der Einträge im Array.
    Mal angenommen: Inte(1999, 1999, 127). Das wären dann 512000000 Einträge. Ein Integer ist im Normalfall 32 Bit groß, also 4 Byte. Das heißt also pro Integer im Array müssen im Arbeitsspeicher 4 Byte reserviert werden, also insgesammt 2048000000 Byte. Das sind in etwa 2 Gigabyte an Daten. Wenn im Arbeitsspeicher nicht mehr genug frei ist ergibt das eine OutOfMemoryException.

    PS: Wofür braucht man so viele Werte? 8|
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Zuerst: Vielen Dank für deine Hilfen. Daran, dass ein Integer ja noch eine eigene Größe hatte, habe ich gar nicht gedacht.

    Und ich brauche so viele Wete, weil ich verschiedene Informationen für ein dreidimensionales Objekt (das 1000x1000x128 Einheiten mißt) darin speichern will.
    Dieses Objekt ist nicht wirklich dreidimensional, es sollen nur diese Daten gespeichert werden und man soll auch einfach und schnell zugreifen und bearbeiten können (einfach inte(x,y,z) und man hat den Datenwert).
    Diesen Wert kannst Du auch direkt abrufen:

    VB.NET-Quellcode

    1. Dim iMax As Integer = Integer.MaxValue
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, :thumbup:

    Was vieleicht noch möglich wäre ist ein Array einer eigenen Klasse zu erstellen und dann von dem Objekt im Array die Eigenschaften abzufragen.
    Ist aber nur zur Schönheit XD
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Kleine Ergänzung: Arrays sind beim Deklarieren nicht nullbasiert.
    Ein wie folgt deklariertes Array:

    VB.NET-Quellcode

    1. Dim Integers(10) As Integer
    Nimmt im Index 0-9 an.
    Komisch, bei mir nicht.

    Ein Codeschnipsel aus einem Programm das ich gerade geöffnet habe:

    VB.NET-Quellcode

    1. Dim Colors(15) As MineCraftColor
    2. Private Sub Initialize() Handles MyBase.Load
    3. Colors(0) = New MineCraftColor(0, 0, 0) 'Black
    4. Colors(1) = New MineCraftColor(66, 66, 66) 'Gray
    5. Colors(2) = New MineCraftColor(161, 161, 161) 'Light Gray
    6. Colors(3) = New MineCraftColor(255, 255, 255) 'White
    7. Colors(4) = New MineCraftColor(85, 51, 27) 'Brown
    8. Colors(5) = New MineCraftColor(216, 127, 151) 'Light Red
    9. Colors(6) = New MineCraftColor(163, 43, 40) 'Red
    10. Colors(7) = New MineCraftColor(234, 126, 52) 'Orange
    11. Colors(8) = New MineCraftColor(188, 175, 26) 'Yellow
    12. Colors(9) = New MineCraftColor(54, 75, 23) 'Dark Green
    13. Colors(10) = New MineCraftColor(59, 191, 47) 'Green
    14. Colors(11) = New MineCraftColor(37, 111, 144) 'Cyan
    15. Colors(12) = New MineCraftColor(101, 137, 211) 'Light Blue
    16. Colors(13) = New MineCraftColor(37, 49, 151) 'Blue
    17. Colors(14) = New MineCraftColor(128, 54, 194) 'Violet
    18. Colors(15) = New MineCraftColor(192, 75, 203) 'Magenta
    19. 'Hier tritt bei mir ein Fehler auf "IndexOutOfRangeException"
    20. Colors(16) = New MineCraftColor(0, 0, 0)
    21. '----
    22. End Sub
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Danke für die Information, dann kann ich mir ja jetzt ein paar Bytes Speicher sparen.
    Wieder was gelernt.

    Und danke für die Auflistung der Minecraftfarben, die habe ich schon immer gesucht. :P

    APPIX schrieb:


    Und ich brauche so viele Wete, weil ich verschiedene Informationen für ein dreidimensionales Objekt (das 1000x1000x128 Einheiten mißt) darin speichern will.
    Dieses Objekt ist nicht wirklich dreidimensional, es sollen nur diese Daten gespeichert werden und man soll auch einfach und schnell zugreifen und bearbeiten können (einfach inte(x,y,z) und man hat den Datenwert).


    Du brauchst doch bestimmt nicht immer alle Werte. Bzw. es sind nicht immer alle Positionen des Arrays besetzt.
    Das ist nämlich gleich mal ein Nachteil von Arrays, weil sie sofort so viel Speicher brauchen.
    Du kannst aber die letzte der Dimensionen variabel machen, dann musst du halt immer redimen.

    Oder du benutzt ein Dictionary wobei du für den Key einen String verwendest, der sich aus den 3D Koordinaten ergibt.
    Meinetwegen statt inte(945,823,80) dann dic.Item("945|823|80")

    Nur ne Idee.

    haiyyu schrieb:

    Kleine Ergänzung: Arrays sind beim Deklarieren nicht nullbasiert.
    Ein wie folgt deklariertes Array:

    VB.NET-Quellcode

    1. Dim Integers(10) As Integer
    Nimmt im Index 0-9 an.

    In C# ist das so, ja. Allerdings nicht in VB.NET und VB6. Dafür wird VB.NET sogar im WP-Artikel "kritisiert".
    Von meinem iPhone gesendet