[Anfänger] GTK/C - Problem mit Static Char
-
Hallo Leute
Ich habe hier angefangen mit GTK und c zu arbeiten und bin gleich auf ein Problem gestßen.
Ich habe eine App mit zwei Buttons gemacht. Einer startet einen Socket, der andere beendet ihn. Im grunde genommen nichts Großes. Das Problem bei mir liegt aber nun in der Textausgabe. Hab ein Feld erstellt das die vorgänge ausgibt.
http://img222.imageshack.us/img222/1395/aaasey.png <- hier einmal zu sehen.
Das Problem liegt nun bei mir in den zwei Funktionen start-/runSocket.
In der Funktion beschreibt er zwar den Buffer, aber hinterher ist es weider leer. Ist logisch, Funktion beendet, alles weg. Ich habe aber den buffer als static angegeben, aber dennoch verschwindet der buffer.Würde mich über ein wenig hilfe freuen
mfg Akowwps. bitte nicht über den halb fertigen Code wundern. Ich wollte erst die Probleme lösen bevor es weiter geht mit dem sauberen ausarbeiten.
\* File: main.c \* Author: Bash * \* Created on 23. Januar 2011, 11:52 */ #include <gtk/gtk.h> #include <windows.h> #include <string.h> #include <io.h> #include <stdint.h> #include <stdio.h> SOCKET s; **static char buff[35];** int i; int winSocket (void); int runSocket (); int haltSocket (); GdkPixbuf \*create_pixbuf(const gchar \* filename); int main( int argc, char *argv[]) { int check = winSocket(); if (check != 0) printf ("Dicker fetter Error : %d ", check); GtkWidget *window; GtkWidget *frame; GtkWidget *startSocket; GtkWidget *textSocket; GtkWidget *stopSocket; GtkTextBuffer *buffer; gtk_init(&argc, &argv); window = gtk\_window\_new( GTK\_WINDOW\_TOPLEVEL ); gtk\_window\_set\_title( GTK\_WINDOW (window), "@Chat v0.1a" ); gtk\_window\_set\_default\_size( GTK_WINDOW (window), 480, 220 ); gtk\_window\_set\_position( GTK\_WINDOW (window), GTK\_WIN\_POS_CENTER ); gtk\_window\_set\_icon( GTK\_WINDOW(window), create_pixbuf ("skull.png") ); frame = gtk\_fixed\_new (); gtk\_container\_add ( GTK_CONTAINER (window),frame ); startSocket = gtk\_button\_new\_with\_label ("Start Socket"); gtk\_widget\_set\_size\_request (startSocket, 100, 35 ); gtk\_fixed\_put( GTK_FIXED ( frame ),startSocket, 20, 20 ); stopSocket = gtk\_button\_new\_with\_label ("Stop Socket"); gtk\_widget\_set\_size\_request (stopSocket, 100, 35 ); gtk\_fixed\_put( GTK_FIXED ( frame ),stopSocket, 140, 20 ); textSocket = gtk\_text\_view_new (); gtk\_text\_view\_set\_editable ( GTK\_TEXT\_VIEW (textSocket), FALSE ); gtk\_text\_view\_set\_cursor\_visible ( GTK\_TEXT_VIEW (textSocket), TRUE ); gtk\_widget\_set\_size\_request (textSocket, 440,130); gtk\_fixed\_put ( GTK_FIXED ( frame ), textSocket, 20, 70 ); buffer = gtk\_text\_view\_get\_buffer (GTK\_TEXT\_VIEW (textSocket)); **gtk\_text\_buffer\_set\_text (buffer, buff, -1);** gtk\_widget\_show_all (window); g\_signal\_connect\_swapped(G\_OBJECT(window), "destroy", G\_CALLBACK(gtk\_main_quit), NULL); g\_signal\_connect(startSocket, "clicked", G_CALLBACK(runSocket), startSocket); g\_signal\_connect(stopSocket, "clicked", G_CALLBACK(haltSocket), stopSocket); gtk_main(); return 0; } GdkPixbuf \*create_pixbuf(const gchar \* filename) { GdkPixbuf *pixbuf; GError *error = NULL; pixbuf = gdk\_pixbuf\_new\_from\_file(filename, &error); if(!pixbuf) { fprintf(stderr, "%s\\n", error->message); g\_error\_free(error); } return pixbuf; } int winSocket(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } int runSocket() { SOCKADDR_IN saddr; s=socket(AF\_INET,SOCK\_STREAM,0); if(s==INVALID_SOCKET) { printf ("Error : %s \\n",WSAGetLastError()); return 0; } else { for ( i = 0 ; i > 45 ; i++) buff[i] = "\\0"; **strcpy ( buff ,"Socket erfolgreich gestartet\\n" );** printf ("%s", buff); return 1; } } int haltSocket () { for ( i = 0 ; i > 45 ; i++) buff[i] = "\\0"; closesocket (s); **strcpy ( buff ,"Socket erfolgreich gestopt\\n" );** printf ("%s", buff); return 1; }
-
In deinem Code ist nur ein static und das ist außerhalb jeder Funktion deklariert - und das hat eine andere Bedeutung als du meinst.
Und buff[i] = "\0"; funktioniert so nicht. Du brauchst da die einfachen Hochkommas (die über dem
Mit ' ist das ein Zeichen.
Mit " ist das ein mit '\0' abgeschlossener String -> 2 Zeichen, bzw. der Zeiger auf diesen String.
-
akoww schrieb:
for ( i = 0 ; i > 45 ; i++) buff[i] = "\0";
Diese beiden Zeilen sind sinnlos. Ansonsten liegt es wohl an deinem schon markierten gtk_text_buffer_set_text Aufruf und der Funktionsweise dieser Funktion.
-
den Teil hab ich nur übersehen, aber das hat keine große auswirkungen.
buff[i] = '\0';
So, das mit dem static hab ich nun wohl etwas falsch verstanden, aber wie biege ich das Array so hin, dass es nach Beednigung der Funktion am Leben bleibt ?
-
buff ist doch global.