Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
1 | ||||||
Приведите 10 примеров непереносимого кода05.06.2009, 23:53. Просмотров 11196. Ответов 53
Метки нет Все метки)
(
Задача:
Приведите 10 различных примеров непереносимого кода на С++. Ну первый пример сразу мне бросился в глаза,при регистрации на форуме.(Если я правильно понимаю смысл задачи)
0
|
|
05.06.2009, 23:53 | |
Море примеров кода! приведите примеры программ питона (не кода) В чем разница двух примеров кода |
|
Заказ софта
342 / 187 / 21
Регистрация: 26.05.2009
Сообщений: 863
|
|
06.06.2009, 00:19 | 2 |
А йа вапще не понял что нужно сделать !
0
|
2807 / 1398 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
|
|
06.06.2009, 00:28 | 3 |
пишешь функцию, в которую передаешь параметр (choose, choose1, choose2, etc)... в зависимости от значения параметра выполняешь действие...
1
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
06.06.2009, 01:03 [ТС] | 4 |
И это будет непереносимый код?Имеется ввиду,что код будет работать на одном компьютере/в одной системе ,но не будет в другой.
0
|
2807 / 1398 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
|
|
06.06.2009, 01:11 | 5 |
пардон) ой..я не так понял) я думал вы искали решение более рационально написать то, что написано у вас выше)))
![]() непереносимый код - это любой код, который заточен под определнную железяку, или под ОС... в вашем случае, system на линуксе работать не будет... так же, существуют отклонения от стандарта, которые на одном компиляторе компилироватся будут, а на другом нет... p.s: а зачем вам не переносимый код?
1
|
682 / 231 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
|
|
06.06.2009, 01:23 | 6 |
асм вставки тоже как вариант
1
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
06.06.2009, 01:37 [ТС] | 7 |
Такое задание)) чтобы осознать непереносимый код и стараться не писать так.
0
|
2807 / 1398 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
|
|
06.06.2009, 02:03 | 8 |
хм) лучший способ:
1. Придерживаться стандарта - УЧИТЬ ЧИСТЫЙ С++ (не Visual, не Builder, etc) 2. Пррверять свой код на основных компиляторах: Visual, Borland, GNU, Intel
0
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
06.06.2009, 02:47 [ТС] | 9 | |||||
Ну да,это всё понятно,но суть задачи именно в написании непереносимого кода(строчек кода).То есть,взглянуть на код и точно сказать-это не будет работать так и так.Видимо,не такая лёгкая задача?)
Например:
0
|
576 / 570 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
||||||
06.06.2009, 03:05 | 10 | |||||
Вот тебе пример непереносимого кода
![]()
1
|
![]() ![]() |
||||||||||||||||
06.06.2009, 11:46 | 11 | |||||||||||||||
![]() Решение
Понятия "читый Си" или "чистый Си++" уже давно не существует в природе. Периодически выходят новые версии стандарта, новые расширения и т.п.
Для написание непереносимого кода действительно можно нытакать всяких ОС-зависимых или компилятро-зависимых вещей Однако чтобы написать непереносимый код на "чистом языке", можно заглянуть в стандарт и поискать вещи, которые неспецифецированы. Вообще такие делатся на три группы *надеюсь, ничего не напутал): 1. Implementation specified Стандарт не делает никаких ограничений. Каждая реализация вправе выбирать, как реализовывать указанную фичу. К этой группе относяится, например, количество бит в байте или формат представления целых чисел. С этой точки зрения непереносимым кодом
2. Unspecified Стандарт не указывает точно, как реализовывать фичу, но говрит об ограничениях на фичу или предлагает выбор из нескольких вариантов реализации. Сюда можно отнести размеры базовых типов. Хороший пример "живого" но непереновимого кода - это когда указатель записывают в int, он где-то живёт в виде int'а, затем его обратно преобразовывают в указатель. На 64-битных системах этот код работать не будет. Вернее будет косячить с вероятностью, потому как значение указателя может иметь нуля в старшей части и тогда этот код случайно заработает. Сюда же можно отнести одну из стандартных ошибок на 32-битных приложениях, когда считается, что long 32-битный. Т.е. где-то пишут присваивание 0xffffffffL и при этом считают, что это значение равно -1 3. Undefined behaviour Есть конструкции, для которых есть несколько вариантов исполнения, но невозможно определить, который из них правильный. Например
Добавлено через 3 минуты 36 секунд Да, забыл сказать. Все эти коды с side effect'ами каждый комплятор отрабатывает по своему - в каком порядке удобно вычислять операнды, в таком и сделают. Т.е. один и тот же код на разных компиляторах (для одной и той же платформы) и даже на разных версиях компиляторов отработают по разному. Правда это надо относить к "неправильному" коду, чем к "непереносимому" Добавлено через 19 минут 29 секунд Приведённые коды с system и exec'ом - формально являются "ОС-зависимыми" кодами, а не "непереносимымы". Правда юридическую разницу между этими понятиями формально выразить затрудняюсь Вариант Mecid'а с ассемблерными вставками - это уже код непереносимый с точки зрения компиляции. Формально в категорию "непрененосимого" кода не совсем попадает, потому как эти "архитектурно-зависимый код". А если разные форматы ассемблерных вставок - то это можно считать кодами, написанными на разных языках (а точнее на разных диалектах). Это я всё сказал не к тому, чтобы обо$рать приведённые решения, но чтобы было понятно, что они не совсем точно отражают поставленную задачу. Если преподаватель действительно чётко себе понимает поставленный вопрос, то он скорее всего ответит на эти примеры теми же возражениями, что и я
3
|
121 / 121 / 14
Регистрация: 14.03.2009
Сообщений: 462
|
|||||||||||
06.06.2009, 12:15 | 12 | ||||||||||
например если записать условие в другом виде, например:
условие
1
|
![]() ![]() |
|
06.06.2009, 12:38 | 13 |
Оптимизации тут не при чём. Поскольку тут есть присваивание, то компилятор его не выкинет. А если выкинет - то это ошибка компилятора. И ругнуться не имеет права, ибо тут всё строго по стандарту, но вот предупреждение выдаст
1
|
121 / 121 / 14
Регистрация: 14.03.2009
Сообщений: 462
|
|
06.06.2009, 12:48 | 14 |
а по-моему есть разница *DONT_KNOW*, если оптимизации нема, то будут выполнятся все части условия, т.е приравнивание произойдет в любом случае, если же оптимизация присутствует, то в случае не выполнения a[i]>max , нет смысла дальше вычислять, а значит и приравнивание не произойдет
0
|
![]() ![]() |
|
06.06.2009, 12:50 | 15 |
pragma, в итоге когда сочинишь 10 программ - выложи, а мы их посмотрим и обо$рём
![]() Добавлено через 38 секунд Неа ![]()
1
|
121 / 121 / 14
Регистрация: 14.03.2009
Сообщений: 462
|
|
06.06.2009, 12:53 | 16 |
Битовые операции
тут примерчик висит Добавлено через 2 минуты 50 секунд а можно объянить почему? а то я не понял ![]()
1
|
![]() ![]() |
||||||
06.06.2009, 13:03 | 17 | |||||
Скажу тебе даже более того. Когда у тебя есть выражение, которое вроде бы как вообще ничего не делает, типа
Добавлено через 4 минуты 37 секунд Такова семантика операции "&&" в языке Си Т.е. "expr1 && expr2" означает вычислить expr1 и если оно не равно нулю (и только тогда) вычисляить expr2. Т.е. "expr1 && expr2" НЕ эквивалентно "expr2 && expr1" В итоге для выражения "(a[i]>max)&&(max=a[i]);" сначала делается первая проверка (т.е. вычисляется expr1) и если она истинная, то только в том случае выполняется второе выражение. Т.е. семантически этот код эквивалентен "if (a[i] > max) max = a[i];", который, сам понимаешь, отработает одинаково независимо от оптимизаций Я точно не уверен, но возможно в паскале (или это в бэйсике было) AND устроен по другому. Т.е. для "expr1 AND expr2" ВСЕГДА вычисляются оба выражения и только потом над ним делается AND Добавлено через 2 минуты 38 секунд Не знаю, как правильно это называется по научному, но в Си вычисление логического выражения пркращается сразу же, как только можно вычислить его значение. Операция "&&" обладает тем свойством, что если первое выражение ложь, то результат равен ложь независимо от второго выражения. Для "||" наоборот - если первое выражение равно истине, то второе уже не выполняется
2
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
06.06.2009, 13:10 [ТС] | 18 |
Evg, -спасибо огромное,респект,этаж надо было столько написать ))
0
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
06.06.2009, 18:39 [ТС] | 20 | |||||
А это
3. Undefined behaviour?У этих операторов одинаковый приоритет,выполнение зависит от реализации?У меня компилируется без ошибок и предупреждений.
0
|
06.06.2009, 18:39 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Приведите примеры кода с комментариями (asm или debug) приведите пример Приведите пример. Приведите пример Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |