 |
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 |
Pseiko
Anmeldungsdatum: 22.08.2011 Beiträge: 4
|
Verfasst am: 22.08.2011, 20:26 Titel: Warum läuft... |
|
|
Hallo,
ich tapse gerade meine 1. Schritte durch die FB-Welt. Prinzipiell hab ich schon etwas Erfahrung was Programmierung angeht, jedoch nicht mit FB (bzw. Basic-Dialekten allgemein). Ich gehe mal davon aus das ich einfach nur total auf dem Schlauch stehe, was das Handling von Funktionen angeht:
Warum läuft:
Code: | #include once "gtk/gtk.bi" 'GTK-Header einbinden
gtk_init (0, 0) 'GTK initiieren
Dim AS GtkWidget ptr win
Declare Function CreateWindow
Function CreateWindow
win = gtk_window_new (GTK_WINDOW_TOPLEVEL)
gtk_window_set_title (GTK_WINDOW (win), "Test")
gtk_widget_show_all (win)
gtk_main()
End Function
CreateWindow() |
laufen im Sinne von: Das Fenster wird angezeigt
und
Code: | #include once "gtk/gtk.bi" 'GTK-Header einbinden
gtk_init (0, 0) 'GTK initiieren
Dim AS GtkWidget ptr win
Declare Function CreateWindow
Function CreateWindow
win = gtk_window_new (GTK_WINDOW_TOPLEVEL)
gtk_window_set_title (GTK_WINDOW (win), "Test")
End Function
CreateWindow()
gtk_widget_show_all (win)
gtk_main() |
nicht? Sprich: Es wird kein Fenster sichtbar.
Nach meinem Verständnis sollte ja von der Reihenfolge der Codezeilen das gleiche passieren. Nur das oben alles in der Funktion steht und unten nicht.
P.S. Das die Funktion im Moment noch keinen Sinn macht ist mir klar. Es macht nur wenig Sinn sie zu erweitern, wenn der "Grundstock" nicht einmal läuft. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 22.08.2011, 20:50 Titel: |
|
|
Hallo und willkommen im Forum!
Man hat ein wenig die Auswahl, wie man den Code anordnen möchte.
Möglichkeit 1:
Code: | <DECLAREs>
<...Hauptprogramm...>
<SUBs/FUNCTIONs> |
Beispiel:
Code: | Declare Function DasDoppelte (ByVal x As Integer) As Integer
Print "Wir verdoppeln!"
Print DasDoppelte(2)
Print DasDoppelte(42)
Sleep
End
Function DasDoppelte (ByVal x As Integer) As Integer
Return 2*x
End Function |
Möglichkeit 2:
Code: | <SUBs/FUNCTIONs>
<...Hauptprogramm...> |
Beispiel:
Code: | Function DasDoppelte (ByVal x As Integer) As Integer
Return 2*x
End Function
Print "Wir verdoppeln!"
Print DasDoppelte(2)
Print DasDoppelte(42)
Sleep
End |
Ich würde eher Variante 1 mit Deklarierung von Funktionsprototypen bevorzugen. Diese könnte man auch in eine BI-Datei auslagern.
Im GTK-Beispiel liegt das Problem vermutlich darin, dass vor und nach der Funktionsimplementierung auszuführender Code steht.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Pseiko
Anmeldungsdatum: 22.08.2011 Beiträge: 4
|
Verfasst am: 22.08.2011, 21:29 Titel: |
|
|
Danke für den Hinweis und die Willkommensgrüße. Im Normalfall verwende ich auch Includes. Habs den Code nur fix zusammengeschoben um mir im Posting 2 Codeboxen sparen zu können.
Der Code funktioniert auf jeden Fall wenn ich folgende 3 Zeilen entweder zusammen in die Funktion packe, oder die Funktion weglasse.
Code: | win = gtk_window_new (GTK_WINDOW_TOPLEVEL)
gtk_window_set_title (GTK_WINDOW (win), "Test")
gtk_widget_show_all (win) |
Ich tue mich noch schwer einfach hinzunehmen das es so ist. Scheinbar gibt es bei den Funktionen irgendetwas, was ich nicht bedenke. Die Reihenfolge stimmt auf jeden Fall.
---
Jetzt bin ich während dem Verfassen des Postings doch noch einer Lösung näher gekommen. Wenn ich win als Shared deklariere funktioniert es auch wenn ich die 3 Codezeilen "zerreiße". Werde mich wohl doch erstmal in die Variablengültigkeit einlesen müssen und "weiter unten" anfangen als ich eigentlich wollte. Bis eben bin ich davon ausgegangen, dass Variablen außerhalb Funktionen automatisch global sind. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.08.2011, 22:01 Titel: |
|
|
Hast du den Compiler auf den Sprachdialekt "deprecated" eingestellt? Im Dialekt "fb" sollte das gar nicht erst passieren können, weil dann die Variable "win" in der funkltion CreateWindow gar nicht deklariert worden wäre. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 22.08.2011, 22:09 Titel: |
|
|
Pseiko hat Folgendes geschrieben: | Wenn ich win als Shared deklariere funktioniert es auch wenn ich die 3 Codezeilen "zerreiße". |
Interessant, dann schluckt der Compiler das ja sogar (mittlerweile??).
Pseiko hat Folgendes geschrieben: | Werde mich wohl doch erstmal in die Variablengültigkeit einlesen müssen [...] Bis eben bin ich davon ausgegangen, dass Variablen außerhalb Funktionen automatisch global sind. |
Das Hauptprogramm, also der Code außerhalb von Unterprogrammen, besitzt einen eigenen, isolierten Scope ähnlich wie ein Unterprogramm. Für globale Variablen kann man, wie schon von dir geschrieben, SHARED verwenden, wobei diese nur im Hauptprogramm deklariert werden können. SHARED innerhalb von Unterprogrammen erzeugt einen Compilezeitfehler. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Pseiko
Anmeldungsdatum: 22.08.2011 Beiträge: 4
|
Verfasst am: 22.08.2011, 22:24 Titel: |
|
|
Jojo hat Folgendes geschrieben: | Hast du den Compiler auf den Sprachdialekt "deprecated" eingestellt? |
Ja, da haste Recht. Direkt mal korrigiert. Hab zwar jetzt direkt mal ein paar Fehler mehr, aber eigne mir zumindest keine "Altlasten" an.
Zitat: | Das Hauptprogramm, also der Code außerhalb von Unterprogrammen, besitzt einen eigenen, isolierten Scope ähnlich wie ein Unterprogramm. |
Das erklärt auf jeden Fall mein "Ur-Problem".
Danke euch beiden, das hat mich auf jeden Fall ein gutes Stück weiter gebracht.
Eine Frage hätte ich noch:
Wie bekomme ich jetzt am geschicktesten einen GtkWidget Ptr an eine Funktion übergeben? Bei Integer und Co empfinde ich das als einleuchtend, da ich nur den Inhalt übergeben muss. Ansonsten müsste ich mit globalen Variablen um mich werfen, was ich gerne vermeiden möchte. |
|
Nach oben |
|
 |
RWK
Anmeldungsdatum: 04.07.2011 Beiträge: 44
|
Verfasst am: 23.08.2011, 11:46 Titel: |
|
|
genauso übergeben wie alles andere auch....
Ich habe bei meinen Versuchen mal ein bissl probiert.... so recht anfreunden kann ich mich aber noch ned damit....ist vielleicht gewöhnungssache :
Code: | #include once "gtk/gtk.bi" 'GTK-Header einbinden
gtk_init (0, 0) 'GTK initiieren
Function CreateWindow as gtkwidget ptr
var mWin = gtk_window_new (GTK_WINDOW_TOPLEVEL)
gtk_window_set_title (GTK_WINDOW (mWin), "GtkTest")
gtk_window_set_default_size( GTK_WINDOW( mwin ), 200, 200 )
return mWin
End Function
sub on_button0_clicked cdecl (byval button as GtkWidget ptr, byval tWidget as GtkTextView ptr)
Dim as GtkTextIter tStart, tEnd
Dim as Gchar ptr text
var buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW( tWidget ) )
gtk_text_buffer_get_start_iter( buffer, @tStart )
gtk_text_buffer_get_end_iter( buffer, @tEnd )
text = gtk_text_buffer_get_text( buffer, @tStart, @tEnd, FALSE )
g_print ( "%s", "Button 0 klick : ")
g_print( "%s", text )
g_print ( "%s", chr(13,10))
end sub
sub on_button1_clicked cdecl (byval button as GtkWidget ptr, byval tWidget as GtkTextView ptr)
Dim as GtkTextIter tStart, tEnd
Dim as Gchar ptr text
var buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW( tWidget ) )
gtk_text_buffer_get_start_iter( buffer, @tStart )
gtk_text_buffer_get_end_iter( buffer, @tEnd )
text = gtk_text_buffer_get_text( buffer, @tStart, @tEnd, FALSE )
text = gtk_text_buffer_get_text( buffer, @tStart, @tEnd, FALSE )
g_print ( "%s", "Button 1 klick : ")
g_print( "%s", text )
g_print ( "%s", chr(13,10))
end sub
sub on_button2_clicked cdecl (byval button as GtkWidget ptr, byval tWidget as GtkTextView ptr)
Dim as GtkTextIter tStart, tEnd
Dim as Gchar ptr text
var buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW( tWidget ) )
gtk_text_buffer_get_start_iter( buffer, @tStart )
gtk_text_buffer_get_end_iter( buffer, @tEnd )
text = gtk_text_buffer_get_text( buffer, @tStart, @tEnd, FALSE )
text = gtk_text_buffer_get_text( buffer, @tStart, @tEnd, FALSE )
g_print ( "%s", "Button 2 klick : ")
g_print( "%s", text )
g_print ( "%s", chr(13,10))
end sub
sub BuildUI (Win as GtkWidget ptr)
gtk_signal_connect( GTK_OBJECT(win), "destroy", GTK_SIGNAL_FUNC(@gtk_main_quit), 0 )
var box1 = gtk_vbox_new( 1, 10 )
gtk_container_add( GTK_CONTAINER(win), box1 )
var box0 = gtk_hbox_new( 1, 0 )
gtk_container_add( GTK_CONTAINER(box1), box0 )
var button0 = gtk_button_new_with_label("Button 0")
gtk_box_pack_start( GTK_BOX(box0), button0, 1, 1, 1 )
var button1 = gtk_button_new_with_label("Button 1")
gtk_box_pack_start( GTK_BOX(box0), button1, 1, 1, 1 )
var button2 = gtk_button_new_with_label("Button 2")
gtk_box_pack_start( GTK_BOX(box0), button2, 1, 1, 1 )
var text0 = gtk_text_view_new( )
gtk_box_pack_start( GTK_BOX( box1 ), text0, 1, 1, 0 )
g_signal_connect( G_OBJECT( button0 ), "clicked", _
G_CALLBACK( @on_button0_clicked ), _
text0 )
g_signal_connect( G_OBJECT( button1 ), "clicked", _
G_CALLBACK( @on_button1_clicked ), _
text0 )
g_signal_connect( G_OBJECT( button2 ), "clicked", _
G_CALLBACK( @on_button2_clicked ), _
text0 )
end sub
var win = CreateWindow()
BuildUI(win)
gtk_widget_show_all (win)
gtk_main()
end 0
|
Grüße |
|
Nach oben |
|
 |
Pseiko
Anmeldungsdatum: 22.08.2011 Beiträge: 4
|
Verfasst am: 23.08.2011, 12:57 Titel: |
|
|
Wow, danke für die Mühe!
Werde mich erstmal durchwuseln. Kann mir ja nicht alles vorkauen lassen
Auf jeden Fall danke für die vielen hilfreichen Beiträge. Schön das es noch Foren gibt wo man abseits von RTFM Hilfe bekommt! |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 23.08.2011, 18:05 Titel: |
|
|
Pseiko hat Folgendes geschrieben: | Werde mich wohl doch erstmal in die Variablengültigkeit einlesen müssen und "weiter unten" anfangen als ich eigentlich wollte. Bis eben bin ich davon ausgegangen, dass Variablen außerhalb Funktionen automatisch global sind. | Womit hast du denn bisher programmiert? |
|
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.
|
|