|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
pzktupel
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 30.10.2020, 21:23 Titel: Frage zu Strings |
|
|
Hallo , brauche mal wieder eine Lösung
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 |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 88
|
Verfasst am: 30.10.2020, 22:10 Titel: |
|
|
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 |
|
|
pzktupel
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 31.10.2020, 12:01 Titel: |
|
|
Ach schön und danke !
Das ist schon ausreichend. _________________ Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php |
|
Nach oben |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 88
|
Verfasst am: 02.11.2020, 23:03 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 03.11.2020, 02:10 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 03.11.2020, 18:28 Titel: |
|
|
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 |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 03.11.2020, 23:22 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 03.11.2020, 23:40 Titel: |
|
|
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 |
|
|
|
|
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.
|
|