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:

Warum läuft...

 
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
Pseiko



Anmeldungsdatum: 22.08.2011
Beiträge: 4

BeitragVerfasst am: 22.08.2011, 20:26    Titel: Warum läuft... Antworten mit Zitat

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


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 22.08.2011, 20:50    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.08.2011
Beiträge: 4

BeitragVerfasst am: 22.08.2011, 21:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 22.08.2011, 22:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 22.08.2011, 22:09    Titel: Antworten mit Zitat

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??). lächeln

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



Anmeldungsdatum: 22.08.2011
Beiträge: 4

BeitragVerfasst am: 22.08.2011, 22:24    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 04.07.2011
Beiträge: 44

BeitragVerfasst am: 23.08.2011, 11:46    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.08.2011
Beiträge: 4

BeitragVerfasst am: 23.08.2011, 12:57    Titel: Antworten mit Zitat

Wow, danke für die Mühe!

Werde mich erstmal durchwuseln. Kann mir ja nicht alles vorkauen lassen zwinkern

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



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 23.08.2011, 18:05    Titel: Antworten mit Zitat

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
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