Приведение типов массива int к указателю на символ и чтение промежуточных значений двух индексов

При использовании window.onbeforeunload (или $(window).on("beforeonload")) можно ли отображать пользовательское сообщение в этом всплывающем окне?

Больше не нужно. Все основные браузеры начали игнорировать фактическое сообщение и просто показать свои собственные.

Изучая существующие ответы, я чувствую, что это было возможно в прошлом с использованием таких вещей, как confirm или alert или event.returnValue, но теперь кажется, что они больше не работают.

Исправить. Давным-давно вы могли использовать confirm или alert, в последнее время вы можете вернуть строку из обработчика onbeforeunload, и эта строка будет отображаться. Теперь содержимое строки игнорируется и рассматривается как флаг.

При использовании jQuery's on вам действительно нужно использовать returnValue в исходном событии:

$(window).on("beforeunload", function(e) {
    // Your message won't get displayed by modern browsers; the browser's built-in
    // one will be instead. But for older browsers, best to include an actual
    // message instead of just "x" or similar.
    return e.originalEvent.returnValue = "Your message here";
});

или старый способ:

window.onbeforeunload = function() {
    return "Your message here"; // Probably won't be shown, see note above
};

Это все, что вы можете сделать.

0
задан Snowfox 31 March 2019 в 15:05
поделиться

3 ответа

Почему я получаю 0 вместо значения мусора (рассмотрим в точке A, мы должны получить целочисленное значение, равное последним 3 байтам первого [i] + байта [1])

Потому что написанный вами код этого не делает. У вас есть массив int, к которому вы обращаетесь с помощью указателя на символ. Итак, *(p+0) собирается дать вам первый байт. *(p+1) второй и тд. Вы преобразуете в int ненужное (оно только конвертирует полученное число в int), это происходит слишком поздно. Вам необходимо изменить значение указателя:

std::cout << *(int*)(p+1);

Обратите внимание, что это неопределенное поведение.

0
ответ дан Rakete1111 31 March 2019 в 15:05
поделиться

Почему я получаю 0 вместо значения мусора

Почему вы думаете, что 0 не является значением мусора? Нет никакой гарантии, что значение мусора не равно 0. 0 является абсолютно допустимым значением для мусора.

Тем не менее, вы не печатаете ничего, что имеет мусорное значение. Между элементами массива нет заполнения, и сам элемент int не содержит заполнения, и в массиве нет неинициализированных объектов.

int состоит из одного или нескольких байтов. В вашей системе это 4 байта. p+0 указывает на первый байт, p+1 указывает на второй байт, p+4 указывает на первый байт второго целого числа. Если ни первый, ни второй байт не имеют значения 0, то целое число не может быть равно 1.

чтение значений между двумя индексами

Между элементами массива нет пробела, поэтому читать нечего. Вы читаете разные части элемента в массиве.

(рассмотрим в точке A, мы должны получить целочисленное значение, равное последним 3 байтам первого байта [i] + a [1]).

Вы можете добиться этого следующим образом:

int i;
std::memcpy(&i, p + 1, sizeof i);
std::cout << i;
0
ответ дан eerorika 31 March 2019 в 15:05
поделиться

Во-первых, 0 является совершенно допустимым «значением мусора».

Но это спорный вопрос, потому что вы на самом деле не конвертируете 4 байта в целое число & mdash; Вы извлекаете один байт, а затем конвертируете его в целое число. Вы должны были бы интерпретировать char* как int* (затем разыменовывать его), чтобы делать то, что вы говорите, что делаете, и тогда мы приходим к:

Неопределенное поведение

Такое манипулирование памятью имеет неопределенное поведение . Все может произойти, если вы попытаетесь сделать вид, что не int является int.

1111 Это не просто стандарт или пуританство, или педантизм. Это правда и имеет реальные практические результаты, такие как тот, который вы видели.

Процесс перевода абстрактной программы, которую вы описали с использованием слов C ++, в реальную практическую программу, понятную компьютеру, невероятно сложен . Компилятор не берет ваши строки по одной и просто наивно переписывает их в код, который одинаков, но на машинном языке. Он читает весь ваш исходный код, понимает, что вы хотите, чтобы программа, которую он описывает для вас, затем создает совершенно новую программу на совершенно другом, не связанном, отдельном языке, который дает тот же результат. Для того, чтобы сделать это быстро, нужны также ярлыки.

Когда вы пишете программу, поведение которой не определено, вы нарушаете этот процесс. Вы просто не можете предположить, что «мы должны получить целочисленное значение, равное 3 последним байтам первого байта [i] + a [1]». Вероятнее всего, это было правдой в 1970-х годах, но компьютеры действительно сложные, современные больше, чем старинные.

Короткая версия: не делай этого.

0
ответ дан Lightness Races in Orbit 31 March 2019 в 15:05
поделиться
Другие вопросы по тегам:

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