/********************************************************************************************/
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
/********************************************************************************************/
struct Image
{
unsigned char *Data;
int width;
int height;
int color;
};
struct CImage
{
int width;
int height;
unsigned char *Data;
};
/********************************************************************************************/
struct Image TGA;
struct CImage BEF;
char *filename;
unsigned char header[6];
unsigned char bpp;
int size;
int n = 0;
/********************************************************************************************/
void ReadTGA(void);
void Convert(void);
void WriteBEF(void);
void Error(char *);
/********************************************************************************************/
int main()
{
printf("***************************6y6yka Engine Converter ver. 0.1*********************\n");
printf("Enter input file name please...\n");
scanf("%s",&filename);
printf("Reading start...\n");
ReadTGA();
printf("Reading end!!!\n");
printf("Converting start...\n");
Convert();
printf("Converting end!!!\n");
printf("Enter output file name please...\n");
scanf("%s", &filename);
printf("Writing start...\n");
WriteBEF();
printf("tyty!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
_getch();
return 0;
}
/********************************************************************************************/
void ReadTGA()
{
unsigned char temp = 0;
int i = 0;
FILE *file;
if (!(file = fopen(&filename, "rb")))
{
Error("Can't open file!");
}
fseek(file, 12, SEEK_SET);
fread(header,1,sizeof(header),file);
if (header[4] != 24)
{
Error("Bad file!");
}
TGA.color = header[4];
TGA.width = header[1] * 256 + header[0];
TGA.height = header[3] * 256 + header[2];
size = TGA.width * TGA.height * (TGA.color / 8);
TGA.Data = (unsigned char *)malloc(size);
fread(TGA.Data, 1, size, file);
for(i = 0; i < size; i += 3)
{
temp=TGA.Data;
TGA.Data = TGA.Data[i + 2];
TGA.Data[i + 2] = temp;
}
fclose(file);
}
void WriteBEF()
{
FILE *file;
if(!(file = fopen(&filename, "wb")))
{
Error("Can't open file");
}
fwrite(&BEF.width, sizeof(int), 1, file);
fwrite(&BEF.height, sizeof(int), 1, file);
fwrite(BEF.Data, n, 1, file);
fclose(file);
}
void Convert()
{
char BlackTemp = 0;
char WhiteTemp = 0;
int i = 0;
unsigned char TempData[100000];
for (i = 0; i < size; i = i + 3)
{
if (TGA.Data == 255 && TGA.Data == 255 && TGA.Data == 255)
{
WhiteTemp++;
if (WhiteTemp == 255)
{
TempData[n] = 255;
n++;
WhiteTemp = 0;
}
if (BlackTemp != 0)
{
TempData[n] = WhiteTemp;
n++;
BlackTemp = 0;
}
}
else if (TGA.Data == 0 && TGA.Data == 0 && TGA.Data == 0)
{
BlackTemp++;
if (BlackTemp == 255)
{
TempData[n] = 255;
n++;
BlackTemp = 0;
}
if (WhiteTemp != 0)
{
TempData[n] = BlackTemp;
n++;
WhiteTemp = 0;
}
}
}
BEF.width = TGA.width;
BEF.height = TGA.height;
BEF.Data = (unsigned char *)malloc(n);
for (i = 0; i < n; i++)
{
BEF.Data = TempData;
}
}
void Error(char *text)
{
printf("%s", text);
printf("\nPress any key to exit...\n");
_getch();
exit(0);
}
Проблема с fopen :-)
Программа работала. Перенес ее в Pelles С к своему двигу поближе так сказать :-) НО получил 2 ошибки такого содержания:
error #2140: Type error in argument 1 to 'fopen'; found 'char * *' expected 'const char *'.
Ругается на строчку: if (!(file = fopen(&filename, "rb")))
Файлнейм обьявлена так: char *filename;
Кто не прав? Я? Студия? или Pelles C?
а зачем ты пишешь: &filename ?
Если написать просто filename программа вылетает с ошибочкой :-(
Мысли, конечно есть. Но хоть бы ошибочку кинул ? а?
(ну и код, конечно, не помешает :)) )
замени попробуй на scanf("%s",filename);
и не забудь под filename память выделить. (из-за этого и слетает :)) )
Я так и думал, вот только сколько выделять? Как узнать сколько займет имя файла?
Максимальная длина файла в NTFS - 256 знаков. В FAT - только 11.
можно считать функцией getline строку (256 символов), а затем сосканить sscanf-ом.
1) Ему нужна не максимальная длина имени файла, а максимальная длина пути, т.е. 260.
2) Это в FAT16 ограничение на 11 символов (в FAT32 - 256), только где такая ФС еще существует? :-)
Цитата: Delphi-cs
Код:
void Convert()
{
char BlackTemp = 0;
char WhiteTemp = 0;
int i = 0;
unsigned char TempData[100000];
...
{
char BlackTemp = 0;
char WhiteTemp = 0;
int i = 0;
unsigned char TempData[100000];
...
:eek: Временный буффер фиксированной длины для картинки любого размера да еще и в стеке. Куда катится мир?
Ко всему выше перечисленному добавлю пожелание автору поста (Delphi-cs) забыть о глобальных переменных и учиться передавать все нужные данные в функции в виде параметров.