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:

Zugriff auf Structurdeklarationen mittels Pointer

 
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
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 09.03.2007, 10:00    Titel: Zugriff auf Structurdeklarationen mittels Pointer Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 09.03.2007, 10:22    Titel: Antworten mit Zitat

1. Nimm ReDim
2. Lass das PTR weg.

Und dann sag mir, obs dann geht... habs bislang nur überflogen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 09.03.2007, 12:17    Titel: Antworten mit 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...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 09.03.2007, 13:08    Titel: Antworten mit Zitat

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' durchgeknallt
entweder eine Konstante oder eine Variable grinsen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 09.03.2007, 13:16    Titel: Antworten mit Zitat

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 happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 09.03.2007, 13:22    Titel: Antworten mit Zitat

"Konstante Variable" klingt so wie "wiederbeschreibbare CD-ROM". cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 09.03.2007, 13:32    Titel: Antworten mit Zitat

zwinkern Eternal_pain hat den Fehler ja erkannt, nur so durchgeknallt 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 09.03.2007, 13:35    Titel: Antworten mit Zitat

*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 durchgeknallt
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 09.03.2007, 18:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 09.03.2007, 19:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 09.03.2007, 19:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 10.03.2007, 00:21    Titel: Antworten mit Zitat

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 grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 10.03.2007, 00:55    Titel: Antworten mit Zitat

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 grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 10.03.2007, 01:08    Titel: Antworten mit Zitat

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 zwinkern
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 10.03.2007, 09:03    Titel: Antworten mit Zitat

Auf die gefahr hin wieder den Bock zu schiessen grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 10.03.2007, 11:31    Titel: Antworten mit Zitat

@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...
verlegen hat das wirklich einer gelesen?
Schön wenn es geholfen hat. happy
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 10.03.2007, 12:00    Titel: Antworten mit Zitat

Naja, das überschreiben des Speicherbereiches muss ja auch nicht zwangsläufig zu einem Absturz führen, aber sinnvoll ist das nicht zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 10.03.2007, 13:53    Titel: Antworten mit Zitat

Zitat:
diese Variable dann nur eine Speicherreservierung von 0-99


Danke, dort liegt der Hund begraben, 0..99 sind ja auch 100.
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