abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 06:00 | Zajímavý projekt

    Jack Dorsey představil (𝕏, Nostr) svůj nový projekt bitchat. Jedná se o bezpečnou decentralizovanou peer-to-peer aplikaci pro zasílání zpráv bez potřeby internetu, serverů a telefonních čísel. Využívá se Bluetooth Mesh Network. Detaily v technické dokumentaci. Zdrojové kódy jsou k dispozici pod licencí Unlicense.

    Ladislav Hagara | Komentářů: 0
    dnes 04:22 | Nová verze

    Hudební přehrávač Amarok byl vydán v nové verzi 3.3 "Far Above the Clouds". Nově je postaven na Qt6/KF6 a využívá GStreamer místo Phononu.

    Ladislav Hagara | Komentářů: 0
    včera 18:11 | IT novinky

    Společnost IBM představila novou generaci svých serverů: IBM Power11.

    Ladislav Hagara | Komentářů: 0
    včera 15:33 | Komunita

    Multiplatformní digitální pracovní stanice pro práci s audiem Ardour byla postavena na GTK2. Vývojáři neplánovali její portaci na GTK3 nebo GTK4. Naopak, v lednu loňského roku si vytvořili vlastní fork GTK2 s názvem YTK. Ten v únoru letošního roku přestal být volitelným a nově byla zcela odstraněna podpora GTK2.

    Ladislav Hagara | Komentářů: 7
    včera 11:33 | Nová verze

    Byla vydána nová verze 6.4 linuxové distribuce Parrot OS (Wikipedie). Jedná se o linuxovou distribuci založenou na Debianu a zaměřenou na penetrační testování, digitální forenzní analýzu, reverzní inženýrství, hacking, anonymitu nebo kryptografii. Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 11:22 | Pozvánky

    Společnost initMAX pořádá sérii bezplatných webinářů věnovaných novému Zabbixu 7.4. Podrobnosti a registrace na webu initMAX.

    … více »
    Heřmi | Komentářů: 0
    včera 03:44 | Nová verze

    Byla vydána verze 7.0 open source platformy pro správu vlastního cloudu OpenNebula (Wikipedie). Kódový název nové verze je Phoenix. Přehled novinek v poznámkách k vydání v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 1
    včera 00:11 | Nová verze

    E-mailový klient Thunderbird byl vydán ve verzi 140.0 ESR „Eclipse“. Jde o vydání s dlouhodobou podporou, shrnující novinky v upozorněních, vzhledu, správě složek a správě účtů. Pozor, nezaměňovat s průběžným vydáním 140.0, které bylo dostupné o týden dříve.

    Fluttershy, yay! | Komentářů: 14
    7.7. 15:11 | IT novinky

    Organizace Video Games Europe reprezentující vydavatele počítačových her publikovala prohlášení k občanské iniciativě Stop Destroying Videogames.

    Ladislav Hagara | Komentářů: 0
    7.7. 13:22 | IT novinky

    Společnost Raspberry Pi nově nabzí Raspberry Pi Camera Module 3 Sensor Assembly, tj. samostatné senzorové moduly z Raspberry Pi Camera Module 3.

    Ladislav Hagara | Komentářů: 0
    Jaký je váš oblíbený skriptovací jazyk?
     (60%)
     (27%)
     (7%)
     (2%)
     (1%)
     (1%)
     (3%)
    Celkem 371 hlasů
     Komentářů: 16, poslední 8.6. 21:05
    Rozcestník

    Dotaz: C - konverze typu a kontrola

    8.6.2009 10:07 jarda
    C - konverze typu a kontrola
    Přečteno: 630×

    Hezky den

    mam toto v c:

    #include <netinet/in.h>
    #define short unsigned int UWORD

    a nekde toto:

    UWORD i = 1;
    i = htons(i); //htons pracuje in/out jen s UWORD, resp uint16_t

    a KDEVELOP stale hlasi:

    warning: conversion to 'short unsigned int' from 'int' may alter its value

    Jak utnout tipec tomuto hlaseni, a ne zrovna tim ze vypnu kontroly typu?

    Predem diky

    Jarda

     

     

    Odpovědi

    8.6.2009 10:52 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    Když je to potřeba, je možné použít přetypování, tj. před proměnnou, která se na dané místo typově nehodí, je třeba vložit správný typ v kulatých závorkách. Časté je to zejména u ukazatelů, zejména pak alokace paměti.

    V tomto případě se mi ale nelíbí to makro, správně by druhý řádek měl začínat klíčovým slovem typedef.
    8.6.2009 11:04 graviton
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    #define short unsigned int UWORD
    to není tak docela dobře...
    Neměl to být spíš typedef?
    Nebo když už, tak aspoň #define UWORD short unsigned int
    8.6.2009 13:25 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    Navíc bych se vykašlal na unsigned short int a použil uint16_t.
    In Ada the typical infinite loop would normally be terminated by detonation.
    8.6.2009 13:27 jardaz
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

    Sorry, ja se pri opisovani spletl, ma tam byt to co jste uvedl (viz nize), ale to problem neresi.

    #define UWORD short unsigned int

    rovnez to neresi ani toto:

    i=(UWORD)htons((UWORD)i);

    ci toto (ikdyz zrusim makro a i definuji jako uint16_t):

    i=(uint16_t)htons((uint16_t)i);

     

    8.6.2009 13:50 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    Podle tohohle (část, kde cituje z manuálu gcc) je to spíš chybka u překladače.
    i=(uint16_t)htons((uint16_t)i);
    Ty přetypování bych rozhodně vyhodil, protože proměnné odpovídají hlavičce funkce a takhle se to jenom zatemní.
    I am always ready to learn although I do not always like to be taught. (W. Churchill)
    8.6.2009 16:10 jardaz
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

    Ja si to taky myslel, ale radsi se zeptam, protoze nikde neni duvod pouzivat int. No a ta hlaska nedava vice info, zda je to vuci leve hodnote ci parametru funkce. Takze dle odkazu off -Wconversion.

    8.6.2009 16:18 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    Možná by nebylo od věci vyměnit překladač nebo prověřit situaci při ručním překladu jediného zdrojového souboru v příkazovém řádku.
    8.6.2009 18:38 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

    Asi to bude záviset na verzi gcc (nebo glibc). Právě jsem zkusil přesně ten původní kód:

    #include <stdio.h>
    #include <netinet/in.h>
    
    #define UWORD short unsigned int
    
    int main()
    {
      UWORD i = 1;
      i = htons(i);
      printf("%hu\n", i);
      return 0;
    }
    

    a obešlo se to bez protestů i s '-Wall -Wextra'. Použil jsem gcc 4.3.2 a glibc 2.9.

    8.6.2009 19:03 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    Asi to bude záviset na verzi gcc (nebo glibc)
    Vypadá to tak: gcc (GCC) 4.1.2 (Gentoo 4.1.2) řve, gcc (GCC) 4.4.0 20090526 (prerelease) je v pohodě.
    I am always ready to learn although I do not always like to be taught. (W. Churchill)
    Fuky avatar 8.6.2009 21:58 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

    U mě neřve ani jedna verze gcc, glibc 2.7-18:

    gcc-3.3 (GCC) 3.3.5 (Debian 1:3.3.5-13)
    gcc-3.4 (GCC) 3.4.6 (Debian 3.4.6-9)
    gcc-4.1 (GCC) 4.1.3 20080704 (prerelease) (Debian 4.1.2-25)
    gcc-4.2 (GCC) 4.2.4 (Debian 4.2.4-6)
    gcc-4.3 (Debian 4.3.2-1.1) 4.3.2
    

    9.6.2009 09:30 jardaz | Opava
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

    Hezky den

    vsem diky ze se problemu venujete, tady davam info, kdy se to generuje na mem sw (stejny kod jak v prizpevku vyse):

    • KDevelop 3.5.4 pod KDE 3.5.10-3.fc10,
    • gcc version 4.3.2 20081105 (Red Hat 4.3.2-7),
    • FC10
    • a nastaveni překladače: -O0 -Werror-implicit-function-declaration -Wimplicit-int -Wuninitialized -Wconversion -Wmissing-declarations -pg -freg-struct-return -O -g3, 

    tak to hlasi testwarning.c:16: warning: conversion to 'short unsigned int' from 'int' may alter its value. Vyradim-li prepinac -Wconversion, tak to hlaseni zmizi, na to vsak upozornil jiz v prispevku Vojtech Horky, takze pouziti tohoto prepinace je dvojsecne, sice oznaci mista, kde se pouzije implicitni pretypovani, ale oznaci varovanim i to kde jiste k pretypovani vubec nedochazi.

    9.6.2009 10:07 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    Zajímavé zjištění: samožné -Wconversion nestačí, ale když přidám optimalizaci, začne se ta hláška objevovat i u mne. Zřejmě to souvisí s tím, že ntohs() je definováno jinak při překladu s optimalizací a jinak bez ní. Ale teď bohužel nemám čas rozplétat všechny ty #ifdef-y v hlavičkových souborech.
    9.6.2009 10:34 jardaz | Opava
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

    Ja se dival na ten hlavickovy soubor, jednoznacne zneho vyplyva, ze hto... funkce jsou tam ruzne definovany podle optimalizace a zpusobu uschovy udaju v pameti, prakticky lze rici, ze pri max. optimalizaci by stacilo misto funkce pouzit inline assembler a to operaci bswap x (x znaci nejaky ten parametr) a kdo vi jak se to pak jevi prekladaci. Chci jen podotknout, ze htons neni jedine misto, kde se ten prepinac a warning objevuje, vybral jsem ji zcela nahodne.

    9.6.2009 10:47 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    Příčina je zřejmě v této části netinet/in.h:
    #ifdef __OPTIMIZE__
    /* We can optimize calls to the conversion functions.  Either nothing has
       to be done or we are using directly the byte-swapping functions which
       often can be inlined.  */
    # if __BYTE_ORDER == __BIG_ENDIAN
    /* The host byte order is the same as network byte order,
       so these functions are all just identity.  */
    # define ntohl(x)       (x)
    # define ntohs(x)       (x)
    # define htonl(x)       (x)
    # define htons(x)       (x)
    # else
    #  if __BYTE_ORDER == __LITTLE_ENDIAN
    #   define ntohl(x)     __bswap_32 (x)
    #   define ntohs(x)     __bswap_16 (x)
    #   define htonl(x)     __bswap_32 (x)
    #   define htons(x)     __bswap_16 (x)
    #  endif
    # endif
    #endif
    
    Můj zkušební kód po gcc -E -O (Debian 4.3.3-7) dopadne takto:
    int main() {
      unsigned short int w1, w2;
      w1 = 0x1234;
      w2 = (__extension__ ({
        register unsigned short int __v, __x = (w1);
        if (__builtin_constant_p (__x))
          __v = ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8));
        else
          __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc");
        __v;
      }));
      printf("%x\n", w2);
      return 0;
    }
    
    Přiřazení s w2 = … bylo původně w2 = ntohs(w1), při zapnutých optimalizacích tedy w2 = __bswap_16(w1). Rozvoj makra je v příspěvku vidět. Bitové operace v první větvi podmínky vyvolají onu hlášku. Kód se navíc vykoná jen tehdy, pokud je hodnota známá během překladu, pro proměnnou se použije vložený kus asembleru.
    9.6.2009 11:23 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    Kód se navíc vykoná jen tehdy, pokud je hodnota známá během překladu, pro proměnnou se použije vložený kus asembleru.

    V podstatě máte pravdu, ale formulace "kód se vykoná" není přesná. To větvení je tam právě proto, že je-li argument konstanta, (neefektivní) výpočet podle vozorečku provede samotný překladač a do kódu jde rovnou výsledná konstanta (stejně jako když napíšete třeba int a = 1 + 1).

    9.6.2009 11:26 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    Díky za upřesnění.
    9.6.2009 10:15 petris_ | skóre: 12
    Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
    includujte arpa/inet.h

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.