🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: nl.comp.programmeren
Article #281

Re: Lijnen tellen van een project

#281
From: Sjoerd A. Schreuder
Date: Fri, 28 Jan 2005 13:04
89 lines
5324 bytes
John Bokma wrote:
> Dr.Ruud wrote:
>>Toen ik John Bokma kietelde, kwam er dit uit:
>>
>>>dus is het *soms* gevaarlijk om zomaar:
>>>
>>>  if ( !ptr ) ... te gebruiken.
>>
>>Die redenering begrijp ik niet. In C is !ptr heel eenduidig
>>(als er geen geniepige redefine van 'ptr' meespeelt).
> 
> Het schoot mij te binnen, tenminste als ik het mij goed herinner, dat C 
> geen NULL kent, maar dat het gewoon
> 
> #define NULL (0)
> 
> is?

In C komt ook wel ((void *)0) voor, maar in C++ moet het een
"integrale compile-time constante gelijk aan 0" zijn.
(En dat mag dus 0, 0L, 0UL, (2-2), (6-3-3), ... zijn)

En dat is wel degelijk een speciale pointerwaarde, zie Dr. Ruud's
reaktie.

> (Ik herinnerde mij iets van: NULL en 0 zijn twee dingen in C, een 
> pointer kan NULL zijn, maar ook naar geheugenlocatie 0 wijzen. Als dat 
> echt twee dingen zouden zijn, dan is 0 en NULL beide false)

Het probleem is dat je een geldige waarde moet opofferen om NULL
te representeren, soort van in-band-signaling.

Ik ken C op dit gebied minder goed dan C++, maar in C++ wordt een zero
omgezet in een pointer die als NULL pointer dient (C vereist dacht ik
wel gewoon een zero, maar dat weet ik niet zeker). De C++ standaard
doet zijn best om niet te zeggen dat dat adres 0 is en de optie open
te laten daar b.v. 0xFFFFFFFF van te maken. Maar elke compiler die ik
ken, representeert een NULL pointer door een pointer naar adres 0,
en ik ken een heleboel code die fout zou gaan als dat niet het geval
zou zijn (code die memset(), memzero() en zo gebruikt om een pointer
te initialiseren). Maar een compiler mag dat dus anders doen!

>>Ik nam aan dat je met ptr een variabele van een
>>integer type beDoelt, specifiek beDoeld en geschikt
>>voor het bevatten van een geheugenadres. In C.
>>Maar misschien bedoelde je het wel heel anders.
> 
> Zie boven. Ik bedoel dat ptr twee false waarden kan hebben. Indien niet, 
> dan gaat dat deel van mijn verhaal niet op.

Er is maar 1 false waarde (nl NULL), maar i.h.a. wordt de pointer
naar adres 0 opgeofferd om die NULL waarde te representeren.

Overigens is het best mogelijk om zo'n pointer te gebruiken in C.
Je zult dan het geheugen op adres 0 proberen te benaderen, en als
dat precies is wat je wilt (in een embedded device of zo), dan zal
C je dat niet verbieden. Je hebt wel een probleem wat je dan als
"ongeldige pointer" gebruikt, maar daar valt waarschijnlijk wel
weer iets op te vinden. Maar op een PC is adres 0 i.h.a. niet
leesbaar/schrijfbaar en krijg je een crash of zo.

> In Perl ken ik het probleem wat ik al schetste:
> 
> $filename ||= "default.txt";
> 
> Wat $filename gelijk maakt aan default.txt o.a. als $filename niet 
> gedefinieerd is, maar ook als deze de waarde 0 bevat. Lastig als je met 
> een lusje "deze" sub aanroept en je bestanden 0, 1, 2, etc. noemt.

Tja, dat krijg je met dynamische typering. In C is er verschil tussen
"0" en 0L, in Perl blijkbaar niet.

In C is er dus wel verschil tussen
   filename = NULL;
en
   filename = "0";
Bij die laatste geldt gewoon dat (filename != NULL). Je probleem
is dus Perl-specifiek en komt niet in C voor.

> Ander voorbeeld:
> 
> $speed ||= 5;    	# use default
> 
> Probeer $speed nu maar eens op 0 te zetten.

Misschien is dat ook wel niet handig (maar dan zou ik if (speed < 1)
o.i.d. verwachten).

Sjoerd
Technical Details
Message-ID: <41fa3846$0$63643$abc4f4c3@news.wanadoo.nl>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!fr.ip.ndsoftware.net!news2.euro.net!postnews1.euro.net!news.wanadoo.nl!not-for-mail
References: <%XJId.2415$OZ2.252982@phobos.telenet-ops.be> <41f37378$0$140$e4fe514c@news.xs4all.nl> <ct2bdl$2p5$1@news1.zwoll1.ov.home.nl> <Xns95E88B1A63743castleamber@130.133.1.4> <41f55352$0$26219$18b6e80@news.wanadoo.nl> <Xns95E89B5FAF7C6castleamber@130.133.1.4> <41f587d8$0$11854$e4fe514c@news.xs4all.nl> <Xns95E8CE2C13FCcastleamber@130.133.1.4> <41f60627$0$11906$e4fe514c@news.xs4all.nl> <ct5e5s.104.1@news.isolution.nl> <Xns95E982F869770castleamber@130.133.1.4> <ct6veq.4f8.1@news.isolution.nl> <Xns95EA98A5B4Dcastleamber@130.133.1.4> <ct818b.198.1@news.isolution.nl> <Xns95EA868DF1188castleamber@130.133.1.4> <ct930d.2fg.1@news.isolution.nl> <Xns95EAA862D9BDcastleamber@130.133.1.4> <ct9k2f.4js.1@news.isolution.nl> <Xns95EAD25B041B7castleamber@130.133.1.4> <ct9svc.4ko.1@news.isolution.nl> <Xns95EB6001EE123castleamber@130.133.1.4>

Show Full Headers
Complete Article Headers
X-Google-Thread: 107324,ab34a8b99e320381
X-Google-Thread: fcea4,ab34a8b99e320381
X-Google-Attributes: gid107324,gidfcea4,public
X-Google-Language: DUTCH,ASCII-7-bit
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!fr.ip.ndsoftware.net!news2.euro.net!postnews1.euro.net!news.wanadoo.nl!not-for-mail
Date: Fri, 28 Jan 2005 14:04:04 +0100
From: "Sjoerd A. Schreuder" <sa_schreuder@wanadoo.nl>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)
X-Accept-Language: en-us, en
MIME-Version: 1.0
Newsgroups: nl.comp.programmeren,be.comp.programming
Subject: Re: Lijnen tellen van een project
References: <%XJId.2415$OZ2.252982@phobos.telenet-ops.be> <41f37378$0$140$e4fe514c@news.xs4all.nl> <ct2bdl$2p5$1@news1.zwoll1.ov.home.nl> <Xns95E88B1A63743castleamber@130.133.1.4> <41f55352$0$26219$18b6e80@news.wanadoo.nl> <Xns95E89B5FAF7C6castleamber@130.133.1.4> <41f587d8$0$11854$e4fe514c@news.xs4all.nl> <Xns95E8CE2C13FCcastleamber@130.133.1.4> <41f60627$0$11906$e4fe514c@news.xs4all.nl> <ct5e5s.104.1@news.isolution.nl> <Xns95E982F869770castleamber@130.133.1.4> <ct6veq.4f8.1@news.isolution.nl> <Xns95EA98A5B4Dcastleamber@130.133.1.4> <ct818b.198.1@news.isolution.nl> <Xns95EA868DF1188castleamber@130.133.1.4> <ct930d.2fg.1@news.isolution.nl> <Xns95EAA862D9BDcastleamber@130.133.1.4> <ct9k2f.4js.1@news.isolution.nl> <Xns95EAD25B041B7castleamber@130.133.1.4> <ct9svc.4ko.1@news.isolution.nl> <Xns95EB6001EE123castleamber@130.133.1.4>
In-Reply-To: <Xns95EB6001EE123castleamber@130.133.1.4>
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Lines: 90
Message-ID: <41fa3846$0$63643$abc4f4c3@news.wanadoo.nl>
Organization: Wanadoo
NNTP-Posting-Date: 28 Jan 2005 13:04:07 GMT
NNTP-Posting-Host: c3eea341e.cable.wanadoo.nl
X-Trace: 1106917447 flip.euronet.nl 63643 62.234.52.30:1672
X-Complaints-To: abuse@wanadoo.nl