Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 09.03.2007, 10:00 Titel: Zugriff auf Structurdeklarationen mittels Pointer |
|
|
Hallo Forum,
habe ein Neuronales Netzwerk und möchte gern objektähnlich auf die Datenstruktur zugreifen nun zu meinem Problem.
Ein Neuron wird folgendermaßen definiert :
Code: | type InputNeuron ' Eingangsneuron
weights(1 to MAX_INPW) as double
outp as double
threshold as double
e as double
end type |
Möchte ich auf diesen Datentyp in folgender Art und Weise,
Code: | dim InputLayer as InputNeuron ptr
InputLayer = Allocate(len(InputNeuron) * MAX_INPUT_VALUES)
InputLayer[0].weights(1) = 0.01
|
zugreifen so stürzt das Programm ab. Wobei FB den Zugriff auf selbstdefinierte Datentypen unterstützt scheint der Zugriff auf Arrays innerhalb dieser Struktur kritisch zu sein. Kennt jemand eine Lösung für dieses Problem ? |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 09.03.2007, 10:22 Titel: |
|
|
1. Nimm ReDim
2. Lass das PTR weg.
Und dann sag mir, obs dann geht... habs bislang nur überflogen. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 09.03.2007, 12:17 Titel: |
|
|
Den einzigen fehler den ich erkennen konnte war, das in einem Type keine variable array declariert werden kann also das MAX_INPW eine coinstante variable oder mit einem festen wert dimensioniert werden muss... _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 09.03.2007, 13:08 Titel: |
|
|
ja, richtig
so sollte es gehen:
Code: | Const As Integer MAX_INPW = 10
Dim As Integer MAX_INPUT_VALUES = 100
Type InputNeuron ' Eingangsneuron
weights(1 To MAX_INPW) As Double
outp As Double
threshold As Double
e As Double
End Type
Dim InputLayer As InputNeuron Ptr
InputLayer = Allocate(Sizeof(InputNeuron) * MAX_INPUT_VALUES)
InputLayer[0].weights(1) = 0.01
? InputLayer[0].weights(1)
Sleep | ('sizeof' oder 'len' ist wurscht)
--------------------------------------
'eine coinstante variable'
entweder eine Konstante oder eine Variable  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 09.03.2007, 13:16 Titel: |
|
|
Zitat: | 'eine coinstante variable' durchgeknallt
entweder eine Konstante oder eine Variable grinsen |
Konstante Variable würde ich als ne Variable deuten, die einmal beschrieben wird und danach nur ausgelesen wird  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 09.03.2007, 13:22 Titel: |
|
|
"Konstante Variable" klingt so wie "wiederbeschreibbare CD-ROM".  |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 09.03.2007, 13:32 Titel: |
|
|
Eternal_pain hat den Fehler ja erkannt, nur so beschrieben...
aber, wer den Schaden angerichtet hat, spottet dann jeder Beschreibung... _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 09.03.2007, 13:35 Titel: |
|
|
*lach* schon gut.. für mich ist alles was einen wert hat auch eine variable, ob diese nun konstant ist oder nicht, im laufe eines programms kann eine variable immer den selben wert haben ohne einmal geändert zu werden ohne eine costante zu sein... aber klingt tatsächlich  _________________
 |
|
Nach oben |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 09.03.2007, 18:14 Titel: |
|
|
Zitat: | Den einzigen fehler den ich erkennen konnte war, das in einem Type keine variable array declariert werden kann also das MAX_INPW eine coinstante variable oder mit einem festen wert dimensioniert werden muss... |
Ganz richtig erkannt MAX_INPW ist eine Konstante, aber die Lösung von Volta stürzt in folgender Form bei mir ab :
Code: | for a=1 to 10
for b=1 to 10
ipl[a].weights(b) = 0.001
next
next
|
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 09.03.2007, 19:11 Titel: |
|
|
Nicht das ich mich besonders im umgang mit pointer verstehe, aber bei meinem versuch kann es nur folgenes sein:
Code: | ipl[a].weights(b) = 0.001 |
Die Variable ipl ist nicht declariert und sollte:
Code: | InputLayer[a].weights(b) = 0.001 |
heissen...
zumindest in diesen Beispielen hier. _________________
 |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 09.03.2007, 19:14 Titel: |
|
|
Es wäre nicht schlecht, wenn man ein kurzes Codebeispiel bekommt, bei dem der Fehler auftritt. Wichtig: Alle Konstanten mit in den Code schreiben, die Wichtig sind. So kann jeder das Problem nachvollziehen. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 10.03.2007, 00:21 Titel: |
|
|
Hi,
was macht ihr hier?
Der Code von volta kombiniert mit den Schleifen von chutullu läuft doch(fast) astrein: Code: | Const As Integer MAX_INPW = 10
Dim As Integer MAX_INPUT_VALUES = 11, a, b
Type InputNeuron ' Eingangsneuron
weights(1 To MAX_INPW) As Double
outp As Double
threshold As Double
e As Double
End Type
Dim InputLayer As InputNeuron Ptr
InputLayer = CAllocate(Sizeof(InputNeuron) * MAX_INPUT_VALUES)
InputLayer[0].weights(1) = 0.01
?Using"#.###";InputLayer[0].weights(1)
for a=1 to 10
?a;" ";
for b=1 to 10
?b;" ";
InputLayer[a].weights(b) = 0.001
?Using"#.###";InputLayer[a].weights(b);
next
?
next
?"Dies Programm l„uft durch, wenn auch mit tlw. unsinnigen Werten.."
?"bei a=10 und MAX_INPUT_VALUES = 10"
?"Dagegen ist bei a=10 und MAX_INPUT_VALUES = 11 wieder alles ok.."
?"Auch die Verwendung von CAllocate() „ndert daran nichts.."
Sleep | ..da stürzt bei FB0.16b nix ab..
..bei mir jedenfalls nicht..
programmierer hat Folgendes geschrieben: | Es wäre nicht schlecht, wenn man ein kurzes Codebeispiel bekommt, bei dem der Fehler auftritt. Wichtig: Alle Konstanten mit in den Code schreiben, die Wichtig sind. So kann jeder das Problem nachvollziehen. | ..soisses..
Und zum Thema Variablen und Konstanten möchte ich noch die Semi-Konstanten hinzufügen
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 10.03.2007, 00:55 Titel: |
|
|
Ich werde mich mal hüten den Code eines funktionierenden Neuronalen Netzes reinzustellen, da ich daran schon zu lange tüftle und mich allein die Auswahl des Lernfaktors und die richtige Anzahl der Neuronen sehr viel Zeit gekostet hat
Warum diese Veränderung ?
Leider bietet FB keinen direkten Objekttype, wobei man entweder auf die für mein Anliegen sehr umständliche Zeigerarithmetik zurückgreifen kann oder sich eines im Speicher "allocierten" Pseudobjektes bedient.
Wobei ich festgestellt habe das der Zugriff in der Art :
Code: | dim tt as integer ptr
tt = allocate (len(integer) * 100)
for a = 1 to 100
tt[a] = a
next a |
schneller ist als
Code: | dim ta(1 to 100) as integer
for a = 1 to 100
ta(a) = a
next a |
was wahrscheinlich daran liegt das FB bei direkten Zeigeroperationen einen schnellern OpCode erstellt. Wobei ich annehme das es an der dynamischen Speicherzuweisung liegen könnt, wahrscheinlich sind die Daten im selben Segment untergebracht was aufwendige Berechnungen zur Adressierung erspart, weiterhin scheint der Compiler einen langsameren OpCode bei Variablen zu erzeugen da Basic eine Declaration nicht zwingend vorschreibt was die Sprache unstrukturiert und offen macht. Es geht im Prinzip um Optimierungsaufgaben. So ist es zum Beispiel interessant die sigmoide Neuronenaktivierungsfunktion
Zitat: | sigmoid = 1 / (1 + exp(-x)) |
in Assembler auszudrücken - danke in diesem Zusammenhang an Voltas Tut über die FPU...
Am Ende des Optimierungsprozesses möchte ich auf diese Datentypen via InlineAssembler zugreifen, wobei ich im Vorfeld mit verschiedenen Zugriffsmethoden auf Structuren herumexperimentiere.
Am Ende möchte ich den Lernprozess des Netzwerkes so weit verbessern das man Rechner nicht tagelang anbleiben muss bis das Netzwerk halbwechs etwas gelernt hat. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 10.03.2007, 01:08 Titel: |
|
|
Es gibt einen guten und verständlichen Grund, wieso die Array zugriffe langsamer sind als die Pointer zugriffe:
Bei den Arrays wird überprüft, ob der index zulässig ist.
Beim Pointer nicht, doch dadurch besteht die Gefahr auf ein Speicherfehler.
Beides hat Vor und Nachteile. Wenn man genau weiß was man macht, dann sind Pointer besser und schneller  _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 10.03.2007, 09:03 Titel: |
|
|
Auf die gefahr hin wieder den Bock zu schiessen
Aber geht ein Programm nicht davon aus das wenn man
Code: | allocate (len(integer) * 100) |
angibt, diese Variable dann nur eine Speicherreservierung von 0-99 hat ?
bei Dim xyz (1 to 100) kann man das ja schön bestimmen, aber bei allocate kann ich das leider nicht erkennen ?! _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 10.03.2007, 11:31 Titel: |
|
|
@Eternal_pain ja, ist für mich auch die einzige Erklärung für die Abstürze.
Obwohl ich selbst bei Überschreibungen der Speichergrenze keinen Absturz produzieren konnte (ME , FB016b)??
Sicherheitshalber:
Code: | InputLayer = Allocate(Sizeof(InputNeuron) * (MAX_INPUT_VALUES + 1))
|
chutullu hat Folgendes geschrieben: | ..Voltas Tut über die FPU... | hat das wirklich einer gelesen?
Schön wenn es geholfen hat.  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 10.03.2007, 12:00 Titel: |
|
|
Naja, das überschreiben des Speicherbereiches muss ja auch nicht zwangsläufig zu einem Absturz führen, aber sinnvoll ist das nicht  _________________
 |
|
Nach oben |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 10.03.2007, 13:53 Titel: |
|
|
Zitat: | diese Variable dann nur eine Speicherreservierung von 0-99 |
Danke, dort liegt der Hund begraben, 0..99 sind ja auch 100. |
|
Nach oben |
|
 |
|