New String

  • VB.NET
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Hallo, mein Problem:

    dim satz as string=""
    dim a as integer=?

    satz=new string ("9", a)

    Meine Frage ist, wie groß darf a sein?
    Bekomme bei a= 5 000 000 Exception, dabei wird im Konstruktor Integer-Wert verlangt und so nehme ich an, bis a= 2 147 483 647 gehen zu dürfen?

    schönen Sonntag

    hybernate5
    Das ist komisch, weil die nicht angegeben ist (s. msdn.microsoft.com/de-de/library/xsa4321w(v=vs.110).aspx)
    Und reproduzieren kann ich die leider auch nicht :/ (bzw. es geht bei mir problemlos)

    Hast du evtl. nicht genug RAM (auch wenn dann eig. eine OutOfMemory kommen sollte)?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ichduersie“ ()

    @hybernate5 Ich hab das eben mal probiert, mit 5Millionen funktioniert das problemlos. W10, VS2013 Ultimate, x86, x64.
    Bei MaxInt - 1 knallt es:
    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!
    ich schaffe es bis a=551 000 000, höher gehts nicht.
    Brauche allerdings zumindest a=722 000 000...?
    Voller Integerwert wäre natürlich noch besser.
    Mein Fehler: versuchte es in eine TextBox zu laden
    In String gehts eben wie oben beschrieben, leider aber nicht mehr.
    Suche andere Wege.

    Danke

    hybernate5
    Mal 'ne Frage:
    Wofür brauchst Du 'nen String, der 2^31 Zeichen = 4 Gigabyte groß ist?
    Sowas kannst Du doch keinem User anzeigen! Wie soll sich der User bei dem Haufen an Text zurechtfinden? Davon abgesehen wird die TextBox vorher den Geist aufgeben.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    TextBox hab ich dummerweise eingeschaltet, um zu sehen, ob der Befehl auch was rauswirft.
    Ist mir jetzt klar, dass es nicht geht. Unsinn, brauche auch ich nicht.

    Außerdem StringBuilder ist nicht viel besser- nur in großen Schleifen!

    Arbeite intern nur mit Strings und brauche deshalb keine Ausgabe.

    Wozu? Verarbeite intern sehr lange Periodische zahlen: z.B. Perioden der Länge von vielen tausenden Nachkomma-Zahlen (aber alles verschiedene Ziffern- also nicht alles 9 oder so)
    Es gibt eben bei der Division solch lange Perioden. Und daraus mache ich Brüche, damits erstens alles kompakter und zweitens auch nach Möglichkeit genau wird.
    1/3 ist genau, nicht aber 0,33333333333333333333333333333
    So hat z.B.: 123456/36548 Periode der Länge 9137
    oder
    123456/36548932 Periode von 47124 Zahlen.
    Da es für solche Scherze keine Variablen gibt, muss ich alles in Strings rechnen.
    Und so kam ich an eine Grenze, die eben dieses Problem mit sich brachte.

    Wünsche noch eine gute Nacht, und danke für die Hilfe.

    hybernate5
    Es gibt BigInteger, außerdem kannst du die Brüche kürzen, dadurch kannst du dann immer ein exaktes Ergebnis halten und eventuelle Perioden ebenfalls berechnen, indem du die Division selbst machst.

    Außerdem ist der StringBuilder bereits bei relativ wenig Operationen schneller, es sei denn du allokierst den Kompletten Zielstring driekt und arbeitest von dort an mit Offsets oder gar pointern...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Guten Morgen,

    danke, jvbsl@, für deinen Tipp, aber durch Kürzen liegst du weiterhin auf der Symmetrieachse der Division und somit ändert es nichts am Ergebnis, damit auch nichts an den Perioden.
    Hab einfach was herausgegriffen als Beispiel, da es sowieso keinen Einfluss auf das Ergebnis hat.

    Ich hab anderen Weg gefunden - damit hat sich die Problematik erledigt.

    Nur eine Kostprobe will ich nicht vorenthalten. Wie rel. kleine Zahlen Riesen-Perioden schaffen (s.Anhang, falls ich die txt_Datei hochgeladen bekomme)
    Danke allen für die Hilfestellungen und wünsche noch aus dem veregneten heutigen Tag das Beste zu machen.

    hybernate5
    Dateien
    • Perioden.txt

      (47,36 kB, 169 mal heruntergeladen, zuletzt: )

    hybernate5 schrieb:

    muss ich alles in Strings rechnen.
    Du solltest lieber mit Byte rechnen, das nimmt nur ein Byte pro Zeichen weg und die Ziffern (0 bis 9) kannst Du dort reinpacken und auslesen ohne sie konvertieren zu müssen, was etwas Performance bringt. 8o
    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!
    Wenn es tatsächlich nur darum geht nur diese Brüche möglichst genau auszurechnen und das Ergebnis nicht weiter verrechnet werden soll, dann solltest du die "long-division" nehmen.
    Bedeutet quasi du implementierst das schriftliche dividieren wie du es in der Schule gemacht hast. Keine Ahnung wie deine aktuelle Implementierung aussieht.
    Das dürfte dabei helfen: msdn.microsoft.com/en-us/libra…ger.divrem(v=vs.110).aspx

    Diese Art der Berechnung ist eventuell nicht die optimalste aber aufjedenfall die einfachste und hab ich jetzt beim Suchen auch oft als gezeigte Lösung gesehen.

    BigInteger ist sogesehen unbegrenzt groß, hält die Daten als bytes(somit relativ klein) und kann vorallem damit relativ optimiert rechnen.
    Du kannst dir ja einen Datentyp schreiben, der aus zwei BigIntegern eine Decimalzahl macht einer für den ganzen Part und einer für den Dezimalteil.
    Edit: dabei darfst du natürlich nicht vergessen, dass du die Anzahl der führenden Nullen des Dezimalteils auch abspeichern musst.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---