1

Onderwerp: C assignment in conditioneel statement

Bij het debuggen van een stukje software kwam ik het volgende tegen

if(flag1 && flag2 && ((fh = openbestand())>=0))
{
     printf("%i\r\n", fh);

.....

Openbestand is een wrapper functie om de standaard open functie staat.
Dit bleek om de een of andere reden mis te gaan,
De filehandle bleek steeds 1 te zijn (kenlijk True ipv de waarde voor fh)

Zelf zou ik het ook niet zo doen, ik zou kiezen voor deze variant
Maar dit heeft het nadeel dat het bestand wel geopend wordt ook als flag1 of flag2 niet voldoen.
(c behoort na de eerste false te stoppen met het verder evalueren van de expressie)

if(((fh = openbestand())>=0) && flag1 && flag2)
{
     printf("%i\r\n", fh);
.....

Maar om zeker te spelen het ik het uiteindelijk maar als volgt opgelost

fh = openbestand();
if(flag1 && flag2 && (fh>=0))
{
     printf("%i\r\n", fh);

.....

Op zich lijkt wat mijn colega gedaan heeft niet fout... toch leverde het dit soort problemen op.
Iemand een idee waarom ?
Compiler is gcc 4.8.1 op een Suse bak (brrr)

Pascal's Blobfree Homepage
Een dag geen NedLinux is een dag niet geleefd

2

Re: C assignment in conditioneel statement

Het lijkt me dat het probleem in openbestand zit. Geeft die wel de filehandle terug of wordt STDOUT gebruikt? Die heeft de waarde 1.

Old programmers never die: they just jump to a new address
Kubuntu 16.02 LTS, Compaq CQ61 met Linux Mint 18, een Galaxy Tab 10.1 met Android Ice Cream en een Raspberry PI met raspian
http://www.volkerskrant.nl

3

Re: C assignment in conditioneel statement

jovo,
Dank voor je response, nee het is geen stdout het gaat echt om een filehandle (zoals ik ook beschreven heb)
Toegegeven, ik vond het zelf ook vreemd... duurde ook even voor ik begreep wat het probleem is.

Pascal's Blobfree Homepage
Een dag geen NedLinux is een dag niet geleefd

Re: C assignment in conditioneel statement

Die check is slecht, open is duidelijk gedefinieerd (-1 als een file niet geopend is). Dus de correcte check is te controleren of het niet gelijk aan -1 is.

Dat gezegd hebbende, het is mogelijk dat de file descriptor altijd 1 is: als stdout gesloten is en het bestand altijd netjes gesloten wordt.

Pascal: waarom is stdin geen echte file descriptor?

5

Re: C assignment in conditioneel statement

Daniel,

De code is niet vanmij zelf, ik fix ehm slechts.
Ik heb over de kwaliteit van de code overigens niet te klagen.
1) Nee die check is niet slecht !... even los van het feit dat je niet aangeeft waarom dat wellicht zijn waneer het om het openen van een reguliere filehandle zou zijn, maar dat is het hier dus niet... het spul gaat naar een functie toe die vanalles regeld en indien het goed gaat een valide fh teruggeeft.
Wat het antwoord bij een fout zal zijn staat gewoon in de documentatie van de functie (en ja..guess what... mensen alhier documenteren hun zooi... waar vind je dat nog he)

2) Tja eigenlijk is deze vraag daarmee ook beantwoord he...
Maar om toch antwoord te geven, het resultaat is geen fh naar een file maar naar een socket wink

Het ging in dit geval om een programma dat afhankelijk van de meegegeven params als een socket server dan wel als een client moet werken.
Belangrijk is hier dat e.e.a. zonder al te veel geklungel op diverse platformen moet draaien.
Denk daarbij aan pinguins, unox, appels en ik geloof in een enkel geval zelfs ook wel een of ander obscuur spulletje uit het dorpje Redmond.

Pascal's Blobfree Homepage
Een dag geen NedLinux is een dag niet geleefd

Re: C assignment in conditioneel statement

Het lijkt mij dat de originele code en de 'oplossing' equivalent zijn. Ik ben het dus eens met jovo dat de oorzaak van het probleem elders ligt, hetzij in de waardes van flag1 en flag2 of in de implementatie van openbestand().

"Free and non-free software can co-exist the same way that free people and slaves can co-exist. But that's not a desirable state of affairs." -- RMS

7

Re: C assignment in conditioneel statement

Ik vind de volgorde die mijn colega maakte wel heel legitiem.
Reden zal ik hier middels wat code toelichten.

flag=0;
if(((fd=open(fn))>=0) && flag)
{
     close(fd);
}

In dit voorbeeld wordt een file geopend maar niet meer gesloten.
Terwijl in het volgende voorbeeld de file terecht niet geopend wordt

flag=0;
if(flag && ((fd=open(fn))>=0))
{
     close(fd);
}
Pascal's Blobfree Homepage
Een dag geen NedLinux is een dag niet geleefd

Re: C assignment in conditioneel statement

Eh ja. Dat is logisch. Wat is het punt? wink