1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
|
|
1 | |
С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки?17.06.2012, 23:23. Показов 5930. Ответов 54
Метки нет (Все метки)
1
|
17.06.2012, 23:23 | |
Ответы с готовыми решениями:
54
JavaScript является каким то подразделом Java, или это совершенно разные языки? Чем они отличаются.. Чем они отличаются и какую приобрести? посмотрите чем они отличаются и какой лучше |
26.06.2012, 11:57 | 41 |
На intel'е в 32-битном режиме будет корректный вывод (причём стабильный). На sparc v9, например, работать не будет, т.к. под ихние программные соглашения в данном примере звёзды в правильной ориентации не встанут
1
|
26.06.2012, 13:12 | 43 |
Ну дык я и говорю о том, что звёзды встали нужным образом. printf ожидал достать из списка неименованных аргументов указатель на строку. Но в данном участке памяти лежала структура, по счастливой случайности у которой первое поле представляло собой указатель на строку. Поскольку в памяти нет никаких границ между объектами, а лежат просто данные, то printf прочитал из нужного места стека 4 байта, трактовал их как указатель на строку и случилось чудо
1
|
22 / 16 / 1
Регистрация: 15.10.2011
Сообщений: 305
|
|
26.06.2012, 13:50 | 44 |
Так все-таки где конкретика НЕХИЛОГО нарушения стандартов, и чем он в этом плане хуже других был. Заявить что-то и сказать, что не требуйте доказательств... Вы же не Бог, упаси меня Господь.
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
26.06.2012, 16:11 | 45 |
nanex, конкретика была ниже, на счёт неверного разрешения перегрузки функций. Также на этом форуме обсуждались и более глубокие вещи, с которыми редко, но можно столкнуться (хотя я уже не помню, какие именно, но их хватило, чтобы я оставил этот компилятор). Хочется также сказать, что я не агитирую против использования мелкомягкого компилятора, так что не вижу смысла в подобных наездах.
1
|
26.06.2012, 16:53 | 46 |
Из темы ф-ция с throw
0
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
27.06.2012, 00:42 | 47 |
Avazart, что-то я не понял, что имелось ввиду
По идее, если сгенерится не указанное в спецификации исключение, то должен позватся unexpected, а MSVC что делает в этом случае? Проверил бы сам, но винды под рукой нет. Про то как это работает все понятно. Вопрос почему эту дырку не закрыли в компиляторе, GCC адекватные ворнинги просто при несоответсвие типа аргумента формату выдает, а тут тихо при явном нарушении. Это будет работать везде, где str будет как есть скопирована, и адрес s будет совпадать с началом объекта. По крайнее мере, я не вижу причин не работать. А вот здесь можно поподробнее?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
27.06.2012, 01:19 | 48 | ||||||||||
CyBOSSeR, 12 MSVC.
Полный код.
В gcc идет так - http://liveworkspace.org/code/... 146d5cd26e
1
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
27.06.2012, 01:25 | 49 |
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
27.06.2012, 01:35 | 50 | |||||
CyBOSSeR, Выкидывание исключения выводит в функцию _Cxx_Throw_Exception, в которой они полностью кладут на unexpected.
Вообщем спецификация исключений в MSVC бессмысленна.
0
|
27.06.2012, 11:04 | 51 |
Сообщение было отмечено как решение
Решение
Скажем так, gcc работает не совсем честно. Он распознаёт функцию printf. И даже более: printf как бы является встроенной функцией (builtin'ом) языка GNU-C. Эту встроенность по опции можно отменить:
C #include <stdio.h> int main (void) { printf ("%d\n", &main); return 0; } Bash $ gcc t.c t.c: In function 'main': t.c:5: warning: format '%d' expects type 'int', but argument 2 has type 'int (*)(void)' $ gcc t.c -fno-builtin <тишина>
6
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
28.06.2012, 00:26 | 52 |
Хм... Как я понимаю при вызове функции с эллипсисом аргументы складываются в стек. va_arg "достает" аргументы из стека (тупо сдвигает указатель). Единственная возможность не работать printf'у мне видится, если адрес указателя на строку не совпадает с адресом экземпляра структуры. Т.е. я не понимаю, как соглашение о передаче агрументов может "сломать" работу printf'а, ну либо я неправильно понял относительно программных соглашений.
1
|
28.06.2012, 02:02 | 53 |
Скажем так, что основные пояснения техники передачи параметров делаются на примере intel'овских компиляторов, где идёт передача через стек (видимо), а потому у людей передача параметров однозначно ассоциируется со стеком.
На самом деле на любых более-менее приличных машинах с адэкватным количеством регистров часть параметров передаётся на регистрах. Из понятных соображений скорости. Передавать данные на регистрах быстрее, чем через память. Для большинства функций в реальной жизни параметров немного, а потому статистически значимая часть вызовов будет работать исключительно с передачей параметров на регистрах. Следствием этого, как правило, является то, что аггрегатные значения передаются по косвенности. Т.е. по языку у тебя передача структуры по значению. Но по программным соглашениям в точке вызова будет сформирована в стеке копия параметра и в функцию передаётся указатель на копию (таким образом за счёт копии, фактический параметр никак нельзя будет внутри вызванной функции испортить). В "старых" программных соглашениях обычно все структуры передаются по косвенности независимо от размера. Поэтому в случае sparc v8 если передавать структуру с указателем (из нашего примера), то реально в регистре или в памяти будет указатель, но не на строку, а на копию структуры. В "новых" программных соглашениях (abi64 sparc v9, ia-64) обычно сделано более гибко: короткие структуры передаются по значению, а длинные - по косвенности.
2
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
28.06.2012, 10:49 | 54 |
О передачей аргументов через регистры, я, естественно осведомлен, но в случае с эллипсисом, я не вижу возможности складывать аргументы куда-нибудь кроме как на стек, потому что если часть (все) будет передана через регистры, то как будет работать va_arg, я себе слабо представляю.
Да, теперь я понял. va_arg "попросив" char* получит указатель на структуру.
1
|
28.06.2012, 11:25 | 55 |
И тем не менее у многих даже в этом случае делается передача параметров через регистры. А далее va_start сваливает регистры в стек. Такой подход быстрее с той точки зрения, что внутри функции разгребание эллиптических параметров может находиться под условием и необязательно запустится. А потому типа раньше времени незачем в стек писать
2
|
28.06.2012, 11:25 | |
28.06.2012, 11:25 | |
Помогаю со студенческими работами здесь
55
Visual Studio 2005 и Visual Studio 2008 сильно ли они отличаются друк от друга? Сложить три числа, если они отличаются не больше чем на 2 Что такое входной и выходной поток? чем они отличаются? Какие существуют виды условного оператора и чем они отличаются Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |