#1 18.06.07 16:33
[c]warning
Подскажите пожалуйста!
есть файл, в нем хранятся однотипные записи (структура)
определяю количество записей файле:
fseek(fstream, 0L, 2);
amount=ftell(fstream)/sizeof(structure);
В последней строчке компилятор выдает мне предупреждение:
Conversion may lose significant digits. Что это значит?
такое предупреждение вываливается в каждой подобной строчке.
Вроде все работает корректно, хотя иногда теряются записи из структуры:
пишется <null> вместо них и может вылететь программа или заголовки меню превращаются в набор всяких знаков.
Но это наверное не причем здесь, просто хотелось бы выяснить смысл этого предупреждения или просто предположения почему такое может возникнуть.
Код большой, нет смысла его здесь выкладывать.
Исправлено Дональдак (18.06.07 16:37)
Offline
#3 18.06.07 18:39
Re: [c]warning
деление целого на целое дает целое. Например, 3/2 = 1, 1/2 = 0. Вот тебе и потери. Если ты на 100% уверен, что там всё делится без остатка, то не обращай внимания на этот варнинг. Если он тебе надоел, можно его отключить наверно. В сутдии можно.
Offline
#7 19.06.07 09:16
Re: [c]warning
Там слишком большй код. Ошибку я уже не один день ищу, может дело в динамической памяти или файловых потоках...
Вот одна из функций при частом запуске которой за один сеанс такое происходит (еще в паре других тоже):
Код: с++:
struct patient
{
int id, del;
char surname[LENGTH], name[LENGTH], fathername[LENGTH];
};
struct timetable
{
char surname[LENGTH], name[LENGTH], fathername[LENGTH], speciality[LENGTH];
int number, start, finish, dt, patients[DAYS][MAX_PAT];
};
void Print_Timetable_Doctor(FILE *patients, FILE *time)
{
char str1[LENGTH], str2[LENGTH];
long position1, position2, end;
int i, j, limit, id, pos1=0, pos2;
timetable *tmp=new timetable;
patient *p=new patient;
fseek(patients, 0L, 2); end=ftell(patients);
printf("Enter speciality of doctor:\n");
scanf("%s", str1);
while(Check_Word(str1)==0)
{
printf("\nError!\n");
printf("Enter speciality of doctor:\n");
scanf("%s", str1);
}
printf("Enter surname of doctor:\n");
scanf("%s", str2);
while(Check_Word(str2)==0)
{
printf("\nError!\n");
printf("Enter surname of doctor:\n");
scanf("%s", str2);
}
position1=Find_Timetable(str1, str2, time);
if(position1==-1L) { printf("\nDoctor was not found!"); getch(); return; }
fseek(time, position1, 0); fread(tmp, sizeof(timetable), 1, time);
clrscr();
printf("\n\n\tTimetable for current week.\n\n");
printf("%d: %s, %s\n\n", (tmp->number), (tmp->speciality), (tmp->surname));
limit=((tmp->finish)-(tmp->start))*60/(tmp->dt);
for(i=0; i<DAYS; i++)
{
gotoxy(5, Y+i+pos1); printf("day%d: ", i+1); pos2=0;
for(j=0; j<limit; j++)
{
id=(tmp->patients[i][j]);
position2=Find_Patient(patients, sizeof(int), end, id);
gotoxy(10+pos2, Y+i+pos1); pos2+=5;
if(position2==-1L) printf(" - ");
else { fseek(patients, position2, 0); fread(p, sizeof(patient), 1, patients);
printf(" %d ", (p->id)); }
}
pos1++;
}
}
Offline
#8 19.06.07 10:25
Re: [c]warning
вставил строчку:
if(tmp==NULL) { printf("\nError!"); getch(); return; }
раза с 7 так и получается.
Действительно, ошибка в выделении памяти. Хотя размер структуры всего 668 байт.
Как быть с этой проблемой?
Ставить цикл не помогает, он уходит в бесконечность.
Исправлено Дональдак (19.06.07 10:26)
Offline
#10 19.06.07 22:04
Re: [c]warning
Дональдак, хочешь сказать, что если я в подпрограмме выделить память, то после завершения этой подопрограммы, выделенная память освободится?
если ты её сам не освободишь, она никуда не денется. Останется занятая память, на которую никто ещё и не указывает, если ты сохранял адрес только в локальной переменной
Offline

