Новичок
Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.1.2008
Репутация: нет Всего: нет
|
Здравствуйте! Программа должна работать с файлом *.pcx . Однако при линковке возникает ошибка, которая находится в пустой строке, следующей за последней сторокой кода. Используемая версия Студии 6.0. На более новых версиях всё отлично компилится и работает. Код прилагается. Посоветуйте пожалуйста как избавиться от такой досадной ошибки! | Код |
#include <stdlib.h> #include <stdio.h> #include <memory.h> #include "PCX_IO.h"
#define UCHAR unsigned char #define BYTE unsigned char
static int align_to_word(int value) { return value+=(value%2); }
static unsigned short int Swap(unsigned short int i) { #ifdef __SUN__ return (unsigned short int) (i >> 8) + (i << 8); #else return i; #endif }
static void makeSunHeader(struct PCXHeader *Header) { Header->X1 = Swap(Header->X1); Header->Y1 = Swap(Header->Y1); Header->X2 = Swap(Header->X2); Header->Y2 = Swap(Header->Y2);
Header->HResolution = Swap(Header->HResolution); Header->VResolution = Swap(Header->VResolution);
Header->BytePerLine = Swap(Header->BytePerLine); Header->PaletteInfo = Swap(Header->PaletteInfo); Header->SHResolution = Swap(Header->SHResolution); Header->SVResolution = Swap(Header->SVResolution); }
unsigned char* ReadPCX(char Name[], int *XSize, int *YSize) { FILE *f; long i = 0; struct PCXHeader Header; long PackedImageSize; UCHAR *PackedImage; UCHAR *PackedBytes; long PackCount; long sizeX; int GrayWidth,j; unsigned char* lpGrayDIB; unsigned char* Image; unsigned int j1;
if (!(f = fopen(Name, "rb"))) { printf("File not found\n"); return NULL; } fread(&Header, sizeof(struct PCXHeader), 1, f);
#ifdef __SUN__ makeSunHeader (&Header); #endif
if (Header.PlanesNumber != 1 || Header.BitPerPixel != 8 || Header.ZsoftSign != 10 || Header.Version != 5) { fclose(f); printf("File isn't a Grayscale og 256-inexed color PCX file\n"); return NULL; } *YSize = Header.Y2 - Header.Y1 + 1; if ((*XSize = Header.X2 - Header.X1 + 1) % 4) sizeX = (long)(*XSize / 4) * 4 + 4; else sizeX = *XSize; fseek(f, 0, SEEK_END); PackedImageSize = ftell(f); if (!( (PackedImage = (unsigned char *) malloc(PackedImageSize+100)) && (lpGrayDIB = (unsigned char *) malloc(sizeX * *YSize )) && (Image = (unsigned char *) malloc(*XSize * *YSize)))){ fclose(f); free(PackedImage); free(lpGrayDIB); printf("Can not allocate memory for buffer\n"); return NULL; } fseek(f, sizeof(struct PCXHeader), SEEK_SET); fread(PackedImage, PackedImageSize, 1, f); PackedBytes = PackedImage; GrayWidth = *XSize + (*XSize % 2);
for (i = 0; i < *YSize; i++) { j1 = 0; while (j1 < (unsigned long) Header.BytePerLine) if (*PackedBytes > (BYTE)191) { // why ? PackCount = *(PackedBytes++) ^ (unsigned char) 0xC0; memset(&(lpGrayDIB[i * GrayWidth + j1]), (int)* (PackedBytes++),PackCount); j1 += PackCount; } else { lpGrayDIB[i * GrayWidth + j1] = *(PackedBytes++); j1++; } } free(PackedImage); if (Header.PaletteInfo == 2) for (i = 0; i < *YSize; i++) for (j = 0 ; j < *XSize; j++) Image[i * (*XSize) + j] = lpGrayDIB[i * GrayWidth + j]; else { unsigned char Palette[768]; unsigned long IndexOfColor; double Gray; fseek(f, PackedImageSize - 768, SEEK_SET); fread( Palette, 768, 1, f ); for (i = 0; i < *YSize; i++) for (j = 0 ; j < *XSize; j++){ IndexOfColor = lpGrayDIB[i * GrayWidth + j] * 3; Gray = 0.299 * Palette[IndexOfColor ] + 0.587 * Palette[IndexOfColor + 1] + 0.114 * Palette[IndexOfColor + 2]; if (Gray > 255.0) Gray = 255.0; else if (Gray < 0.0) Gray = 0.0; Image[i * (*XSize) + j] = (unsigned char) (Gray + 0.5); } } fclose(f); free(lpGrayDIB); return Image; }
static void makeHeader(struct PCXHeader *Header, int XSize, int YSize, int planesNumber, int bytePerLine, int paletteInfo) { // int i; Header->ZsoftSign = 0x0a; Header->Version = 5; Header->GroupCoding = 1; Header->BitPerPixel = 8; Header->X1 = 0; Header->Y1 = 0; Header->X2 = (unsigned short int)(XSize - 1); Header->Y2 = (unsigned short int)(YSize - 1); Header->HResolution = (unsigned short int) XSize; Header->VResolution = (unsigned short int) YSize; Header->SHResolution = (unsigned short int) XSize; Header->SVResolution = (unsigned short int) YSize; Header->PlanesNumber = (UCHAR) planesNumber; Header->BytePerLine = (unsigned short int)bytePerLine; Header->PaletteInfo = (unsigned short) paletteInfo; Header->VideoMode = 1; memset(Header->EGAPalette,0,48); memset(Header->Reserve,0,54); }
static void writeChannelLine(FILE *f, UCHAR *Image, int XSize, long int line) { long int i; UCHAR data, cnt;
for (i=0; i < XSize;fwrite(&data,1,1,f)) { for (data=Image[i+line*XSize],cnt=1; ((i+cnt)<XSize && data == Image[i+cnt+XSize*line] &&cnt<63); cnt++); i += cnt; if (cnt > 1 || data >= 0xc0){ cnt |= 0xc0; fwrite(&cnt, 1, 1, f); } } }
static void writeRGBChannels(FILE *f, UCHAR **Image, int XSize, int YSize) { UCHAR data = 0; int i; long int line; for (line = 0; line < YSize; line++) for (i=0;i<3;i++) { writeChannelLine(f,Image[i],XSize,line); fwrite(&data, 1,XSize%2, f); } }
static FILE *writeHeader_(char Name[], int XSize, int YSize, int planeNumber, int bytePerLine, int paletteInfo) { struct PCXHeader Header; FILE *f; makeHeader(&Header,XSize,YSize,planeNumber,bytePerLine,paletteInfo); #ifdef __SUN__ makeSunHeader (&Header); #endif if(!(Name&&Name[0] && (f = fopen(Name, "wb")))) return NULL; fwrite(&Header, sizeof(struct PCXHeader), 1, f); return f; }
static int writePaletteAndClose(FILE *f) { int j; UCHAR Palette[768]; UCHAR data = 0x0c; fwrite(&data, 1, 1, f); for(j = 0; j < 256; j++) memset(&(Palette[j*3]),(UCHAR) j,3); fwrite(Palette, sizeof(Palette), 1, f); return fclose(f); }
int WritePCX(unsigned char *Image, int XSize, int YSize, char Name[]) { long int line; FILE *f = writeHeader_(Name,XSize,YSize,1,XSize,2);
if (!f) return -1; for (line = 0; line < YSize; line++) writeChannelLine(f,Image,XSize,line); return writePaletteAndClose (f); }
int ReadTrueColorPCX(char* Name, int *XSize, int *YSize, unsigned char** RImage, unsigned char** GImage, unsigned char** BImage) { long int i = 0, j,k,l; long PackedImageSize; unsigned char* PackedImage; unsigned char* PackedBytes; int PackCount; int length; int size; unsigned char* pPcxImage; unsigned char* pPcxPtr; struct PCXHeader Header; FILE* f = fopen(Name, "rb");
*XSize = 0; *YSize = 0;
if (!f) { printf("File not found\n"); return -2; } fseek(f, 0, SEEK_SET); fread(&Header, sizeof(struct PCXHeader), 1, f);
#ifdef __SUN__ makeSunHeader (&Header); #endif
if (Header.PlanesNumber!=3 || Header.BitPerPixel!=8 || Header.ZsoftSign!=10 || Header.Version!=5 || Header.PaletteInfo!=1) { fclose(f); return -2; } *XSize = Header.X2 - Header.X1 + 1; *YSize = Header.Y2 - Header.Y1 + 1; size = *XSize**YSize; length = align_to_word(*XSize); fseek(f, 0, SEEK_END); fseek(f, sizeof(struct PCXHeader), SEEK_SET); PackedImageSize = ftell(f)-sizeof(struct PCXHeader); if(!( (PackedBytes = PackedImage = (unsigned char*)malloc(PackedImageSize + 100))) && (pPcxPtr = pPcxImage = (unsigned char*)malloc(size*3)) ) { fclose(f); if(PackedImage) free(PackedImage); if(pPcxImage) free(pPcxImage); return -1; } fread(PackedImage, PackedImageSize, 1, f); fclose(f); while (i < *YSize * length * 3) { if (*PackedBytes > (unsigned char)0xC0) { PackCount = *(PackedBytes) ^ (unsigned char)0xC0; PackedBytes++; memset (pPcxPtr, *PackedBytes, PackCount); PackedBytes++; i += PackCount; pPcxPtr += PackCount; } else { *pPcxPtr++ = *PackedBytes++; i++; } } free(PackedImage); if (!( (*RImage = (unsigned char*)malloc(size)) && (*GImage = (unsigned char*)malloc(size)) && (*BImage = (unsigned char*)malloc(size)))) { if(pPcxImage) free(pPcxImage); if(*RImage) free(*RImage); if(*GImage) free(*GImage); if(*BImage) free(*BImage); *RImage = *GImage = *BImage=NULL; return -1; } for (i=k=0; i<*YSize; i++) for (l=i*length*3,j=0; j<*XSize; j++,k++,l++) { *RImage[k] = pPcxImage [l ]; *GImage[k] = pPcxImage [l+length ]; *BImage[k] = pPcxImage [l+2*length]; } free (pPcxImage); return 0; }
int WriteTrueColorPCX(char* Name, int XSize, int YSize, unsigned char* RImage, unsigned char* GImage, unsigned char* BImage) { UCHAR *image[3] = {RImage,GImage,BImage}; FILE *f = writeHeader_(Name,XSize,YSize,3,align_to_word(XSize),1); if (!f) return EOF; writeRGBChannels(f,image,XSize,YSize); return fclose(f); }
|
А вот какая ошибка: | Код | Compiling... pcx_io.cpp c:\program files\microsoft visual studio\myprojects\pcx\pcx_io.cpp(318) : fatal error C1010: unexpected end of file while looking for precompiled header directive Error executing cl.exe.
pcx_io.obj - 1 error(s), 0 warning(s)
|
Это сообщение отредактировал(а) MAKCim - 5.1.2008, 21:07
|