🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: nl.comp.programmeren
Article #704

Re: GTK programma & parallelle poort -> segmentation fault

#704
From: Henk Huitema
Date: Tue, 23 Nov 1999 00:00
66 lines
3398 bytes
Bart Vandewoestyne wrote:
> 
> Henk Huitema wrote:
> >
> > "(gpointer) &portstatus" zou wel moeten werken.
> 
> Bedankt!  Dit heeft inderdaad mijn probleem opgelost.  Ik wil echter ook
> niet klakkeloos deze 'correctie' overnemen en had graag geweten of mijn
> volgende redenering juist is:
> 
> Aangezien de functie
> 
> GtkWidget *CreateMenuItem (GtkWidget *menu,
>                            char *szName,
>                            char *szAccel,
>                            char *szTip,
>                            GtkSignalFunc func, gpointer data)
> 
> de functie
> 
> void turn_left_half_step(GtkWidget *widget, gpointer data)
> 
> oproept, en deze verder dan ook de functie
> 
> void set_left_half_step(int *status)
> 
> oproept die een (int *) verwacht, moest ik ervoor zorgen dat ik aan
> *CreateMenuItem(....) een variabele meegeef in de trend van &portstatus
> (vanwege de (int *)) en omdat *CreateMenuItem(....) een gpointer nodig
> heeft moet ik nogmaals casten met (gpointer) ?
> 
> Dus: vanwege de (int *) -> & portstatus en vanwege de "gpointer data" ->
> (gpointer)
> 
> Mocht de functie er als volgt hebben uitgezien:
> 
> void set_left_half_step(int status)
> 
> Dan zou ik gewoon gecast moeten hebben met
> 
> (gpointer) porstatus
> 
> Klopt dit?  Zo ja, dan denk ik dat ik weer wat bijgeleerd heb :-)

Dat klopt. Dit is zelfs zo handig dat glib hier speciale macros voor
heeft: 
GINT_TO_POINTER(int) en GPOINTER_TO_INT(gpointer). Dit stelde ook iemand
voor op je 1e post meen ik.

Let wel dat dit in principe niet mag van C. Pointers kunnen minder bits
hebben dan int, en dan raak je dus wat kwijt als je int->pointer->int
cast. Glib garandeert dat het wel werkt; op alle platformen waar glib
naar geport is gaat het goed. Andersom is niet gegarandeerd,
(pointer->int->pointer), en daar heb je op veel 64-bits computers last
van (weet ik uit ervaring...).

Overigens werk het in jouw geval niet, omdat je ook nog probeert
portstatus te wijzigen in de functies die je aanroept. Dat werkt
natuurlijk niet als je call-by-value doet. Portstatus is gewoon een
globale variabele, en je doet erg veel moeite om een pointer naar dat
ding door te geven. Niet echt nuttig, kun je net zo goed rechtstreeks
doen, of (netter) met getter en setter functies.

-- 
moi,
Henk
Technical Details
Message-ID: <383AFEC2.29BB654C@cwi.nl>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <383885E6.AC1CA383@skynet.be> <38399284.B7A38A26@cwi.nl> <383AE3F3.BE422622@skynet.be>

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: 107324,ef82ca5dd635fd8
X-Google-Attributes: gid107324,public
X-Google-Thread: fb7d6,ef82ca5dd635fd8
X-Google-Attributes: gidfb7d6,public
X-Google-Thread: 100a19,ef82ca5dd635fd8
X-Google-Attributes: gid100a19,public
X-Google-Thread: fcea4,ef82ca5dd635fd8
X-Google-Attributes: gidfcea4,public
From: Henk Huitema <huitema@cwi.nl>
Subject: Re: GTK programma & parallelle poort -> segmentation fault
Date: 1999/11/23
Message-ID: <383AFEC2.29BB654C@cwi.nl>
X-Deja-AN: 552215502
Content-Transfer-Encoding: 7bit
References: <383885E6.AC1CA383@skynet.be> <38399284.B7A38A26@cwi.nl> <383AE3F3.BE422622@skynet.be>
X-Accept-Language: en
Content-Type: text/plain; charset=us-ascii
X-Complaints-To: newsmaster@worldonline.nl
X-Trace: news.worldonline.nl 943389720 25635 195.241.231.108 (23 Nov 1999 20:42:00 GMT)
Organization: ...
Mime-Version: 1.0
NNTP-Posting-Date: 23 Nov 1999 20:42:00 GMT
Newsgroups: nl.comp.programmeren,be.comp.os.linux,nl.comp.os.linux,be.comp.programming