mikrocontroller.net

Forum: PC-Programmierung VB2015 - Array und String - dynamische Länge


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Georg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi Leute!

Ich mache gerade meinen ersten Versuche mit VB und habe eine Frage: Im 
Internet habe ich gelesen, dass es für Arrays den Befehl ReDim gibt, um 
die Größe des Arrays während der Laufzeit zu vergößern. Um den Inhalt zu 
erhalten gibt es zusätzlich Preserve.

Dann gibt es noch die Variable deklariert als String. Hier finde ich 
nirgends etwas über die Notwendigkeit, die Größe der Variable (ist ja 
auch ein Array von Zeichen) zu erhöhen. Hier kann ich beliebig lange 
Zeichenketten zuweisen.

Frage: Wo ist der Unterschied und wie ist es im Speicher organisiert? 
Bei beliebiger Vergrößerung müsste ja quasi jedes Zeichen einen Zeiger 
auf das nächste besitzen.

Weiß jemand Bescheid? Ich finde im Netz keine zufriedenstellende 
Antwort.

Danke!

von Klaus-Kurt Knatter (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gleich vorweg: Ich habe mit VB nichts am Hut.

> Frage: Wo ist der Unterschied und wie ist es im Speicher organisiert?

Ein Array ist in diesem Fall ein einfacher Speicherblock, in dem 
nacheinander (indizierbar) Werte stehen.
ReDim allokiert einen neuen Block und kopiert bei Bedarf Daten aus dem 
alten (Preserve). Das Ganze dient im Prinzip nur der 
Rückwärtskompabilität; in VB.NET sollte man eher die generischen 
Collections verwenden, z.B. List(Of T).

Auch bei einem String wird - wenn der zur Verfügung stehende 
Speicherbereich komplett mit Zeichen belegt ist - ein neuer Block 
allokiert, Daten werden kopiert und der alte Block wird verworfen. Nur 
geschieht dies intern in der String-Klasse, so dass man sich darum nicht 
kümmern muss (ähnlich wie bei 'List'). Es gibt natürlich eine Reserve - 
mehr oder weniger "intelligent" bestimmt; meist wird die Größe des 
Speicherbereichs verdoppelt -, damit nicht bei jedem Hinzufügen eines 
Zeichens Speicher allokiert werden muss.

> Bei beliebiger Vergrößerung müsste ja quasi jedes Zeichen einen Zeiger
> auf das nächste besitzen.

Nicht bei String oder List, aber es gibt die Klasse LinkedList 
(LinkedList(Of T)), bei dies so funktioniert. Der Einsatz ist aber nur 
in speziellen Fällen sinnvoll. Einerseits, weil einige Operationen 
deutlich weniger effizient sind, da man sich ja "durchhangeln" muss, 
andererseits weil die Daten im Speicher verstreut liegen und der 
CPU-Cache das nicht mag (wobei das natürlich bei Referenztypen auch bei 
anderen Datenstrukturen der Fall ist).

https://msdn.microsoft.com/de-de/library/wak0wfyt.aspx
https://msdn.microsoft.com/de-de/library/w8k3cys2.aspx
https://msdn.microsoft.com/de-de/library/he2s3bh7
http://csharpindepth.com/Articles/General/Strings.aspx

von Georg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Klaus!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.