Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Frage zu Strings

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 81

BeitragVerfasst am: 30.10.2020, 20:23    Titel: Frage zu Strings Antworten mit Zitat

Hallo , brauche mal wieder eine Lösung lächeln

Also angenommen, ich habe die Zahlen 101 und 103 und viele Tausend mehr...will diese Zahlen in einem String sammeln und mit einem Schlag abspeichern. Wie geht das, das in der Datei Zeilenweise die Zahlen dann stehen ?

Bsp.
101
103
...
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 84

BeitragVerfasst am: 30.10.2020, 21:10    Titel: Antworten mit Zitat

Ein erster Vorschlag:
Code:
Dim As Ulongint i
Dim As String s

i=101
s=s & Str(i) & Chr(13,10)

i=103
s=s & Str(i) & Chr(13,10)

Print s;

Open (Exepath & "\text.txt") For Output As #1
   Print #1,s;
Close #1

Sleep

Gruß
hhr
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 81

BeitragVerfasst am: 31.10.2020, 11:01    Titel: Antworten mit Zitat

Ach schön und danke !
Das ist schon ausreichend.
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 84

BeitragVerfasst am: 02.11.2020, 22:03    Titel: Antworten mit Zitat

Ausreichend ja, aber die Kurzform der Stringverkettung ist sehr viel schneller. Man kann aber auch Klammern verwenden.
Code:
Dim As Double t
Dim As Uinteger i,j=40000
Dim As String s

s=""
t=Timer
For i=0 To j
   s = s & Str(i) & Chr(13,10)
Next
Print Timer-t,Len(s)

s=""
t=Timer
For i=0 To j
   s &= Str(i) & Chr(13,10)
Next
Print Timer-t,Len(s)

s=""
t=Timer
For i=0 To j
   s = s & (Str(i) & Chr(13,10))
Next
Print Timer-t,Len(s)

Sleep

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 03.11.2020, 01:10    Titel: Antworten mit Zitat

Das ist interessant. Kennt da jemand den technischen Hintergrund? Mit der ersten Variante muss auch für den endgültigen String intern ein gutes Stück mehr Speicher reserviert werden, was mich etwas irritiert, da ich dachte, dass sich der reservierte Speicher immer bei Bedarf um einen festen Faktor vergrößern würde.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 03.11.2020, 17:28    Titel: Antworten mit Zitat

Soweit ich weiss, liegt das daran, daß bei der Kurzform schon von vornherein klar ist, daß einer der Ausdrücke rechts vom Gleichheitszeichen gleich dem Ausdruck links vom Gleichheitszeichen (vor der Operation) ist und somit davon nicht extra eine Kopie erstellt werden muss.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 03.11.2020, 22:22    Titel: Antworten mit Zitat

Code:
uint64 I$0;
FBSTRING S$0;

{
   FBSTRING TMP$4$2;
   FBSTRING TMP$5$2;
   FBSTRING* vr$6 = fb_ULongintToStr( I$0 );
   __builtin_memset( &TMP$4$2, 0, 24ll );
   FBSTRING* vr$10 = fb_StrConcat( &TMP$4$2, (void*)&S$0, -1ll, (void*)vr$6, -1ll );
   __builtin_memset( &TMP$5$2, 0, 24ll );
   FBSTRING* vr$13 = fb_StrConcat( &TMP$5$2, (void*)vr$10, -1ll, (void*)"\x0D\x0A", 3ll );
   FBSTRING* vr$15 = fb_StrAssign( (void*)&S$0, -1ll, (void*)vr$13, -1ll, 0 );
}

{
   FBSTRING* vr$23 = fb_ULongintToStr( I$0 );
   FBSTRING* vr$25 = fb_StrConcatAssign( (void*)&S$0, -1ll, (void*)vr$23, -1ll, 0 );
   FBSTRING* vr$27 = fb_StrConcatAssign( (void*)&S$0, -1ll, (void*)"\x0D\x0A", 3ll, 0 );
}

Obig der Schleifeninhalt ersterer Variante, unten der Schleifeninhalt der 2. und 3. Variante.
Wie man schön sieht werden bei erster Variante temporäre Strings zusammengebaut, bei den anderen beiden direkt der "original"-string aktualisiert, was bei kleinen vergrößerungen, wie in diesem Fall, nur selten zur neu-allokation / datenkopie führt.
Wieso der compiler in der ersten Variante nicht entsprechend optimieren kann, kann ich jedoch nicht ohne weiteres sagen.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 03.11.2020, 22:40    Titel: Antworten mit Zitat

Der String sollte in der ersten Variante vom links nach rechts zusammengefügt werden, womit sich der Compiler möglicherweise bei der Optimierung schwerer tut (zweimalige Erweiterung, bevor die Zuweisung stattfindet). In den anderen beiden Versionen wird der Originalstring nur einmal erweitert. Zumindest kann ich mir das als Grund vorstellen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz