Официальный сайт студ.городка НГТУ
Программирование и БД » [c]warning 

#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

#2  18.06.07 17:16

Re: [c]warning

ftell возвращает long. А у тебя amount наверняка другого типа. Отсюда и предупреждение.

Исправлено Zyleika (18.06.07 17:20)

Offline

#3  18.06.07 18:39

Re: [c]warning

деление целого на целое дает целое. Например, 3/2 = 1, 1/2 = 0. Вот тебе и потери. Если ты на 100% уверен, что там всё делится без остатка, то не обращай внимания на этот варнинг. Если он тебе надоел, можно его отключить наверно. В сутдии можно.

Offline

#4  18.06.07 22:04

Re: [c]warning

С этим разобрался, привел к int и предупреждения исчезли.
А по второй части поста навскидку может кто-нибудь что-нибудь подсказать?
Работа идет с файлами, структурами, динамическими объектами...

Offline

#5  18.06.07 22:27

Re: [c]warning

Выложи прогу полностью

Offline

#6  18.06.07 23:43

Re: [c]warning

Вторая часть поста к первой вряд ли отношение имеет. Ищи логическую ошибку в коде, что-то сам неправильно написал.

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

#9  19.06.07 15:03

Re: [c]warning

непонятно почему так происходит, ведь динамические объекты существуют, пока работает функция, следовательно и памятю должна каждый раз освобождаться.

Offline

#10  19.06.07 22:04

Re: [c]warning

Дональдак, хочешь сказать, что если я в подпрограмме выделить память, то после завершения этой подопрограммы, выделенная память освободится?
если ты её сам не освободишь, она никуда не денется. Останется занятая память, на которую никто ещё и не указывает, если ты сохранял адрес только в локальной переменной

Offline

#11  20.06.07 12:04

Re: [c]warning

Kosh_Mar, ладно, с этим понятно. Но почему несколько килобайт забивают всю память, и она больше не выделяется (если ее не освобождать). Где-то стоит ограничение?

Offline

#12  20.06.07 21:16

Re: [c]warning

Наверно где-то стоит. Я в этом тебе не помогу.

Offline

Программирование и БД » [c]warning 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.047 сек.
Выполнено 14 запросов.