2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 
Сообщение07.12.2005, 20:10 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Есть надежный способ узнать - убрать #include <malloc.h> и попытаться скомпилировать. Возможны два исхода:
1) программа компилируется без warning'ов. Тогда скрипач (header) не нужен. (Возможно, прототипы есть в другом header'е. Или, и впрямь - не используются.);
2) компилятор шустро выдаст список неописанных функций.

Есть и другой метод, но он требует усилий. А именно - прочитать (и притом подробно) программу (якобы свою). И про каждую используемую функцию решить, где она описана - в этом ли же файле, али в header'е каком. И в каком именно. И что делает в Help'е посмотреть. Кстати, есть хорошее описание posix библиотеки в интернете: opengroup.org.

 Профиль  
                  
 
 
Сообщение07.12.2005, 21:06 


07/12/05
5
Ярославль
А есть еще один способ, самый надежный: открыть соответствующий header и посмотреть что в нем написано.

 Профиль  
                  
 
 
Сообщение07.12.2005, 21:28 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
В header нет, к сожалению, информации о том, какие из описанных функций использовались.

 Профиль  
                  
 
 
Сообщение07.12.2005, 21:34 


07/12/05
10
Спасибо за ответ! (Я протормозил мог бы и сам догадаться!)

 Профиль  
                  
 
 
Сообщение07.12.2005, 22:57 


27/11/05
183
Северодонецк
По-моему, пора уже давным-давно прикрыть эту лавочку (обсуждение задачи про стек).
Сколько можно говорить о такой пустячной программе, которая заняла у меня времени
всего десяток минут, а наговорили по ней уже на целую неделю...

 Профиль  
                  
 
 
Сообщение16.12.2005, 15:59 


07/12/05
10
Большое спасибо за программку, но позвольте задать последний вопрос:
при компиляции, не знаю как у вас, у меня появляются 37 warnings с сообщением
"conversion may lose significant digits", и, например, в строке free(prior_formula[i].n1); выделяется точка, стоящая между словом prior_formula[i] и n1 красным цветом!

Подскажите как исправить данную проблему! Я пробовал заменить free(prior_formula[i].n1) на
free(prior_formula[i]->n1), но ничего не получается! :(

 Профиль  
                  
 
 
Сообщение16.12.2005, 20:03 


27/11/05
183
Северодонецк
Замена free(prior_formula[i].n1) на free(prior_formula[i]->n1) говорит
о том, что вы не имеете четкого представления об операциях "." и "->"
Обязательно разберитесь с этим, это, как говорят у них в Одессе -
"две большие разницы". Я уж не говорю о том, что при такой замене вы должны
были получить уже не warning, а полноценный error.

Вы не говорите, в какой среде разработки у вас выполнялась компиляция.
У меня Visual Studio 6.0, там прототип free представлен примерно как

void free(void *)

Если у вас такой же прототип, то попробуйте "успокоить" компилятор
следующим образом:

free((void *)(prior_formula[i].n1))

А какого типа предупреждение было для free(prior_formula[i].n1)?

Вы говорите также о других 37 warnings, хотелось бы получить хоть
один оператор, который спровоцировал такое предупреждение.

Обычно такое предупреждение появляется при присваивании данному с меньшей
разрядностью данного с большей разрядностью, например:

char c;
long l;

c = l; // Здесь будет предупреждение
c = (char)(l); // Избавились от предупреждения

 Профиль  
                  
 
 
Сообщение16.12.2005, 21:04 


07/12/05
10
Я пишу проги в компиляторе BORLAND C++ v 3.1! Вот по этому у меня и появляются эти ворнинги! Вот ещё пример ворнинга: при компиляции в операторе n1=out[d1]; он, почему-то
выделяет знак ";"

Подскажите пожалуйста как исправить прогу, чтобы этих ворнингов не было!

 Профиль  
                  
 
 
Сообщение16.12.2005, 21:08 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Therion17 писал(а):
Подскажите пожалуйста как исправить прогу, чтобы этих ворнингов не было!


Поменять настройки компилятора :D

 Профиль  
                  
 
 
Сообщение16.12.2005, 21:34 


07/12/05
10
PAV писал(а):
Therion17 писал(а):
Подскажите пожалуйста как исправить прогу, чтобы этих ворнингов не было!


Поменять настройки компилятора :D


А вы можете подсказать куда нужно заходить и что менять ,просто я в этом плохо разбираюсь. Компилятор у меня BORLAND C++ v 3.1

 Профиль  
                  
 
 
Сообщение16.12.2005, 23:16 


27/11/05
183
Северодонецк
На Borland я программировал очень давно и очень удивлен, что (российские?)
студенты изучают язык программирования C в этой версии (или это требование деканата?).
К сожалению, руководства по этой версии я уже выбросил - может быть там, как и
в Visual Studio, есть псевдооператор #pragma, который может подавлять warning?
А вообще-то, если вы хотите какой-то помощи, могли бы сообщить полностью
все сообщения компилятора. А так приходится гадать - что там у вас компилятор соорудил...

 Профиль  
                  
 
 
Сообщение16.12.2005, 23:26 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Замените long на int (всюду). Они здесь совсем не в тему. Индексы массивов все равно длинными быть не могут... Поэтому индексное выражение преобразуется в int с потерей значимости и выдачей предупреждения. Насколько я сумел понять Ваши примеры, это - основной источник. Хотя могут быть и другие.

Интересно, а почему были long написаны изначально? Должна же была быть какая-то мотивировка. И писать ведь лишнюю букву надо :D

 Профиль  
                  
 
 
Сообщение17.12.2005, 01:06 


27/11/05
183
Северодонецк
Мотивировка простая - в Visual Studio int и long одного размера (32 бита), а вот
в некоторых версиях C размер int и long отличается, хотя long практически
везде (за исключением Java) занимает 32 разряда.

Товарищ (инициатор темы) ведь ничего не говорил о СРЕДЕ ПРОГРАММИРОВАНИЯ,
а только о программке...

А так что-то писать на все версии компиляторов - никакой жизни не хватит.
Хотя C и задумывался с благородной целью достижения мобильности программного
обеспечения, на самом деле даже внутри одной конторы-производителя
версии компиляторов могут быть несовместимы.

Например, практически все компиляторы (даже Java) неверно выполняют сдвиг
для некоторых величин сдвига переменных 64-разрядных типа LONGLONG...

 Профиль  
                  
 
 
Сообщение17.12.2005, 01:18 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
С риском обмануть Вас, но я припоминаю, что на Solaris 8 long был 64-битным. В целом я не согласен с Вашей мотивировкой выбора типа. С типом (а не с длиной) связан набор операций. Хотим мы этого или нет, но индексация всегда int, равно как и сумма/разность указателей. И в printf(), и в alloc() возникает напряженка. А если игнорировать предупреждения компилятора, то влетаешь и вовсе в серое никуда - например, заказываешь 64K+1 памяти, а получаешь байт. И пялишься на экран в отладчике - в переменной все правильно, а буфер переполняется. И пока не перйдешь в ассемблер, не поймешь.

 Профиль  
                  
 
 
Сообщение17.12.2005, 02:41 


27/11/05
183
Северодонецк
Речь у меня шла о МОБИЛЬНОСТИ программного обеспечения. Гораздо меньше риска
с переносом программ C с одной платформы на другие, имея данные long, а не int, которые
(int) очень часто эквивалентны short (16 разрядов, если следовать вашему примеру 64K + 1 как раз и дадут переполнение именно для short). Если у вас есть программа, для которой
целочисленные данные типа long, а не int, то хлопот с переносом намного уменьшится.
Особенно это актуально для структуры, когда эта структура наряду с явным обращением
к ее отдельным элементам может рассматриваться как сплошной поток байтов.
И вот тут, если у вас будет тип int, то наверняка программа не будет работать там,
где этот int эквивалентен short, а не long.

Недаром Мелкософт старается не использовать родные типы long или int, а для
пущей мобильности использует макросы DWORD, WORD и так далее...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Dmitriy40


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group