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:

Such-Algorithmus
Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter
 
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
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 03.09.2014, 14:45    Titel: Pointer auf Elternknoten in jeden Knoten integrieren Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Ich sehe da im Augenblick nur die Möglichkeit, jedem Knoten zusätzlich noch den Pointer seines Vorgängers mitzugeben

Ja, wenn man die Wörter auch "von hinten", also beginnend mit dem letzten Buchstaben abrufen möchte (mit akzeptablem Aufwand), muss man in den Knoten das Elternelement angeben - so ähnlich wie bei einer doppelt verketteten Liste, die man deshalb auch problemlos in beiden Richtungen durchlaufen kann.

Ansonsten könnte man nur den Baum von der Wurzel an absuchen / traversieren (in der richtigen Richtung von vorne) und schauen, wo man den gesuchten Pointer in der Unterelementliste findet. Das wäre aber ziemlich aufwendig. Die Lösung, die du vorschlägst, braucht zwar noch etwas mehr RAM als bisher, wäre aber m. E. das Mittel der Wahl.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 04.09.2014, 11:32    Titel: Antworten mit Zitat

Ich habe es schon ausprobiert, und es funktioniert wunderbar. lächeln Außer dem Elternpointer bekommt der Knoten auch noch seinen eigenen Index mit (auf das eine Byte kommt es jetzt auch nicht mehr an zwinkern ), damit man sofort sehen kann, welchen Buchstaben er repräsentiert. Damit kann man jetzt aus dem Pointer des Endknotens alle Informationen über das Wort ableiten, was die Parameterliste für die Plugins drastisch verkürzt und das Ganze wesentlich übersichtlicher macht.

Außerdem habe ich verwundert festgestellt, daß die Zeile
Code:
node->subNodes(c-skipChars)->index = c-skipChars
nicht nur keine Fehlermeldung erzeugt, sondern auch korrekt arbeitet verwundert

Und dann gleich die nächste Frage: Gibt es eine Möglichkeit, in einer Sub ein ReDim-bares Array statisch anzulegen, also so, daß sich dessen Größe ändern lässt, und daß dessen Inhalt beim Verlassen der Sub erhalten bleibt (wie beim Schlüsselwort "Static")? Ich habe bis jetzt nur entweder das eine oder das andere hinbekommen. Sonst müsste ich entweder ein globales Array anlegen oder einen String dafür zweckentfremden.

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
nemored



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

BeitragVerfasst am: 04.09.2014, 12:27    Titel: Antworten mit Zitat

Du kannst im Hauptprogramm ein dynamisches Array definieren und dieses als Parameter an die SUB übergeben. In der SUB kannst du es dann auch redimensionieren. Allerdings musst du selbst darauf achten, dass das übergebene Array wirklich dynamisch ist - das wird vom Compiler nicht abgefangen.

Code:
sub erweitere(array() as integer)
  redim array(ubound(array)+1)
  array(ubound(array)) = -1
end sub

redim as integer test(5)
erweitere(test())
print ubound(test)
print test(6)

(Das ist vermutlich das, was du mit "globales Array" meinst? Global über SHARED würde ja wohl auch klappen.)

Ansonsten fällt mir noch ein selbstgestrickter ALLOCATE-Speicher ein. Für Zahlenwerte funktioniert der dann schon fast so wie ein Array.
_________________
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: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 05.09.2014, 09:23    Titel: Antworten mit Zitat

Das ist mir schon alles klar. Mein Problem ist folgendes: Durch den rekursiven Aufruf von "traverseTree" wird auch das Auswertungs-Plugin für jeden Knoten einmal aufgerufen (und wieder verlassen). Um überhaupt etwas auswerten zu können, muß es sich die bisherigen Auswertungsergebnisse von einem Aufruf zum nächsten merken können. Daher die Variablendeklaration mit "Static". Das macht auch bei einem Array keine Probleme, solange es eine feste Größe hat. Wenn ich also eine Liste der 20 häufigsten Wörter erstellen will, kann ich schreiben
Code:
Static As tNode Ptr zeiger(21)
Jetzt möchte ich aber eine Liste aller Wörter erstellen, deren Anzahl sich ja bei jedem Durchlauf ändert. Mit
Code:
Static As tNode Ptr zeiger(newWordCount)
bekomme ich eine Fehlermeldung, daß der Compiler eine Konstante erwartet.
Code:
ReDim As tNode Ptr zeiger(newWordCount)
gibt keine Fehlermeldung, aber da habe ich bei jedem Aufruf ein leeres Array (und einen Programmabsturz).

Wenn ich das Array im Hauptprogramm definiere, muß ich es, da es in der (mindestens) 2. Unterprogrammebene aufgerufen wird, in die ohnehin schon recht üppige Parameterliste von "traverseTree" aufnehmen, um es nach unten "durchzureichen", was -wie ich festgestellt habe- zumindest bei dynamischen Arrays das Programm instabil macht. Die Verlaufsdaten für die Graphen habe ich auch wegen ständiger Programmabstürze statt in einem Array in einem String untergebracht.

Am einfachsten wäre es, im Hauptprogramm ein globales Array anzulegen (also mit "Shared"), aber sowas gilt ja in Programmiererkreisen als unfein zwinkern .

Ein völlig anderer Ansatz wäre natürlich... Aber das probiere ich erst mal aus, bevor ich mich darüber auslasse.

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
nemored



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

BeitragVerfasst am: 05.09.2014, 11:38    Titel: Antworten mit Zitat

Und wie sieht es mit meinem (RE)ALLOCATE-Ansatz aus? Einen Pointer zum ALLOCATE-Speicher als STATIC definieren und die Größe des Speichers bei Bedarf mit REALLOCATE anpassen. Ausprobiert habe ich es nicht, aber von der Handhabung funktioniert es dann nahezu wie ein Array.
Also einen Pointer auf eine Pointerliste. Gut, dass ich Pointer so liebe. lachen
_________________
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: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 06.09.2014, 06:34    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Und wie sieht es mit meinem (RE)ALLOCATE-Ansatz aus
Das werde ich als nächstes ausprobieren. Die Vorgehensweise dürfte weitgehend mit meiner bisherigen "String"-Methode übereinstimmen, aber vielleicht ergibt sich ja ein Geschwindigkeitsvorteil. Wenn nicht, fände ich, auch wenn sie nicht ganz im Sinne des Erfinders ist, die String-Methode praktischer, weil ich mich da nicht um die Speicherverwaltung zu kümmern brauche.

Mit dem "völlig anderen Ansatz" meinte ich übrigens, "traverseTree" in eine Function umzuwandeln, die eine komplette (geordnete) Liste aller Knotenpointer zurückgibt, die dann von einer "normalen" Prozedur (also kein Plugin) oder sogar im Hauptprogramm verarbeitet werden kann. Das funktioniert zwar, ist aber ca. 50% langsamer als das Plugin-Verfahren.

Man könnte natürlich auch versuchen... Ich melde mich wieder. zwinkern

Gruß
grindstone

Ach ja: Du hast recht. Pointer sind klasse! (EDIT: Und widerspenstig!) mit dem Kopf durch die Mauer wollen
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!


Zuletzt bearbeitet von grindstone am 07.09.2014, 11:30, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 06.09.2014, 15:54    Titel: Antworten mit Zitat

Ich hätte da einen etwas anderen Ansatz.

Definition eines "Adaptive Bitmask Trie Node" :
Code:

Type Bitmask
   bitfield(any) as ULongInt
End Type

Type ABTrie
   subnodes as Integer        'Anzahl der Unterknoten
   count as UInteger           
   Union
     pMask as Bitmask Ptr   
     mask as ULongInt
   End Union
   subnode(any) as ABTrie Ptr
End Type




- Sortierte Symboltabelle anlegen. Alle verschiedenen Zeichen eines Textes finden und nach deren Anzahl sortieren. Das sind z.B. bei der deutschen Wikipedia ~2000 unterschiedliche Zeichen. Die Position im sortierten Array entspricht dann dem Index.
- im subnode array werden nur Knoten angelegt die tatsächlich genutzt werden. Man überprüft also in der Bitmaske ob der Knoten schon verhanden ist. Wenn ja scannt man also die Bitmaske mit BitScanForward und zählt die gesetzten Bits. Damit hat man den Index für subnode(...).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 07.09.2014, 11:27    Titel: Antworten mit Zitat

Klär mich auf:
Was genau meinst du mit "Zeichen"?
Und welchen Sinn hat ein Type mit nur einem Record?

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
Input



Anmeldungsdatum: 28.07.2014
Beiträge: 59

BeitragVerfasst am: 07.09.2014, 22:44    Titel: Antworten mit Zitat

Hallo liebes Forum. Hab da mal wieder ein Problem; muss aber zugeben, dass ich da noch nicht so den Doktor gemacht habe. Ich habe etwas mit dem Arrey gespielt, doch bleibt das einfach immer hängen:
Code:

'erstellt arrey und variablen
dim as integer feld=10^7,i,j,anfang,ende,zahl
redim as integer wert(feld)
redim as string index(feld)
dim as string suche,text,wort

'liest text ein
Open "Finden.txt" For Binary Access Read As #1
line input #1,text
close

'liest wort ein
do
if anfang>=len(text) or ende>=len(text) then exit do
do
anfang+=1
loop until mid(text,anfang,1)=space(1) or anfang>=len(text)

ende=anfang+1
do
ende+=1
loop until mid(text,ende,1)=space(1) or ende>=len(text)
wort=lcase(mid(text,anfang,ende-anfang))

'schreibt wort in arrey
for i=0 to feld
if index(i)=wort then
wert(i)+=1
exit for
end if

if wert(i)=0 then
index(i)=wort
end if
next i
zahl+=1
loop

'sortiert arrey
for i=0 to feld
for j=10^5 to 0 step -1
if j=wert(i) then
print index(i)
end if
next j
next i
print zahl
sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 08.09.2014, 11:53    Titel: Antworten mit Zitat

Hallo Input!

Zitat:
...muss aber zugeben, dass ich da noch nicht so den Doktor gemacht habe.
Dann wollen wir deiner Bildung mal auf die Sprünge helfen! zwinkern

In dem Programm stecken mehrere Fehler.

1. Fehler: Um den Wortanfang zu finden, mußt du nicht auf "gleich Trennzeichen", sondern auf "ungleich Trennzeichen" prüfen, du möchtest ja den ersten Buchstaben finden.
Code:
Loop Until (Mid(text,anfang,1)<>Space(1)) Or anfang>=Len(text)


2. Fehler: Nachdem du das Wort isoliert hast, mußt du für die nächste Suche den "anfang"-Zeiger nachziehen, sonst fängt das Programm wieder bei dem alten Wort an zu suchen.
Code:
wort=LCase(Mid(text,anfang,ende-anfang))
anfang = ende '<<< Zeile einfügen


3. Fehler: Damit die Zerlegung korrekt funktioniert, muß der Eingangstext mit einem Trennzeichen enden. Das kannst du durch ein zusätzliches
Code:
text += " "
vor der Do-Schleife sicherstellen.

4. Fehler: Die Schleife, die das Wort in das Array einfügt, ist nicht ganz komplett:
Code:
'schreibt wort in arrey
   For i=0 To feld
      If index(i)=wort Then
         wert(i)+=1
         Exit For
      End If

      If wert(i)=0 Then
         index(i)=wort
         wert(i)=1 '<<< Zeile einfügen
         Exit For '<<< Zeile einfügen
      End If
   Next i


5. Fehler: Dein Sortieralgorithmus ist nur eine recht umständliche Methode, das Array in der Reihenfolge auszudrucken, in der es sowieso schon existiert. Wenn du es schon auf diese etwas eigenwillige Art machen willst, dann so:
Code:
'sortiert arrey
For j=10^5 To 0 Step -1
   For i=0 To feld
      If j=wert(i) Then
         Print index(i);" ";wert(i)
      End If
   Next
Next


Viel Spaß beim weiteren Herumspielen. lächeln

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
Input



Anmeldungsdatum: 28.07.2014
Beiträge: 59

BeitragVerfasst am: 08.09.2014, 12:44    Titel: Antworten mit Zitat

Vielen Dank; werd heut Abend oder morgen mal wieder etwas zu basteln haben. mit den Augen rollen Hoffe, dass es klappt; doch du erklärst mir das so sehr gut. Chapeau!! zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Input



Anmeldungsdatum: 28.07.2014
Beiträge: 59

BeitragVerfasst am: 09.09.2014, 22:32    Titel: Antworten mit Zitat

So, hab's geschafft:
Code:

dim as integer feld=10^7,i,j,anfang,ende,zahl
redim as integer wert(feld)
redim as string index(feld)
dim as string suche,text,wort

Open "Finden.txt" For Binary Access Read As #1
line input #1,text
close
text += " "

do
if anfang>=len(text) or ende>=len(text) then exit do
do
anfang+=1
Loop Until Mid(text,anfang,1)<>Space(1) Or anfang>=Len(text) or _
mid(text,anfang,1)<chr(65) or mid(text,anfang,1)>chr(122) or _
mid(text,anfang,1)=chr(91) or mid(text,anfang,1)=chr(92) or _
mid(text,anfang,1)=chr(93) or mid(text,anfang,1)=chr(94) or _
mid(text,anfang,1)=chr(95) or mid(text,anfang,1)=chr(96)
ende=anfang+1
do
ende+=1
loop until mid(text,ende,1)=space(1) or ende>=len(text) or _
mid(text,ende,1)<chr(65) or mid(text,ende,1)>chr(122) or _
mid(text,ende,1)=chr(91) or mid(text,ende,1)=chr(92) or _
mid(text,ende,1)=chr(93) or mid(text,ende,1)=chr(94) or _
mid(text,ende,1)=chr(95) or mid(text,ende,1)=chr(96)
wort=UCase(Mid(text,anfang,ende-anfang))
anfang=ende

For i=0 To feld
If index(i)=wort Then
wert(i)+=1
zahl+=1
Exit For
End If
If wert(i)=0 Then
index(i)=wort
wert(i)=1
zahl+=1
Exit For
End If
Next
loop

Open "Index.txt" For Output As #1
For j=10^5 To 0 Step -1
For i=0 To feld
if wert(i)=0 then exit for
If j=wert(i) Then Print #1, index(i),wert(i)
Next
Next
print #1,""
print #1,"Worte:  ";zahl
print #1,"Index:  ";i
print #1,"Volumen:";len(text)
print #1,"Schnitt:";fix(len(text)/zahl*100)/100
close
shell "START Notepad.exe Index.txt"
[/code]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 10.09.2014, 11:58    Titel: Antworten mit Zitat

Input hat Folgendes geschrieben:
So, hab's geschafft:
Na ja, fast. Ein paar Unzulänglichkeiten sind noch drin. lächeln

1): Wenn die Suche nach dem Wortanfang bei dir funktioniert, dann nur deshalb, weil die Zeichen, auf die du testest, im Text nicht vorkommen. Du suchst hier nach einem Buchstaben, also mußt du auf ungleich prüfen, nicht auf gleich.

2): Stringfunktionen (Mid, Left, Instr usw.) brauchen sehr viel Rechenzeit, man sollte sie nicht unnötig verwenden. Es ist sehr ineffektiv, ein und dasselbe Zeichen für jede Prüfung erneut aus dem Text zu isolieren. Besser wäre es, dieses Zeichen einmal in eine Variable zu schreiben und dann mit der Variable weiterzuarbeiten. Aber hier geht es noch einfacher, ganz ohne Booleorgie (s.u.).

3): Wenn du dir das Ergebnis im Editor genau ansiehst, wirst du feststellen, daß das Programm am Ende der Liste ein Leerzeichen hineinschmuggelt, das dort nicht hingehört. Entsprechend zeigt auch der Wortzähler ein Wort zuviel an. Die Abbruchbedingung für die Do-Schleife arbeitet also nicht korrekt.

4): Und -wenn ich noch ein bisschen klugscheißen darf- zwinkern am Ende bei der Ausgabe muß es korrekterweise nicht "Worte: " heißen, sondern "Wörter: "

Hier ein Vorschlag für eine korrigierte und optimierte Do-Schleife. Die Zeilen, mit denen man sich die Arbeitsweise ansehen kann, habe ich mal (auskommentiert) dringelassen.

Code:
Const As String buchstabe = "abcdefghijklmnopqrstuvwxyzäöüABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜß"
Do
   Do
      anfang+=1
   Loop Until InStr(buchstabe, Chr(text[anfang-1])) Or anfang>=Len(text)
   If anfang>=Len(text) Then Exit Do
   '?"anfang= ";anfang;
   ende=anfang+1
   Do
      ende+=1
   Loop While InStr(buchstabe, Chr(text[ende-1]))
   '?" ende= ";ende;" ";
   wort=UCase(Mid(text,anfang,ende-anfang))
   anfang=ende

   '?zahl;" *";wort;"*"
   'Sleep
   
   For i=0 To feld
      If index(i)=wort Then
         wert(i)+=1
         zahl+=1
         Exit For
      End If
      If wert(i)=0 Then
         index(i)=wort
         wert(i)=1
         zahl+=1
         Exit For
      End If
   Next
Loop

Wie du siehst, wird hier mit einer Positivliste auf Trennzeichen geprüft: Alles, was nicht in der Liste steht, ist Trennzeichen. Außerdem reicht es -weil das letzte Zeichen des Textes mit Sicherheit ein Trennzeichen ist- wenn man nur bei der Suche nach dem Wortanfang auch auf das Textende prüft.

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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 15.09.2014, 12:23    Titel: Antworten mit Zitat

PREMIERE!

Ich habe es zum erstenmal geschafft, ein FB-Programm durch überschreiten der 2GB - Speichergrenze zum Absturz zu bringen. grinsen Und da das "eigentlich" nicht sein konnte, bin ich bei der Ursachenforschung auf etwas gestoßen, das von allgemeinem Interesse sein könnte:

Wenn man für einen UDT, der einen String enthält, Speicher alloziert hat, reicht es zum Freigeben des Speichers nicht, den UDT zu deallozieren, denn dadurch wird nur der Platz für den Stringdescriptor (12 Bytes) freigegeben, der Speicher für den eigentlichen String bleibt weiter reserviert. Man muß, um den gesamten Speicher freizugeben, vor dem Deallozieren den String auf "leer" setzen, etwa
Code:
myUDT->text = ""

Das wäre vielleicht einen Hinweis in der Befehlsreferenz wert.

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: 16.09.2014, 22:59    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Wenn man für einen UDT, der einen String enthält, Speicher alloziert hat, reicht es zum Freigeben des Speichers nicht, den UDT zu deallozieren, denn dadurch wird nur der Platz für den Stringdescriptor (12 Bytes) freigegeben, der Speicher für den eigentlichen String bleibt weiter reserviert. Man muß, um den gesamten Speicher freizugeben, vor dem Deallozieren den String auf "leer" setzen, etwa
Code:
myUDT->text = ""

Üblicherweise erledigt das der Destructor. Es kommt jedoch darauf an, wie die Allokation bei dir erfolgt. Hier ein kleines Beispiel:
Code:
Type ta
   s As String
   Declare Constructor()
   Declare Destructor()
End Type

Constructor ta()
   Print "Construct ta"
End Constructor

Destructor ta()
   Print "Destruct ta"
End Destructor

Print "Allocate/Deallocate:"
Dim a As ta Ptr
a = Callocate(1, SizeOf(ta))
a->s = "Hallo Welt"
Dim As ZString Ptr az = StrPtr(a->s)
'fb_StrDelete(a->s)
Deallocate a
Print *az


Sleep

Print "New/Delete:"
Dim b As ta Ptr
b = New ta
b->s = "Hallo Welt"
Dim As ZString Ptr bz = StrPtr(b->s)
delete b

Sleep

Wie man sieht wird mit New/Delete der Constructor/Destructor aufgerufen (und der string prointer wäre nicht mehr gültig); mit CAllocate/DeAllocate hingegen wird nur der Speicherbereich allokiert und man muss sich selbst ums aufräumen kümmern.
_________________
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

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

Schon wieder was dazugelernt. happy Danke für die Info.

EDIT: Ich habe Callocate/Deallocate durch New/Delete ersetzt. Funktioniert einwandfrei, ohne explizites Aufräumen. lächeln

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
Input



Anmeldungsdatum: 28.07.2014
Beiträge: 59

BeitragVerfasst am: 05.10.2014, 05:00    Titel: Antworten mit Zitat

Würde Wiki gern mal dem "Benford-Gesetz-Test" unterziehen, weiss aber leider nicht, wie man das bei diesem Programm macht. Vielen Dank!! zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 12.10.2014, 09:56    Titel: Antworten mit Zitat

Interessante Anwendung!

Bitte noch etwas Geduld, ich bin gerade dabei, aus dem Programm ein einfach anzuwendendes, universelles und schnelles Analysetool (so zumindest die Zielsetzung zwinkern ) zu basteln. Ein Anwender soll das Programm benutzen können, ohne die inzwischen doch recht komplexen Sortieralgorithmen verstehen zu müssen.

Bis es soweit ist, muß ich noch einige Pointer bändigen und mir ein Konzept für eine universelle und einfach zu benutzende graphische Darstellung überlegen.

Für Neugierige habe ich mal meine aktuelle Arbeitsversion hochgeladen. Aber bitte keine überzogenen Erwartungen, es ist bestenfalls eine frühe Alphaversion mit reichlich Testzeilen, inkonsequenter Variablenbenennung und Prozedurleichen. zwinkern Und wenn jemandem außer alphabetisch, nach Häufigkeit und nach Länge noch ein weiteres (sinnvolles) Sortierkriterium einfällt: Bitte melden!

@Input:
Wenn du den Benford-Test auf eigene Faust versuchen möchtest, kannst du den Positiv-String am Anfang des Programms durch
Code:
Const textChars = "1234567890"
ersetzen, so daß das Programm nur Zahlen ausfiltert, dir davon eine nach Häufigkeit sortierte Liste ausgeben lassen (Taste 3) und... ja, das weitere Vorgehen bleibt dir überlassen.

Wenn du die Liste der Zahlen in eine Datei schreiben möchtest, kannst du folgendermaßen vorgehen: Die Programmzeilen zwischen
Code:
Case "d" 'ergebnisse in datei schreiben
und
Code:
Case "c" 'gross- kleinbuchstaben
(~ ab Zeile 611) ersetzt du durch
Code:
makeSortedList(tree(), wordList(),@sortByCount)
Open "benford.txt" For Output As #1
For x As Integer = 1 To UBound(wordList)
   Print #1, x;" ";wordList(x).word,wordList(x).count;" x"
Next
Close #1
ReDim wordList(1)
Ein Druck auf Taste "d" erzeugt dann die entsprechende Datei.

Gruß
grindstone

PS: Die "160" am Anfang der Liste sind wahrscheinlich Folge eines Konvertierungsfehlers.
_________________
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 13.10.2014, 11:21    Titel: Antworten mit Zitat

Ich habe von dem Programm mal eine Benford-Version erstellt.

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
Input



Anmeldungsdatum: 28.07.2014
Beiträge: 59

BeitragVerfasst am: 13.10.2014, 19:17    Titel: Antworten mit Zitat

Ist ja ganz interessant; aber deine Steuerrechnung ist das auch nicht!! Die 5 sticht jedenfalls raus. Jedenfalls erst mal nicht schlecht, vielen Dank. zwinkern

Zuletzt bearbeitet von Input am 14.10.2014, 13:05, insgesamt einmal bearbeitet
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
Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter
Seite 4 von 5

 
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