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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 61, средняя оценка - 4.97
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

05.06.2009, 23:53. Просмотров 7584. Ответов 52
Метки нет (Все метки)

Задача:
Приведите 10 различных примеров непереносимого кода на С++.
Ну первый пример сразу мне бросился в глаза,при регистрации на форуме.(Если я правильно понимаю смысл задачи)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <clocale>
#include <math.h>
using namespace std;
int main()
{
        system("Color 1A");
            ....... 
        if (choose == 1) {
            .......
                system("cls");
            .......
                if (choose1 == 1) {
                        system("cls");
            ......
                }
                if (choose1 == 2) {
                        system("cls");
            ......
                }
                if (choose1 == 3) {
            ......
                        system("pause");
                }
            ......
        }
        if (choose == 2) {
            ......
                system("pause");
        }
}
Помогите с девятью,благо(или нет) их должно быть море..
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
08.06.2009, 12:29     Приведите 10 примеров непереносимого кода #41
Цитата Сообщение от CheshireCat Посмотреть сообщение
Непереносимый код должен использовать не трактовку приоритетов операций в различных ситуациях (поскольку она будет одинаковой для одного и того же выражения независимо от компилятора и платформы - если компилятор, конечно, более-менее соответствует Стандарту), а - использовать платформенно-зависимые фичи и/или функции или компиляторо-зависимые фичи реализации. Например, то, что в MSDN явно описано как "Microsoft-specific".
В общем так. Изначально речь шла о примерах непереносимого кода. Далее pragma привёл код, который ему казался непереносимым. Я на это сказал, что там всё по стандарту, а так же сказал, что приоритет операций в стандарте жёстко зафиксирован. Собственно в этом месте была моя ошибка, поскольку мне казалось, что применительно к выражениям в Си и Си++ различиё в стандарте нет. Оказалось, что в Си++ в этом месте стандарт работает по-другому. Т.е. с приоритетмами операций, насколько я понимаю, к консенсусу мы всё-таки пришли

Теперь по поводу изначальной постановки задачи. Возможно, что тут дело в терминологии, но на мой взгляд "непереносимый код" и "ОС-зависимый" ("CPU-зависимый") код - это всё-таки разные вещи, юридической различие между которыми я членораздельно объяснить не могу (из разряды "жо$ой чую, что литр, но доказать не могу"). Т.е. условно говоря, попытавшись перетащить линуховый код на винду, мы получим ошибку компиляции/линковки по причине того, что какая-то фича для данной ОС отсуствует.

На мой взгляд, говорить о непереносимости можно тогда, когда у тебя нет физических проблем для переноса кода (например, с linux-i386 на linux-ia64 или linux-sparc). И именно в этом месте на реальном софте возникает куча гемора:
- Код изначально был написан под 32-битную платформу, а потому на 64-битной платформе работает неправильно. Не потому, что он физически не можетработаь на 64-битной платформе, а птому что написан "неаккуратно" - т.е. в предположении неких 32-битных соглашений (например, размер int'а совпадает с размером указателя)
- Код изначально был написан под little-endian, а потому неправильно работает на big endian'е. Не потому, что он физически не может работатьна big-endian'е, а потому что шла работа с битовыми образами значений, жёстко предполагающих, что у нас такой-то порядок расположения байтов в памяти

Ну и тому подобное. Т.е. отсуствие чего-то в библиотеках на мой взгляд НЕ является непереносимостью, а является "ОС-зависимостью" и т.п.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
08.06.2009, 13:39     Приведите 10 примеров непереносимого кода #42
Хм, вот я глянул в (драфт) действующего стандарта С (ANSI/ISO 9899-1999), и там тоже (6.5/3) есть аналогичное утверждение: "The grouping of operators and operands is indicated by the syntax."
Ну хорошо, тем не менее, к консенсусу о приоритетах операций мы все-таки пришли.

Относительно переносимости:
я вполне согласен с твоими доводами. Я, однако, все-таки добавил бы в понятие "непереносимого" кода еще и то, что ты называешь "ОС-зависимость" или "CPU-зависимость". Бо мне в последнее время приходится писать код под несколько различных аппаратных платформ, и я (к сожалению) по опыту знаю, что такое "взять уже готовую библиотеку в исходниках и всунуть ее в свой проект" - это легко только на словах и так оно кажется менеджерам..... а перелопачивать груду кода этак в полста десятков килострок - удовольствие много ниже среднего, да еще и ошибок насажать можно лехко.....
Впрочем, все изложенное - это мое имхо, поэтому не настаиваю на своем утверждении. В остальном же консенсус достигнут
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
08.06.2009, 13:45     Приведите 10 примеров непереносимого кода #43
Почитал стандарт. В разделе 6.5 стандарта Си чётко описаны приоритеты всех операций. В Си++ прориоритеты нет ничего кроме фразы "The precedence of operators is not directly specified, but it can be derived from the syntax". Мы тут сидели и долго пытались втыкнуть, что же сие означает. Наткнулись на статью в википедии http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Теперь более-менее в голове утряслось. В стандарте Си есть строгое понятие приоритета операций. В стандарте Си++ понятия приоритета операций как такового нет. Вместо этого говорится, что порядок вычислний следует из формального описания синтаксических правил языка. В указанной статье приводится пример конкретных синтаксических правил и объяснения, почему одно и тоже выражение в Си и Си++ трактуется по разному

Добавлено через 5 минут 31 секунду
Цитата Сообщение от CheshireCat Посмотреть сообщение
Я, однако, все-таки добавил бы в понятие "непереносимого" кода еще и то, что ты называешь "ОС-зависимость" или "CPU-зависимость". Бо мне в последнее время приходится писать код под несколько различных аппаратных платформ, и я (к сожалению) по опыту знаю, что такое "взять уже готовую библиотеку в исходниках и всунуть ее в свой проект"
Просто тут скорее из разряда "кривые руки", т.е. автор изначально не пытался написать код так, чтобы он мог работать на другой платформе. Неформально я бы тоже это назвал "непереносимый", хотя формально он "ОС-зависимый". В контексте реальной задачи по переносу кода на другую платформу, конечно же, в данном случае куда весомее оказывается неформальное название "непереносимый". В общем по данному пункту у нас полное взаимопонимание. А что и как назвать формально - это уже крючкотворство и буквоедство
Haster
инженер-системотехник
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
08.06.2009, 14:27     Приведите 10 примеров непереносимого кода #44
А чего ссылка ведет не на статью?
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
08.06.2009, 21:29     Приведите 10 примеров непереносимого кода #45
Промазал. Ссылка
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Добавлено через 6 часов 55 минут 39 секунд
pragma, хорош на каждом посте "спасибо жать". А то я уже начинаю чувствовать, что где-то рядом штангенциркуль появляется
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.06.2009, 22:26  [ТС]     Приведите 10 примеров непереносимого кода #46
А кто такой штангенциркуль?
P.S.Просто некоторые жалуются,что не жмут,вот и жму))
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
08.06.2009, 23:25     Приведите 10 примеров непереносимого кода #47
Цитата Сообщение от #pragma Посмотреть сообщение
А кто такой штангенциркуль?
P.S.Просто некоторые жалуются,что не жмут,вот и жму))
Штангенциркуль - это инструмент для измерения длины с точностью до 0.1 мм

Добавлено через 25 минут 50 секунд
Кстати, вот тебе ещё пример непереносимого кода

C
1
2
3
4
5
6
7
8
9
10
11
void func (void)
{
  int x, i;
  char *p;
 
  x = 0x11223344;
  p = (char*) &x;
 
  for (i = 0; i < 4; i++)
    printf ("0x%x\n", (int) p[i]);
}
В данном примере мы побайтно распечатываем значения int'а, лежащего в памяти. Есть два основных типа расположения байтов внутри значения в памяти:
- little endian - когда младший байт значения находится по меньшему адресу (а старший - по бОльшему)
- big endian - когда старщий байт значения находится по меньшему адресу

Intel относится к little endian, а потому этот тест выдаст значения в таком порядке: 0x44, 0x33, 0x22, 0x11. SPARC (есть такой процессор) относится в big endian, и этот тест выдаст: 0x11, 0x22, 0x33, 0x44
Delphin_KKC
UNIX-way
709 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
09.06.2009, 17:57     Приведите 10 примеров непереносимого кода #48
Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    system("PAUSE");
    return EXIT_SUCCESS;
}
Как выяснилось, на linux образца 2006 года и gcc-4.1.2 сей код не компилируется.
Подробности тут: Сайт для экспериментов с программами (Интерпретатор онлайн)
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
09.06.2009, 18:01     Приведите 10 примеров непереносимого кода #49
Цитата Сообщение от Delphin_KKC Посмотреть сообщение
Как выяснилось, на linux образца 2006 года и gcc-4.1.2 сей код не компилируется.
Почитай внимательнее данный топ. Ты уже далеко не первый, кто предлагает этот код. И вроде бы как собрание акционеров порешило, что этот код "ОС-зависимый", а не "непереносимый". На том сайте ты его не смог запустить потому, что там стоИт ограничение на некоторые системные вызовы, чтобы всякие умники машину не поломали. Более того, если ты будешь его запускать на реальной машине, а не через сайт, то ты всегда сможешь положить бинарник с именем pause и твой код заработает
Delphin_KKC
UNIX-way
709 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
09.06.2009, 18:04     Приведите 10 примеров непереносимого кода #50
Понятно. Извини, не было времени пять страниц изучать. Спасибо за информацию.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
09.06.2009, 18:48     Приведите 10 примеров непереносимого кода #51
Цитата Сообщение от Delphin_KKC Посмотреть сообщение
Как выяснилось, на linux образца 2006 года и gcc-4.1.2 сей код не компилируется.
На Lin 2.6.26 образца 2009 г. (весна) и GCC 4.3.0 все прекрасно компилируется.
А причина в том посте - не в компиляции, а в другом.
Delphin_KKC
UNIX-way
709 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
09.06.2009, 21:15     Приведите 10 примеров непереносимого кода #52
Цитата Сообщение от CheshireCat Посмотреть сообщение
...
А причина в том посте - не в компиляции, а в другом.
Причина в том, что я его не на своём компе на линуксе проверял, а на сайте http://codepad.org/
Evg уже писал что там стоит ограничение на некоторые системные вызовы. В часности - system("pause"). Без этого вызова - компилируется. За сим, как я уже писал, признаю свою ошибку. Но пост удалить нельзя.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2009, 21:33     Приведите 10 примеров непереносимого кода
Еще ссылки по теме:
Задача с решением примеров C++
Доработка примеров учебника. C++
C++ Решение 2 математических примеров на C++
C++ Опишите операторы цикла. Приведите примеры.
C++ Приведите пример использования оператора switch

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
09.06.2009, 21:33     Приведите 10 примеров непереносимого кода #53
Цитата Сообщение от Delphin_KKC Посмотреть сообщение
Причина в том, что я его не на своём компе на линуксе проверял, а на сайте http://codepad.org/
Evg уже писал что там стоит ограничение на некоторые системные вызовы. В часности - system("pause"). Без этого вызова - компилируется. За сим, как я уже писал, признаю свою ошибку. Но пост удалить нельзя.
CheshireCat имел в виду, что оно и с system компилируется. Но не исполняется
Yandex
Объявления
09.06.2009, 21:33     Приведите 10 примеров непереносимого кода
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru