Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Gtk+ passaggio di parametri con g_signal_connect()
Forum - C/C++ - Gtk+ passaggio di parametri con g_signal_connect() - Pagina 2

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:14
Domenica, 27/01/2013
Dichiara questo array

Btn button[4][4];

al di fuori della funzione grf_tastiera, globalmente


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 20:24
Domenica, 27/01/2013
Bè si così funziona,, ma ho una variabile globale... Sto cercando di evitare proprio questo.

PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 21:10
Domenica, 27/01/2013
Testo quotato

Postato originariamente da nessuno:

Dichiara questo array

Btn button[4][4];

al di fuori della funzione grf_tastiera, globalmente



Nessuno ha ragione, infatti dichiarando come variabile locale viene distrutta a fine funzione:

Automatic allocation happens when you declare an automatic variable, such as a function argument or a local variable. The space for an automatic variable is allocated when the compound statement containing the declaration is entered, and is freed when that compound statement is exited. In GNU C, the length of the automatic storage can be an expression that varies. In other C implementations, it must be a constant. (http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_ ... se invece vuoi che sia sempre disponibile o fai come ti ha detto Nessuno o lo allochi dinamicamente tramite una malloc....

infatti il gtkwidget della tua struttura rimane allocato perchè viene creato dinamicamente qui:
Codice sorgente - presumibilmente Plain Text

  1. gtk_button_new_with_label(button[rows][cols].lab);


invece "char lab[2]" no....

PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 21:23
Domenica, 27/01/2013
Temo di non seguire il ragionamento, che differenza fa la modalità di allocazione del vettore?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:35
Domenica, 27/01/2013
Sai cosa succede ad una variabile o ad un array allocato localmente in una funzione quando la funzione termina?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 21:49
Domenica, 27/01/2013
Conosco le regole di visibilità, intendevo: che differenza fa l'allocazione run time, con l'allocazione a tempo di compilazione?

Poi come descritto qui: http://developer.gnome.org/gobject/unstable/gobject-Signal ... l'ultimo parametro di g_signal_connect() serve proprio come parametro per le funzioni collegate.

Quindi non ci dovrebbero essere problemi di visibilità, mi viene scomodo ricorrere alle variabili globali...

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:56
Domenica, 27/01/2013
Se conosci le regole saprai che button allocato in quel modo, quando la funzione termina, non esiste più.

Concordi?

Se non vuoi usare la variabile locale, allora alloca l'array in memoria dinamicamente.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 22:12
Domenica, 27/01/2013
Codice sorgente - presumibilmente C++

  1. typedef struct {  GtkWidget *wid;   char * lab;  } Btn;
  2.  
  3. //gfc_tabella()
  4. for ( rows = 0; rows < 4; rows++ )
  5.     for ( cols = 0; cols < 4; cols++ )
  6.       button[rows][cols].lab = rand_character();



esempio di output alla pressione di alcuni bottoni:


H�b�O
I��L�L$0L�D$(H�|$ H�t$▒H�T$H�LH�$H��HA��ffffff.�
Segmentation fault (core dumped)

Ultima modifica effettuata da Dante.cpp il 27/01/2013 alle 22:30
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo