Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: foreground
Дата сообщения: 01.02.2008 13:39
Извините Qraizer, но сейчас у меня появился косяк, до этого его не было.
Проблема в следующем при компиляции с .def-файлом среда его не учитывает. Все остальные варианты без .def неправильно называют экспортируемую функцию, поэтому я от них отказался.
Автор: nick7inc
Дата сообщения: 01.02.2008 17:42
Добрый всем день. Я изучаю программирование на C++ (MinGW). Столкнулся с одной проблемой: неправильно выполняется одна функция в программе. [more=далее]Текст её следующий:
Код: typedef unsigned int DWORD;
inline static unsigned char addr2hash (const DWORD ptr) __attribute__ ((const, always_inline))
{
DWORD low = ptr & 0x0000FFFF;
DWORD hi = (ptr & 0xFFFF0000) >> 16;
DWORD result = low ^ hi;
low = result & 0x00FF;
hi = (result & 0xFF00) >> 8; // <-тута получается hi=low;
result = low ^ hi;
low = (result & 0x0F);
hi = ( (result & 0xF0) >> 4);
result= low ^ hi ;
return (result & 0x0F);
}
Автор: akaGM
Дата сообщения: 01.02.2008 18:57
nick7inc
тоже странно...
у меня тоже 3.4.2, но даже на отдельной функе ошибка компиляции на заголовок:

Цитата:
error: attributes are not allowed on a function-definition

именно ошибка, а не варнинг, а вообще __attribute__ -- вроде деприкатед макрос...
попробуй убери его, вроде inline и const уже описаны...
Автор: Bender_R
Дата сообщения: 01.02.2008 20:30
nick7inc
есть мнение, что все дело в __attribute__ ((const, always_inline))


Цитата:
A static member function cannot be declared with the keywords virtual, const, volatile, or const volatile.
Автор: Qraizer
Дата сообщения: 01.02.2008 20:42
foreground, э-э-э... при чём тут какие-то def? Какое они имеют отношение к STLPort-у?
Автор: akaGM
Дата сообщения: 01.02.2008 20:58
nick7inc
да, это я сглупил: в определении нельзя, а в декларации можно...


Цитата:
Я изучаю программирование на C++

кстати, видишь, получается, что ты отвлекаешься на частности конкретной реализации, которые туманят сам язык...
Автор: foreground
Дата сообщения: 03.02.2008 10:48
to Qraizer, извиняюсь )) проблему решил .. домой пришел тут STLport-а небыло получил такуюже фигу в Release )) .. забыл вобщем в релизе указать /DEF:.\deffile.def, все ок! компилит
Автор: riial
Дата сообщения: 03.02.2008 19:39
с чего начать чтоб научиться в 30 лет С++
Автор: akaGM
Дата сообщения: 03.02.2008 20:11
riial
смотри лучше путеводитель по форуму раздел С++...

Цитата:

3) Путеводитель по темам форума
3.1 Общие вопросы
Обучение и начало программирования на С++ [?]
Вопросы по программированию на С++ [?]
стоит ли сейчас учить Си [?]
стоит ли использовать goto? [?]
стоит ли использовать goto? 2 [?]
саммый минимум на языке С/С++? [?]
хочу начать учить с++ [?]
Как научиться программировать на С++ ПРОФЕССИОНАЛЬНО [?]
Автор: TeXpert
Дата сообщения: 03.02.2008 20:40
riial
Ясно же, это зависит от втоего багажа/склада ума. Подробности в студию! Думаю, легче всего математикам -- у кого с абстрактным мышлением проблем нет. Кстати, недавно тут пробегала книга, типа C++ для математиков, но на аглицком.
А так, посмотри книги Липпмана, да и самого Страуструпа.
Автор: Bender_R
Дата сообщения: 03.02.2008 22:23
riial
в добавление к сказанному TeXpert: как кик-старт, неплох Шилдт. Липпман, конечно, крут. Страуструпа на голодный желудок читать будет тяжко.
Автор: veronica b
Дата сообщения: 05.02.2008 22:32
mozgodrocha

Цитата:
Народ, словил непонятный глюк. Работоспособность проги зависит от порядка объявления переменных... Т.е.
float a;
int b;
работает, а:
int b;
float a;
валится с ошибкой Access violation... Просто меняю порядок следования двух соседних строк. Что это может быть? Может просто оставить рабочий вариант? Но страшно что-то.

При рабочем варианте переменная float a помещается по адресу, кратному 4 и её размер также 4 байта. Следующая переменная int b помещается, имеющая размер 2 байта помещается по правильному адресу. В нерабочем варианте 4-х байтная переменная помещается поадресу, не кратному четырем.
Ваш компилятор 16 разрядный, то есть размер int равен двум. Если это так, то моя гипотеза верна!
Автор: Bender_R
Дата сообщения: 05.02.2008 23:02
veronica b

Цитата:
Ваш компилятор 16 разрядный, то есть размер int равен двум.

а sizeof(float) точно равен 4 в этом случае?
Автор: veronica b
Дата сообщения: 06.02.2008 09:13
Bender_R

Цитата:
а sizeof(float) точно равен 4 в этом случае?

Всегда! Смотрите IEEE Standard 754 for Binary Floating-Point Arithmetic.

Автор: stazher
Дата сообщения: 06.02.2008 10:47
Hi all! Подскажите плз как в Visual C++ 2005 вывести строку s типа char в MessageBox. В VC++ 6 можно было написать MessageBox(s) или явно MessageBox("hallo"), в VC++ 2005 если явно, то пишется MessageBox(_T("hallo")) или MessageBox(L"hallo") чтоб преобразовать символы в wchar_t. А как неявно? MessageBox(_T(s)) или
MessageBox(L(s)) не катит...
Автор: WiseAlex
Дата сообщения: 06.02.2008 11:17
stazher
сделать не-юникод проект
Автор: Bender_R
Дата сообщения: 06.02.2008 11:27
stazher

использовать TCHAR, например.

Код:
TCHAR msg[] = _T("bender");
MessageBox(msg);
Автор: stazher
Дата сообщения: 06.02.2008 11:34
WiseAlex
Спасибо. Че-то такое подозревал.

Получается реально нет функции строку char в wchar_t перегонять?

Bender_R
Так-то я могу! Или так
wchar_t s[] = L"hallo";
MessageBox(s);

А если вместо "hallo" стоит абстрактная str, резалт работы других функций?
Автор: Bender_R
Дата сообщения: 06.02.2008 11:50
stazher

можно глянуть здесь
TCHAR все-таки попробовать можно.
Автор: akaGM
Дата сообщения: 06.02.2008 13:09
Bender_R
veronica b

да наверняка не в этом дело куда там и что помещается и по какому адресу...
у него, небось, рядом с этими a и b стоит указатель, с которым он некорретно работал и писал много байт не по его адресу а прямо в него, тем самым затирал соседнюю память...
затирается а или b, первой используется а -- программа ломается, а когда затирается b,
то дело до неё может вообще не доходить...
тоже гипотеза...
но в её подтверждение говорит тот факт, что человек спросил и надолго исчез...
т.е. он нашёл ошибку и дело было естественно не в порядке следования объявлений...
Автор: veronica b
Дата сообщения: 06.02.2008 14:01
akaGM, вся фишка в том, что такое было у меня летом 1997 года на 486 процессоре 100 МГц под 16 - разрядную MS-DOS на компиляторе Borland C++ 4.52. Только вместо float был у меня long. Как оказалось, я это запомнил на всю жизнь.

Цитата:
затирается а или b, первой используется а -- программа ломается, а когда затирается b, то дело до неё может вообще не доходить...
тоже гипотеза...

Ну, это слишком просто было бы.

Цитата:
но в её подтверждение говорит тот факт, что человек спросил и надолго исчез...
т.е. он нашёл ошибку и дело было естественно не в порядке следования объявлений...

С этим не могу согласиться.

Автор: akaGM
Дата сообщения: 06.02.2008 14:24

Цитата:
Ваш компилятор 16 разрядный, то есть размер int равен двум.

а я с этим не могу согласиться...
у него компилятор 8-разрядный, он на Z-Спектруме сидит и размер int у него = sizeof(int)
и моя вторая специальность -- аналитик-криминалист
гы-гы
Автор: Abs62
Дата сообщения: 06.02.2008 16:42
veronica b

Цитата:
Всегда! Смотрите IEEE Standard 754 for Binary Floating-Point Arithmetic.

Говоря о языке, стоит опираться на стандарт именно языка, а не железа. А он говорит, что "The value representation of floating-point types is implementation-defined".

Цитата:
вся фишка в том, что такое было у меня летом 1997 года на 486 процессоре 100 МГц под 16 - разрядную MS-DOS на компиляторе Borland C++ 4.52.

А можно взглянуть на пример кода, для которого подобные вещи критичны?
Автор: Bender_R
Дата сообщения: 06.02.2008 17:03
Abs62

Цитата:
Говоря о языке, стоит опираться на стандарт именно языка, а не железа. А он говорит, что "The value representation of floating-point types is implementation-defined".


вот и я вчера наткнулся в 3.9.1/8 на эту строчку.


Добавлено:
stazher

Цитата:

Так-то я могу! Или так
wchar_t s[] = L"hallo";
MessageBox(s);

А если вместо "hallo" стоит абстрактная str, резалт работы других функций?


что значит абстрактная str? тогда пробуйте использовать CString.

Код:
    char b2[] = "bender (char)";
    TCHAR b3[] = _T("bender (tchar)");

    CString msg2 = CString(b2);
    MessageBox(msg2);

    msg2 = b3;
    MessageBox(msg2);
Автор: veronica b
Дата сообщения: 06.02.2008 17:27
akaGM

Цитата:
а я с этим не могу согласиться...
у него компилятор 8-разрядный, он на Z-Спектруме сидит и размер int у него = sizeof(int)
и моя вторая специальность -- аналитик-криминалист
гы-гы

Незнаю вашу первую специальность, но точно не программист. Компиляторов 8-и разрядных не бывает, они просто могут работать на 8-и разрядной машине. Разрядность компилятора определяется разрядностью типа данных int, а она бывает только или 16 или 32 бита!
гы-гы - это у вас врожденное?
Abs62, есть реализации языка Си вообще без плавающей точки, но если в языке есть плавающая точка, то только по этому стандарту. Начиная с 1985 года, все компьютеры в мире придерживаются этого IEEE Standard 754 стандарта!

Цитата:
А можно взглянуть на пример кода, для которого подобные вещи критичны

Он же привел пример кода!

Автор: Abs62
Дата сообщения: 06.02.2008 18:09
veronica b

Цитата:
Начиная с 1985 года, все компьютеры в мире придерживаются этого IEEE Standard 754 стандарта!

И почему тогда это не зафиксировано в стандарте языка?

Цитата:
Он же привел пример кода!

Где? Одного объявления переменных недостаточно для понимания сути происходящего.
Автор: veronica b
Дата сообщения: 06.02.2008 18:34
Abs62

Цитата:
И почему тогда это не зафиксировано в стандарте языка?

Вы считаете, что я это должен знать?

Цитата:
Где? Одного объявления переменных недостаточно для понимания сути происходящего.

В данном случае достаточно. Вспомните условие проблемы, только при перестановки объявлений проявлялся сбой. Все остальное не менялась.

Автор: akaGM
Дата сообщения: 06.02.2008 18:48
veronica b

Цитата:
Он же привел пример кода!
В данном случае достаточно

в данном случае Abs62 просит пример _твоего_ кода, приводящего к такого рода проблеме...


Цитата:
Незнаю вашу первую специальность, но точно не программист

точно... -- математик, специальность мат.физика, если так интересно...

Цитата:
гы-гы - это у вас врожденное?

да, зато пишу не на албанском...
Автор: Abs62
Дата сообщения: 06.02.2008 18:48
veronica b

Цитата:
Вы считаете, что я это должен знать?

Согласен на гипотезу.

Цитата:
В данном случае достаточно. Вспомните условие проблемы, только при перестановки объявлений проявлялся сбой. Все остальное не менялась.

Так вот меня и интересует, каким же должно быть всё остальное, чтобы при перестановке объявлений проявлялся сбой. Или это должно аукаться в любом коде?
Автор: veronica b
Дата сообщения: 06.02.2008 19:37
akaGM

Цитата:
в данном случае Abs62 просит пример _твоего_ кода, приводящего к такого рода пробле

Математик, а даты плохо понимаете, я написал летом 1997 года. Прошло больше 10 лет.
Abs62

Цитата:
Согласен на гипотезу.

Начиная с 1985 года, все компьютеры, в котором была аппаратная реализация плавающей точки, использовали этот стандарт!

Цитата:
Или это должно аукаться в любом коде?

Все верно, но только без вопросительного знака. Сбой происходит при обращении к одной из этих переменных.


Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.