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

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

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

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

05.06.2009, 23:53. Просмотров 7530. Ответов 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Search..
Заказ софта
340 / 185 / 10
Регистрация: 26.05.2009
Сообщений: 863
06.06.2009, 00:19     Приведите 10 примеров непереносимого кода #2
А йа вапще не понял что нужно сделать !
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
06.06.2009, 00:28     Приведите 10 примеров непереносимого кода #3
пишешь функцию, в которую передаешь параметр (choose, choose1, choose2, etc)... в зависимости от значения параметра выполняешь действие...
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 01:03  [ТС]     Приведите 10 примеров непереносимого кода #4
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
пишешь функцию, в которую передаешь параметр (choose, choose1, choose2, etc)... в зависимости от значения параметра выполняешь действие...
И это будет непереносимый код?Имеется ввиду,что код будет работать на одном компьютере/в одной системе ,но не будет в другой.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
06.06.2009, 01:11     Приведите 10 примеров непереносимого кода #5
пардон) ой..я не так понял) я думал вы искали решение более рационально написать то, что написано у вас выше)))

непереносимый код - это любой код, который заточен под определнную железяку, или под ОС... в вашем случае, system на линуксе работать не будет...
так же, существуют отклонения от стандарта, которые на одном компиляторе компилироватся будут, а на другом нет...

p.s: а зачем вам не переносимый код?
Mecid
678 / 227 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
06.06.2009, 01:23     Приведите 10 примеров непереносимого кода #6
асм вставки тоже как вариант
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 01:37  [ТС]     Приведите 10 примеров непереносимого кода #7
Цитата Сообщение от Monte-Cristo Посмотреть сообщение

p.s: а зачем вам не переносимый код?
Такое задание)) чтобы осознать непереносимый код и стараться не писать так.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
06.06.2009, 02:03     Приведите 10 примеров непереносимого кода #8
Цитата Сообщение от #pragma Посмотреть сообщение
Такое задание)) чтобы осознать непереносимый код и стараться не писать так.
хм) лучший способ:

1. Придерживаться стандарта - УЧИТЬ ЧИСТЫЙ С++ (не Visual, не Builder, etc)
2. Пррверять свой код на основных компиляторах: Visual, Borland, GNU, Intel
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 02:47  [ТС]     Приведите 10 примеров непереносимого кода #9
Ну да,это всё понятно,но суть задачи именно в написании непереносимого кода(строчек кода).То есть,взглянуть на код и точно сказать-это не будет работать так и так.Видимо,не такая лёгкая задача?)
Например:
C++
1
unsigned char c2=1256;// определяется в реализации,зависит от размера char
Но это не в счёт,ибо из книжки.
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.06.2009, 03:05     Приведите 10 примеров непереносимого кода #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
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
 
int spawn(char *program, char *arg_list[])
{
    pid_t child_pid;
 
    child_pid = fork();
    if(child_pid != 0)
        return child_pid;
    else {
        execvp(program, arg_list);
        fprintf(stderr, "An error occurred in execvp.\n");
        abort();
    }
}
 
int main()
{
    char *arg_list[]= {
        "ls",
        "-l",
        "/home/",
        NULL
    };
    spawn("ls", arg_list);
    return 0;
}
Evg
Эксперт CАвтор FAQ
17304 / 5552 / 347
Регистрация: 30.03.2009
Сообщений: 15,112
Записей в блоге: 26
06.06.2009, 11:46     Приведите 10 примеров непереносимого кода #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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'а с ассемблерными вставками - это уже код непереносимый с точки зрения компиляции. Формально в категорию "непрененосимого" кода не совсем попадает, потому как эти "архитектурно-зависимый код". А если разные форматы ассемблерных вставок - то это можно считать кодами, написанными на разных языках (а точнее на разных диалектах).

Это я всё сказал не к тому, чтобы обо$рать приведённые решения, но чтобы было понятно, что они не совсем точно отражают поставленную задачу. Если преподаватель действительно чётко себе понимает поставленный вопрос, то он скорее всего ответит на эти примеры теми же возражениями, что и я
EnzoMatrix
120 / 120 / 5
Регистрация: 14.03.2009
Сообщений: 462
06.06.2009, 12:15     Приведите 10 примеров непереносимого кода #12
например если записать условие в другом виде, например:
условие
C++
1
if (a[i]>max) max=a[i];
записать в виде
C++
1
(a[i]>max)&&(max=a[i]);
то на старых еомпиляторах, где нет оптимизиции выполнения логических операторов (хотя таковых не много, но все же) он будет работать не правильно, а где то может ругнется, на то что значение выражения должно быть присвоено
Evg
Эксперт CАвтор FAQ
17304 / 5552 / 347
Регистрация: 30.03.2009
Сообщений: 15,112
Записей в блоге: 26
06.06.2009, 12:38     Приведите 10 примеров непереносимого кода #13
Цитата Сообщение от CartmanRules Посмотреть сообщение
то на старых еомпиляторах, где нет оптимизиции выполнения логических операторов (хотя таковых не много, но все же) он будет работать не правильно, а где то может ругнется, на то что значение выражения должно быть присвоено
Оптимизации тут не при чём. Поскольку тут есть присваивание, то компилятор его не выкинет. А если выкинет - то это ошибка компилятора. И ругнуться не имеет права, ибо тут всё строго по стандарту, но вот предупреждение выдаст
EnzoMatrix
120 / 120 / 5
Регистрация: 14.03.2009
Сообщений: 462
06.06.2009, 12:48     Приведите 10 примеров непереносимого кода #14
Цитата Сообщение от Evg Посмотреть сообщение
Оптимизации тут не при чём
а по-моему есть разница *DONT_KNOW*, если оптимизации нема, то будут выполнятся все части условия, т.е приравнивание произойдет в любом случае, если же оптимизация присутствует, то в случае не выполнения a[i]>max , нет смысла дальше вычислять, а значит и приравнивание не произойдет
Evg
Эксперт CАвтор FAQ
17304 / 5552 / 347
Регистрация: 30.03.2009
Сообщений: 15,112
Записей в блоге: 26
06.06.2009, 12:50     Приведите 10 примеров непереносимого кода #15
pragma, в итоге когда сочинишь 10 программ - выложи, а мы их посмотрим и обо$рём В смысле конструктивно раскритикуем на предмет того, не повторяется ли одно и тоже и действительно ли здесь то, что нужно

Добавлено через 38 секунд
Цитата Сообщение от CartmanRules Посмотреть сообщение
а по-моему есть разница *DONT_KNOW*, если оптимизации нема, то будут выполнятся все части условия, т.е приравнивание произойдет в любом случае, если же оптимизация присутствует, то в случае не выполнения a[i]>max , нет смысла дальше вычислять, а значит и приравнивание не произойдет
Неа
EnzoMatrix
120 / 120 / 5
Регистрация: 14.03.2009
Сообщений: 462
06.06.2009, 12:53     Приведите 10 примеров непереносимого кода #16
Битовые операции
тут примерчик висит

Добавлено через 2 минуты 50 секунд
Цитата Сообщение от Evg Посмотреть сообщение
Неа
а можно объянить почему? а то я не понял
Evg
Эксперт CАвтор FAQ
17304 / 5552 / 347
Регистрация: 30.03.2009
Сообщений: 15,112
Записей в блоге: 26
06.06.2009, 13:03     Приведите 10 примеров непереносимого кода #17
Скажу тебе даже более того. Когда у тебя есть выражение, которое вроде бы как вообще ничего не делает, типа

C
1
2
float f1, f2;
f1 + f2;
То в "нормальном" случае компилятор невправе его выкинуть, потому как плавающая операция может выдать исключительную ситуацию (по сути дела сигнал). Но реально многие компиляторы по умолчанию работаю в так называемом режиме -fsimple (опция правда у всех по разному), при котором считается, что прерывания нам не нужны, всякие NaN'ы и прочая ересь - тоже. При таком допущении получается более быстрый код. Но это, мягко говоря, режим работы, противоречащий стандарту. Правда уже не стандарту языка Си, а стандарту плавающей ариметики IEEE-754

Добавлено через 4 минуты 37 секунд
Цитата Сообщение от CartmanRules Посмотреть сообщение
а можно объянить почему? а то я не понял
Такова семантика операции "&&" в языке Си
Т.е. "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 секунд
Не знаю, как правильно это называется по научному, но в Си вычисление логического выражения пркращается сразу же, как только можно вычислить его значение. Операция "&&" обладает тем свойством, что если первое выражение ложь, то результат равен ложь независимо от второго выражения. Для "||" наоборот - если первое выражение равно истине, то второе уже не выполняется
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 13:10  [ТС]     Приведите 10 примеров непереносимого кода #18
Evg, -спасибо огромное,респект,этаж надо было столько написать ))
Evg
Эксперт CАвтор FAQ
17304 / 5552 / 347
Регистрация: 30.03.2009
Сообщений: 15,112
Записей в блоге: 26
06.06.2009, 14:42     Приведите 10 примеров непереносимого кода #19
Цитата Сообщение от #pragma Посмотреть сообщение
этаж надо было столько написать ))
Ну... "Пи$деть - не мешки ворочать"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2009, 18:39     Приведите 10 примеров непереносимого кода
Еще ссылки по теме:

C++ Приведите пример,вывод
Задача с решением примеров C++
C++ Приведите простейший пример реализации диалога
C++ Приведите пример класса в классе
C++ Приведите пример использования оператора switch

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

Или воспользуйтесь поиском по форуму:
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 18:39  [ТС]     Приведите 10 примеров непереносимого кода #20
А это
C++
1
2
3
4
void f(int a)
{
    if(+-~!*&++a){}
}
подпадает под данную категорию:
3. Undefined behaviour?У этих операторов одинаковый приоритет,выполнение зависит от реализации?У меня компилируется без ошибок и предупреждений.
Yandex
Объявления
06.06.2009, 18:39     Приведите 10 примеров непереносимого кода
Ответ Создать тему
Опции темы

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