когда функция членства должна быть и константой и энергозависимый вместе?

Функция scanf() будет возвращать количество прочитанных элементов, поэтому в этом случае она будет возвращать 1 при каждом чтении целого числа и 0 при чтении символа, поэтому вам просто нужно проверить это возвращаемое значение. Имейте в виду, что после чтения символа он останется в буфере, поэтому, если вы снова воспользуетесь командой scanf(), он снова будет читать символ и повторять ошибку. Чтобы избежать этого, вам нужно использовать символ с while(getchar() != '\n');

Имея это в виду, я изменил ваш код так, чтобы он работал правильно, выводя сообщение об ошибке, если вводится символ, и запрашивая новый int. [115 ]

for (int i = 1; i <= size; i++) {
      printf("Introduce the value #%d of the list: ", i);
      while (!scanf("%d", &list[i])) { //verifies the return of scanf
        while(getchar() != '\n'); //consumes the character in case of error
        printf("What you tried to introduce is a char\n");
        printf("please introduce the value #%d of the list: ", i);
      }
    }
10
задан aJ. 17 March 2009 в 16:36
поделиться

5 ответов

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

Однако давайте поместим константу энергозависимая функция в него только ради ответа на вопрос. Предположите, что у Вас есть порт с адресом 0x378h, который содержит 2 целых числа, 4 байта каждый. Затем Вы могли записать

struct ints {
    int first;
    int second;
    int getfirst() const volatile {
        return first;
    }

    int getsecond() const volatile {
        return second;
    }
      // note that you could also overload on volatile-ness, just like
      // with const-ness
};

// could also be mapped by the linker. 
ints const volatile &p = *reinterpret_cast<ints*>(0x378L);

Вы заявляете

Я не изменяю их, но другая вещь вне этой абстрактной семантики могла изменить его. Поэтому всегда делайте действительную нагрузку от ее адреса.

На самом деле энергозависимые сигналы, что значение объекта не могло бы быть значением, в последний раз сохраненным в него, но на самом деле неизвестно и, возможно, были изменены промежуточные внешним (не заметный компилятором) условия. Таким образом, когда Вы читаете из энергозависимого объекта, компилятор должен эмулировать точную абстрактную семантику и не выполнять оптимизацию:

a = 4;
a *= 2; 
  // can't be optimized to a = 8; if a is volatile because the abstract
  // semantics described by the language contain two assignments and one load.

Следующее уже определяет что volatile делает. Все может быть найдено в 1.9 из Стандарта. Параметры, о которых это говорит, являются определенными вещами реализации, как sizeof некоторого типа.

Семантические описания в этом Международном стандарте определяют параметризованную недетерминированную абстрактную машину. Этот Международный стандарт не помещает требования к структуре соответствующих реализаций. В частности, они не должны копировать или эмулировать структуру абстрактной машины. Скорее соответствующие реализации требуются, чтобы эмулировать (только) заметное поведение абстрактной машины, как объяснено ниже. [...]

Соответствующая реализация, выполняющая правильно построенную программу, должна произвести то же заметное поведение как одна из возможных последовательностей выполнения соответствующего экземпляра абстрактной машины с той же программой и тем же входом. [...]

Заметное поведение абстрактной машины является своей последовательностью чтений и пишет в энергозависимые данные и звонит в функции библиотеки I/O.

13
ответ дан 3 December 2019 в 14:25
поделиться

Квалификация условной цены дистиллировала средства:

Я не изменю значение, но существует что-то там, которое может.

Вы делаете обещание себе, что Вы не измените значение (const квалификация) и запрос компилятора сохранить ее слизистое руки прочь этого объекта и выключить всю оптимизацию (volatile квалификация). К сожалению, существует мало стандарта среди поставщиков компилятора когда дело доходит до обработки volatile справедливо. И volatile подсказка к компилятору, в конце концов.

Случай практического применения этого является системными часами. Предположим, 0xDEADBEEF был Вашей системой определенный адрес аппаратного регистра часов, который Вы запишете:

int const volatile *c = reinterpret_cast<int *>(0xDEADBEEF);

Вы не можете изменить то значение регистра, но каждый раз, когда Вы читаете его, оно, вероятно, будет иметь другое значение.

Кроме того, может использовать это для модели UARTs.

17
ответ дан 3 December 2019 в 14:25
поделиться

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

1
ответ дан 3 December 2019 в 14:25
поделиться

Мне никогда не было нужно ничто являющееся и константой и энергозависимый, но вот мое предположение:

Константа: Вам, Вашему коду, не разрешают изменить значение.

Энергозависимый: значение может изменяться со временем без Вашей программы, делающей что-либо.

Таким образом, некоторые данные только для чтения, выставленные другим процессом или некоторыми аппаратными средствами, были бы константой и энергозависимый. Это могло даже быть с отображенной памятью в Ваш процесс и страницу, отмеченную только для чтения, таким образом, Вы получили бы нарушение прав доступа, если бы Вы пытались записать в него, если это не была константа.

1
ответ дан 3 December 2019 в 14:25
поделиться

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

1
ответ дан 3 December 2019 в 14:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: