hej!
har du testat sätta parentes runt hela uttrycken vid casting, (int) (a*b) ibland tar castingen bara första uttrycket dvs att (int) a * b konverterar a till en int men att hela uttrycket blir av typen long.
Har du testat att se om andra funktioner i string.h fungerar som de ska? tänkte om kompilatorn kanske hittar header-filen men att libet saknas.
Om man använder en funktion som inte är deklarerad (i samma kod eller via
en header fil) så får man "warning: implicit declaration" och returvärdet
blir default "int". Om man accepterar varningen så är det helt OK, annars
importerar man en lämplig header fil eller lägger till en egen deklaration.
Vissa funktioner kan ha en intern deklaration i själva kompilatorn, och
om den inte stämmer överen med den automatgenererade så får man
"warning: incompatible implicit declaration". T.ex ifall memset()
internt är definierad som void.
Kör en full listfil och verifiera att string.h är korrekt importerad.
Du kan även testa att kopiera raden från string.h till din c fil.
Det visade sig vara en i gcc inbyggd funktion, vars deklaration inte stämmer med gängse vedertaget sätt, en kompilatorswitch fixade det.
Men varför i helsike gör man inte så att inbyggda funktioner är definierade som "weak", då slipper man alla problem.
Nja, gillar inte att använda "odokumenterade" funktioner, anser att man skall använda libben i stället, man har liksom lite större kontroll på saker och ting.
Personligen så anser jag att sådana Built-in funktioner skall vara "weak", så man utan problem kan ersätta dem rakt av med en include, utan att behöva ändra i kod.
dessutom vill man ju gärna att koden skall vara porterbar och sann ansi, vilket den inte blir om kompilatorn har egna inbyggda funktioner, vilka skiljer sig från ansi-liben.
I ansiliben är memset deklarerad som en "void *" i gcc verkar det bara vara en "void".
Det är säkert dokumenterat in någon kryptisk obskyr dokumentation någonstans.
Men oavsett vilket så bryter sådana här egenheter portabiliteten, och som sagt den borde vara weak, så om man inkluderar ett libb med motsvarande funktioner, så skall det överrida de interna funktionerna.
Men om man deklarerar den som weak, då finns den väl där alltid även om man glömt lägga till sitt lib
In computing, a weak symbol is a symbol definition in an object file or dynamic library that may be overridden by other symbol definitions. Its value will be zero if no definition is found by the loader.
Då kan man av misstag kalla på funktioner som inte finns vilket kan vara ganska farligt.
Finns inte funktionerna deklarerade får du felmeddelande, finns de deklarerade men du anropar dem med fel typer, som i mitt fall får du en varning/felmeddelande beroende på inställning.
Så som jag uppfattat det, om den är deklarerad som weak, och jag inkluderar ett lib, så överrider libbet den svagt deklarerade symbolen, i detta fallet de inbyggda funktionerna eftersom jag inkluderade libben i stället.
Nåväl, med en kompilatorswitch kan man stänga av de inbyggda funktionerna, så det löste sig. Ingen blå text längre.