WebHU - Programozási kérdések és válaszok

Miért van szükség a mutató típusú aritmetika használatára?

A következő kódban hibaüzenetet kapok, amikor a lebegőmutatót egy struktúrába gépelem, de a fordító nem panaszkodik, ha másra írok. Miért csinálja ezt?

typedef unsigned byte CELbool;
typedef struct {(...)} Color;
typedef struct {
    (...)
    Color color;
    CELbool b;
} Light;

Light _light;

void function(float *x) {
    _light.b = (CELbool)*x; // No error
    _light.color = (Color)*x; // (!) Used type 'Color' where arithmetic or pointer type is required
}

Szerkesztés: Mondjuk tehát, hogy az *x egy színre mutató mutató, akkor mi lenne a megfelelő módja annak, hogy megszerezzem ezt a színt? Jelenleg a Color c = *((Color *)(value))-t használom, de nem hiszem, hogy ez a megfelelő módja ennek.

07.03.2012

  • Nem irányítja a lebegő mutatót semmire; Ön a *x-t, a mutató referensét adja át, amelynek típusa float. 07.03.2012
  • Úszót próbálsz dobni egy szerkezetre... 07.03.2012
  • @EdS.: Ugyanazt a hibát kaptam különböző dolgoknál, amelyeket próbáltam, ezért először nem vettem észre. Megpróbáltam a mutatót egy színmutatóra irányítani, majd a hivatkozást megszüntetni. 07.03.2012

Válaszok:


1

Az Ön által végzett konverziók nem mutatókból egész számokká vagy struktúrákká konvertálnak, hanem lebegőpontokból egész számokká és struktúrákká. A kifejezés

(CELbool)*x

a *x értékét (amely, mivel a x egy float*, ezért egy float) egy CELBool-ba önti, amelyet typedef-ként definiáltál valamilyen integráltípushoz. Ez az átalakítás rendben van, mivel a C lehetővé teszi a lebegőpontos és az integrál értékek közötti konverziót, mivel van egy ésszerű módja az átalakításnak. A második szereposztás azonban az

(Color)*x

A Color egy struktúra, és a C nem határozza meg a lebegőpontos típusok és a structs közötti konverziókat, ahogyan az integrál típusok és a structs közötti konverziókat sem, mivel általában nincs ésszerű módja ennek az átalakításnak.

A "mutató vagy aritmetikai típus szükséges" hiba oka az, hogy a float-ből való átküldésnek valamilyen típusúra kell lennie, amelyre a floats konvertálható, ami vagy valamilyen valós értékű típus, egy integrál típus vagy egy pointer típusú, mivel a floats pointerekké alakítható (bár ez nagyon rossz ötlet!) A Color típust nem várja el a fordító listája az ésszerű dolgokról, innen ered a hiba.

Remélem ez segít!

07.03.2012
  • Tegyük fel tehát, hogy az *x egy színre mutató mutató, akkor mi lenne a megfelelő módja ennek a színnek a megszerzésére? Jelenleg a *((Szín *)(érték))-t használom, de nem hiszem, hogy ez a helyes módja ennek. 07.03.2012
  • Ha a x valóban egy Color-ra mutató mutató, akkor a *(Color *)x lenne a módja annak, hogy megkapjuk; ez azt mondja, konvertálja a x-et mutatóvá Color-re, majd törölje a hivatkozást. Ez azt jelenti, hogy miért mutat a x valójában egy Color-re, ha a paraméter egy float*? Ez aggasztónak tűnik. 07.03.2012
  • Az float *value ugyanaz, mint a float value[], a Color pedig három lebegés(r,g,b), ami float value[3]-ra egyszerűsödik. Az én módszerem valójában különféle dolgokat állítana be egy másik paramétertől függően. Valószínűleg a void*-ot kellene használnom, de a leggyakoribb bemenet a float. 07.03.2012
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..