Už asi pět dnů řeším chybovové hlášky ohledně incomplete type (struct). Chyby jsem už odstranil, ale nikdo mi nedokázal řádně vysvětlit: 1) co to vlastně je ten nekompletní typ (ohledně struktury) 2) jaké jsou jeho rozpoznávací znaky 3) čím se liší dvě struktury, které používám - proč u jedné musím při deklaraci objektu použít pointer a u druhého nemusím (když nepoužiju pointer tak to hodí chybu něco s neznámou velikostí u nekompletního typu).
Bod 3 je trochu více specifický a jde o to, že k funkcím na načtení obrázku (PNG, BMP) nebo pro zápis, potřebuju do funkce poslat objekt s informacemi (u PNG je to &data: jméno souboru, buffer, velikost souboru, kanály, atd. ; u BMP je to &bmpfile: tam posílám hlavně hlavičku, obsahující strukturu header a dib ). Obě struktury mají prakticky stejný tvar, obsahují podstruktury a členy typu char * nebo char **. Rozdíl je ale v tom, že u jedné při deklaraci objektu musím napsat ten pointer a bez toho to prostě nejde. A u té druhé (PNG_DATA data) si to klíďo píďo můžu napsat bez *. Na to mi nikdo nedokázal odpovědět. Takže jestli bude zájem tak sem pak pošlu ty typy abyste to mohli porovnat. Pod PNG_DATA jsem taky zkoušel dát ty samé structury co do BMPFILE a šlo to bez problému bez *.
Taky jsem nepochopil proč u BMP_FILE_struct musím použít deklaraci předem (forward) pomocí typedef:
struct BMP_FILE_struct; // forward declare
typedef struct BMP_FILE_struct BMPFILE;
struct BMP_FILE_struct {
BMPHEADER header;
BITMAPINFOHEADER dib;
}
a u toho PNG_DATA to mám zase jinak:
typedef struct PNG_DATA
{ ... }
Mohl by toto být zdoj toho rozdílného chování? Když tady odstraním typedef tak to zase bude hlásit někde jinde nějakou chybu ohledně "..." ale to teď kašlu - tuhle chybu řešit teď nechci. Ale asi kdybych ten tepedef odstranil, tak bych to musel deklarovat podobně jako PNG_DATA tedy pomocí forward deklarace a pak teprve psát struct? A ve výsledku bych dostal takový typ, že bych musel psát pointer PNG_DATA * data?.Případně naopak: kdybych ten BMP_FILE_struct napsal rovnou jako typedef, mohl bych to pak psát bez pointeru PNG_DATA?
Chci jen pochopit ty rozdíly a proč se to chová tak a tak. Asi nejsem jediný koho to dost mate, ale vidím, že to je zásadní k pochopení celé problematiky struktur a objektů.