Nowe posty

Autor Wątek: Program przetwarzający exe-ki: error: dereferencing pointer to incompl  (Przeczytany 3313 razy)

  • Gość
Podczas pisania programu przetwarzającego exe-ki napotkałem się na pewny problem...
Czy ktoś może wie co znaczy dany komunikat z gcc?

Cytuj
tomasz@darkstar:~$ gcc -Wall -Wextra -pedantic -g  -o test test.c
test.c: In function ‘main’:
test.c:14: warning: ISO C90 forbids mixed declarations and code
test.c:20: warning: ISO C90 forbids mixed declarations and code
test.c:27: error: dereferencing pointer to incomplete type
Kod mojego (jak na razie krótkiego programu to:
#include 
/* #include */
#include
#include "struct.c"

int main (){

        struct IMAGE_DOS_HEADER *dos_header;

FILE *f = fopen ("PROSIAK.EXE", "rb");

if (f == NULL) return 1;

int rozmiar;
fseek (f, 0, SEEK_END);
rozmiar = ftell (f);
fseek (f, 0, SEEK_SET);
printf ("%d\\n", rozmiar);

char *file = (char *)malloc(sizeof(char)*rozmiar);

if (file == NULL) return 2;

fread (file, 1, rozmiar, f);

dos_header = (struct IMAGE_DOS_HEADER*)file;
printf ("%d\\n", dos_header->e_magic);
free (file);

fclose (f);
return 0;
}
#pragma pack(push)
#pragman pack 1

typedef struct {
short int e_magic;
short int e_cblp;
short int e_cp;
short int e_crlc;
short int e_cparhdr;
short int e_minalloc;
short int e_maxalloc;
short int e_ss;
short int e_sp;
short int e_csum;
short int e_ip;
short int e_cs;
short int e_lfarlc;
short int e_ovno;
short int e_res[4];
short int e_oemid;
short int e_oeminfo;
short int e_res2[10];
short int e_elfanew;
} IMAGE_DOS_HEADER;

#pragma pack(pop)
ad. 2

Czy można jakoś wykorzystać pliki nagłówkowe z dev-cpp, żeby sobie na linuxie napisać program bez pisania nagłówków? Probowałem to sobie zainkludować ale gdy to zrobiłem to pojawiły się mnie dziwne komunikaty.

Wynik:

Cytuj
include/winnt.h:2049: error: expected specifier-qualifier-list before ‘BYTE’
include/winnt.h:2056: error: expected specifier-qualifier-list before ‘DWORD’
include/winnt.h:2074: error: expected specifier-qualifier-list before ‘DWORD’
include/winnt.h:2084: error: expected specifier-qualifier-list before ‘DWORD’
include/winnt.h:2097: error: expected specifier-qualifier-list before ‘DWORD’
include/winnt.h:2106: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘SECURITY_INFORMATION’
include/winnt.h:2107: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘SECURITY_DESCRIPTOR_CONTROL’
include/winnt.h:2109: error: expected specifier-qualifier-list before ‘BYTE’
include/winnt.h:2164: error: expected specifier-qualifier-list before ‘DWORD’
include/winnt.h:2170: error: expected specifier-qualifier-list before ‘DWORD’
include/winnt.h:2174: error: expected specifier-qualifier-list before ‘BOOLEAN’
include/winnt.h:2189: error: expected specifier-qualifier-list before ‘DWORD’
include/winnt.h:2200: error: expected specifier-qualifier-list before ‘DWORD’
include/winnt.h:2204: error: expected specifier-qualifier-list before ‘BOOLEAN’
include/winnt.h:2214: error: expected specifier-qualifier-list before ‘DWORD’
include/winnt.h:2220: error: expected specifier-qualifier-list before ‘DWORD’
Czy coś takiego może mieć coś wspólnego z unixową linią 10 a windowsową linuxa 10,13?

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Program przetwarzający exe-ki: error: dereferencing pointer to incompl
« Odpowiedź #1 dnia: 2010-12-30, 03:59:00 »
ad1)

Zmień
#pragman pack 1
na
#pragma pack(1)
.

IMAGE_DOS_HEADER jest zadeklarowany jako typ, a nie struktura.

zmień

struct IMAGE_DOS_HEADER *dos_header;
na

IMAGE_DOS_HEADER *dos_header;
ad2)

Kompilator nie zna typów BYTE, WORD, DWORD i t.d, dlatego traktuje je jako nazwy zmiennych (prawdopodobnie w strukturach) i wymaga podania typu (kwalifikatora) przed nazwą. Żeby ich używać musiałyby być wcześniej zadeklarowane.

Żeby używać tych nagłówków musiałbyś dołączyć wszystkie wymagane pliki nagłówkowe w odpowiedniej kolejności, poustawiać odpowiednie define'y i, przynajmniej teoretycznie powinno pójść.