Я использую Ubuntu 12.04 на своем ноутбуке HP Envy с нескольких лет без любых проблем. Я также регулярно обновляю Ubuntu. Вчера (20.03.2014), когда я обновил, это прекратило загружаться. Я получаю экран входа в систему, но после входа в систему затем не загружается единица. Если я открываю командную строку с помощью Ctrl+Alt+F1, я получаю следующую ошибку:
[ 33.650398] [drm:gen6_sanitize_pm] *ERROR* Power management discrepancy: GEN6_RP_INTERRUPT_LIMITS expected 15070000, was 15000000
Может кто-либо помогать мне
Kiran
Ну, сначала необходимо понять, что попытка вытащить значение из массива может дать Вам подсказку к своему первому элементу:
int a[] = {1, 2, 3};
int *ap = a; // a pointer, size is lost
int (&ar)[3] = a; // a reference to the array, size is not lost
Ссылки относятся к объектам с помощью своего точного типа или своего типа базового класса. Ключ - то, что шаблон берет массивы ссылкой. Массивы (не ссылки на них) как параметры не существуют в C++. Если Вы дадите параметру тип массива, то это будет указатель вместо этого. Так использование ссылки необходимо, когда мы хотим знать размер переданного массива. Размер и тип элемента автоматически выведены, поскольку обычно имеет место для шаблонов функций. Следующий шаблон
template<typename T, size_t n>
size_t array_size(const T (&)[n]) {
return n;
}
Названный с нашим ранее определенным массивом a
неявно инстанцирует следующей функции:
size_t array_size(const int (&)[3]) {
return 3;
}
, Который может использоваться как это:
size_t size_of_a = array_size(a);
<час> существует изменение, которое я составил некоторое время назад [Редактирование: оказывается, что у кого-то уже была та же самая идея здесь ] , который может определить значение во время компиляции. Вместо того, чтобы возвратить значение непосредственно, это дает шаблону тип возврата в зависимости от n
:
template<typename T, size_t n>
char (& array_size(const T (&)[n]) )[n];
Вы говорите, имеет ли массив n
элементы, тип возврата является ссылкой на массив, имеющий размер n
и тип char
элемента. Теперь, можно добраться, время компиляции определило размер переданного массива:
size_t size_of_a = sizeof(array_size(a));
, поскольку массив [1 112] наличие n
элементы имеет sizeof n
, который даст Вам число элементов в данном массиве также. Во время компиляции, таким образом, можно сделать
int havingSameSize[sizeof(array_size(a))];
, поскольку функция никогда на самом деле не вызывается, она не должна быть определена, таким образом, она не имеет тела. Надежда я мог разрешить вопрос немного.
Я не знаю, какое Ядро Вы используете. У меня была та же проблема с 3.2.0-58-универсальным № 88, и я недавно обновил его к 3.2.0-61 (последний, доступный от менеджера по обновлению), но так как эта проблема появляется, когда я не перезагружал с долгого времени я не уверен, решило ли это проблему (я предполагаю, что это не сделало),
Я нашел, что в принципе 3.3.6 решил эту проблему, но я не уверен, как сделать это с Ubuntu 12.04 или если это безопасно. Взгляните здесь:
https://bugs.launchpad.net/ubuntu / + source/gnome-nettool / + ошибка/1168467
Ничего не происходит с массивом. Это - неиспользованный параметр, который используется для разрешения подписи шаблонной функции.
Это также не может использоваться в качестве аргумента шаблона, но это - отдельная гнида.
Думайте о нем этот путь, предположите, что у Вас был набор функций:
// Note that you don't need to name the array, since you don't
// actually reference the parameter at all.
size_t array_size(const int (&)[1])
{
return 1;
}
size_t array_size(const int (&)[2])
{
return 2;
}
size_t array_size(const int (&)[3])
{
return 3;
}
// etc...
Теперь, когда Вы называете это, какая функция вызвана?
int a[2];
array_size(a);
Теперь, если Вы templatize arraysize, Вы добираетесь:
template <int n>
size_t array_size(const int (&)[n])
{
return n;
}
компилятор попытается инстанцировать версии array_size, который соответствует любому параметру, с которым Вы называете его. Таким образом, при вызове его с массивом 10 ints это инстанцирует array_size с n=10.
Затем, просто templatize тип, таким образом, можно назвать его с больше, чем просто международными массивами:
template <typename T, int n>
size_t array_size(const T (&)[n])
{
return n;
}
И Вы сделаны.
Редактирование : примечание о (&)
круглые скобки необходимы вокруг &
для дифференциации между массивом международных ссылок (недопустимых) и ссылочных к массиву ints (что Вы хотите). Так как приоритет []
выше, чем [1 110], если у Вас есть объявление:
const int &a[1];
из-за приоритета оператора, Вы заканчиваете с массивом с одним элементом ссылок константы на интервал, Если Вы хотите &
примененный сначала, необходимо вызвать это с круглыми скобками:
const int (&a)[1];
Теперь Вы имеют ссылку константы на один массив элемента ints. В списке параметра функции Вы не должны указывать название параметра, если Вы не используете его, таким образом, можно отбросить имя, но сохранять круглые скобки:
size_t array_size(const int (&)[1])