Форум программистов, компьютерный форум CyberForum.ru

Приведите 10 примеров непереносимого кода - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ контроллер видеомагнитофона http://www.cyberforum.ru/cpp-beginners/thread38555.html
как исправить класс для представления понятия "контроллер видеомагнитофона"(обеспечивает програмное управление видеомагнитофоном, который может осуществлять запись,вставить, извлечь кассету и проверить наличие кассеты, выполнять воспроизведение кассеты и осуществлть перемотку в указанном направлении что бы выводил на экран всё что надо как и что выводить в поток cout magnitofon.h #ifndef...
C++ Вычисления значений функции на отрезке [a; b] с шагом h Составить программу вычисления значений функции F(x) на отрезке с шагом h . Результат представить в виде таблицы, первый столбец которой – значения аргумента, второй – соответствующие значения функции: F(x) = sin2 x − cos 2 x . http://www.cyberforum.ru/cpp-beginners/thread38552.html
Определить колличество строк, не содержащих ни одного нулевого элемента C++
Помогите плз) чтобы получить итоговую нужно сдать 3 проги по С++. Сделать их сам не могу( не было на этих темах, парился в военкомате, по поводу отсрочки, будь она не ладна( Спасайте) Осталось 2 дня, чем быстрее будет решение, тем лучше, хоть как-то разберусь с прогами мб. 1) Дана целочисленная прямоугольная матрица. Определить колличество строк, не содержащих ни одного нулевого...
C++ Найти индекс первого элемента массива, модуль которого меньше всего отличается от 5
Найти элементы , модуль которого меньше всего отличается от 5 , номер первого такого элемента. Найти числа которые имеют наибольший остаток при делении на 5 и сообщ этот остаток.
C++ Сравнить члены вектора http://www.cyberforum.ru/cpp-beginners/thread38473.html
Как сравнивать члены вектора между собой? Например дан вектор: 000101010 Надо сравнить тройками чисел,т.е. 1-я тройка: 000 ->три 0 выводим 0 2-я тройка 101 -> две 1 и 0 выводим 1 3-я тройка 010-> два 0 и 1 выводим 0
C++ Числовой интервал Помогите плз, такая задача. Задан числовой интервал, вывести все простые числа и их кол-во. (интервал любой) подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,922
Записей в блоге: 26
06.06.2009, 11:46     Приведите 10 примеров непереносимого кода
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
1. Придерживаться стандарта - УЧИТЬ ЧИСТЫЙ С++ (не Visual, не Builder, etc)
Понятия "читый Си" или "чистый Си++" уже давно не существует в природе. Периодически выходят новые версии стандарта, новые расширения и т.п.

Для написание непереносимого кода действительно можно нытакать всяких ОС-зависимых или компилятро-зависимых вещей

Однако чтобы написать непереносимый код на "чистом языке", можно заглянуть в стандарт и поискать вещи, которые неспецифецированы. Вообще такие делатся на три группы *надеюсь, ничего не напутал):

1. Implementation specified
Стандарт не делает никаких ограничений. Каждая реализация вправе выбирать, как реализовывать указанную фичу. К этой группе относяится, например, количество бит в байте или формат представления целых чисел.

С этой точки зрения непереносимым кодом

C
1
2
3
char c = 255;
if (c == -1)
  ...
На "обычных" машинах у тебя код работать будет одинаково, но на сигнальных или embedded процессорах наверняка это дело разъедется

2. Unspecified
Стандарт не указывает точно, как реализовывать фичу, но говрит об ограничениях на фичу или предлагает выбор из нескольких вариантов реализации. Сюда можно отнести размеры базовых типов. Хороший пример "живого" но непереновимого кода - это когда указатель записывают в int, он где-то живёт в виде int'а, затем его обратно преобразовывают в указатель. На 64-битных системах этот код работать не будет. Вернее будет косячить с вероятностью, потому как значение указателя может иметь нуля в старшей части и тогда этот код случайно заработает. Сюда же можно отнести одну из стандартных ошибок на 32-битных приложениях, когда считается, что long 32-битный. Т.е. где-то пишут присваивание 0xffffffffL и при этом считают, что это значение равно -1

3. Undefined behaviour
Есть конструкции, для которых есть несколько вариантов исполнения, но невозможно определить, который из них правильный. Например

C
1
2
i = 0;
x = a[i++] + b[i++]
Непонятно, что будет в x: "a[0]+b[0]", "a[0]+b[1]" или что-то ещё. При этом завикировать какой-либо порядок в стандарте нельзя. Потому, как, например, скажем, что надо инкрементацию делать сразу (т.е. результат должен быть a[0]+b[1]), то получится, что операция "плюс" теряет свойство ассоциативности (т.е. при перестановке операндов местами результат изменится). Такой код является некорректным, для него есть специальный термин - код содердит "side effect'ы" - т.е. внутри выражения есть операции записи, которые модифицируют аргументы выражения, но стандартом не зафиксирован порядок вычислений. Ещё пример кода с side effect'ом:

C
1
2
3
4
int G;
int func (void) { return ++G; }
...
a = func() + G;
В данном случае при вычислении выражения непонятно, сначала надо вызвать функцию, а потом прочитать значение G или наоборот

Добавлено через 3 минуты 36 секунд
Да, забыл сказать. Все эти коды с side effect'ами каждый комплятор отрабатывает по своему - в каком порядке удобно вычислять операнды, в таком и сделают. Т.е. один и тот же код на разных компиляторах (для одной и той же платформы) и даже на разных версиях компиляторов отработают по разному. Правда это надо относить к "неправильному" коду, чем к "непереносимому"

Добавлено через 19 минут 29 секунд
Приведённые коды с system и exec'ом - формально являются "ОС-зависимыми" кодами, а не "непереносимымы". Правда юридическую разницу между этими понятиями формально выразить затрудняюсь

Вариант Mecid'а с ассемблерными вставками - это уже код непереносимый с точки зрения компиляции. Формально в категорию "непрененосимого" кода не совсем попадает, потому как эти "архитектурно-зависимый код". А если разные форматы ассемблерных вставок - то это можно считать кодами, написанными на разных языках (а точнее на разных диалектах).

Это я всё сказал не к тому, чтобы обо$рать приведённые решения, но чтобы было понятно, что они не совсем точно отражают поставленную задачу. Если преподаватель действительно чётко себе понимает поставленный вопрос, то он скорее всего ответит на эти примеры теми же возражениями, что и я
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru