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

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

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

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

05.06.2009, 23:53. Просмотров 7680. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2009, 23:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Приведите 10 примеров непереносимого кода (C++):

Приведите пример. - C++
Программа с использованием функции без параметров. Можете разьяснить все как есть

Приведите пример инвариантности - C++
Если можно, то объясните на конкретном примере(желательно лёгком в понимании) что такое инвариантность. На словах понятно, что это...

Приведите пример,вывод - C++
Привет,можете пожалуйста привести пример вывода всех файлов txt из папки,и лежащих в этой папке подпапок. Добавлено через 58 минут ...

Решение 4х примеров - C++
Здравствуйте у меня есть небольшая проблема. Необходимо решить 4 задачи по Си - Автор Богатырев. Номер заданий : 1,86; 2,3; ...

Приведите пример класса в классе - C++
Приведите пожалуйста пример класса в классе, так что бы в классе a были свойства и методы класса b.

Приведите пример реализации списка - C++
как я понял по своей сути список отличается от массива тем что список исспользует не фиксированный размер памяти и располагается в...

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

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

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

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

1. Придерживаться стандарта - УЧИТЬ ЧИСТЫЙ С++ (не Visual, не Builder, etc)
2. Пррверять свой код на основных компиляторах: Visual, Borland, GNU, Intel
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 02:47  [ТС] #9
Ну да,это всё понятно,но суть задачи именно в написании непереносимого кода(строчек кода).То есть,взглянуть на код и точно сказать-это не будет работать так и так.Видимо,не такая лёгкая задача?)
Например:
C++
1
unsigned char c2=1256;// определяется в реализации,зависит от размера char
Но это не в счёт,ибо из книжки.
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.06.2009, 03:05 #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
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
06.06.2009, 11:46 #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 #12
например если записать условие в другом виде, например:
условие
C++
1
if (a[i]>max) max=a[i];
записать в виде
C++
1
(a[i]>max)&&(max=a[i]);
то на старых еомпиляторах, где нет оптимизиции выполнения логических операторов (хотя таковых не много, но все же) он будет работать не правильно, а где то может ругнется, на то что значение выражения должно быть присвоено
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
06.06.2009, 12:38 #13
Цитата Сообщение от CartmanRules Посмотреть сообщение
то на старых еомпиляторах, где нет оптимизиции выполнения логических операторов (хотя таковых не много, но все же) он будет работать не правильно, а где то может ругнется, на то что значение выражения должно быть присвоено
Оптимизации тут не при чём. Поскольку тут есть присваивание, то компилятор его не выкинет. А если выкинет - то это ошибка компилятора. И ругнуться не имеет права, ибо тут всё строго по стандарту, но вот предупреждение выдаст
EnzoMatrix
120 / 120 / 5
Регистрация: 14.03.2009
Сообщений: 462
06.06.2009, 12:48 #14
Цитата Сообщение от Evg Посмотреть сообщение
Оптимизации тут не при чём
а по-моему есть разница *DONT_KNOW*, если оптимизации нема, то будут выполнятся все части условия, т.е приравнивание произойдет в любом случае, если же оптимизация присутствует, то в случае не выполнения a[i]>max , нет смысла дальше вычислять, а значит и приравнивание не произойдет
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
06.06.2009, 12:50 #15
pragma, в итоге когда сочинишь 10 программ - выложи, а мы их посмотрим и обо$рём В смысле конструктивно раскритикуем на предмет того, не повторяется ли одно и тоже и действительно ли здесь то, что нужно

Добавлено через 38 секунд
Цитата Сообщение от CartmanRules Посмотреть сообщение
а по-моему есть разница *DONT_KNOW*, если оптимизации нема, то будут выполнятся все части условия, т.е приравнивание произойдет в любом случае, если же оптимизация присутствует, то в случае не выполнения a[i]>max , нет смысла дальше вычислять, а значит и приравнивание не произойдет
Неа
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2009, 12:50
Привет! Вот еще темы с ответами:

Море примеров кода! - Java
The Java Developers Almanac 1.4: http://javaalmanac.com/egs/index.html

приведите примеры программ питона (не кода) - Python
слышал много где что если хочешь что то быстро написать пиши на питоне и пр. собственно интересны сами идеи, чего такого быстрого можно...

В чем разница двух примеров кода - C#
Здравствуйте! while (Connected == true) { if (srReceiver.ReadLine() != &quot;&quot;) { ...

Приведите примеры кода с комментариями (asm или debug) - Assembler
1. Вывести на экран текст 2. Рассчитать сумму всех элементов массива 3. Найти минимальный элемент массива 4. Найти максимальный...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.06.2009, 12:50
Ответ Создать тему
Опции темы

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