Переменная name
, но вы использовали person
, поэтому она находит элемент с идентификатором person
, поскольку они не являются переменными person
.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Challenge: Mad Libs</title>
</head>
<body>
<h1>Mad Libs</h1>
<ul>
<li>Noun: <input type="text" id="noun"></li>
<li>Adjective: <input type="text" id="adjective"></li>
<li>Someone's Name: <input type="text" id="person"></li>
</ul>
<button id="lib-button">Lib it!</button>
<p>Generated story:
<span id="story"></span>
</p>
<script>
var libButton = document.getElementById('lib-button');
var libIt = function() {
var storyDiv = document.getElementById("story");
var noun = document.getElementById("noun").value;
var adjective = document.getElementById("adjective").value;
var name = document.getElementById("person").value;
storyDiv.innerHTML = "I took my " + noun + " and " +
adjective + " it. "+ name + " didn't like it.";
};
libButton.addEventListener('click', libIt);
</script>
</body>
</html>
Хорошо, кажется, существуют проблемы с тем, что Вы делаете на двух разных уровнях. Часть беспорядка здесь, кажется, происходит для Вашего использования указателей, на какие объекты они указывают на, и затем интерпретация кодирования значений в памяти, на которую указывает указатель (указатели).
Кодирование многобайтовых объектов в памяти - то, что упоминается как порядок байтов. Две общих кодировки упоминаются как и Обратный порядок байтов (BE) С прямым порядком байтов (LE). С LE 16-разрядное количество как короткое является закодированным младшим значащим байтом (LSB) сначала. Под БЫТЬ, старший значащий байт (MSB) кодируется сначала.
Условно, сетевые протоколы обычно кодируют вещи в то, что мы называем "сетевым порядком байтов" (NBO), который также, оказывается, совпадает с БЫТЬ. Если Вы отправите и получите буферы памяти на платформах с обратным порядком байтов, то Вы не столкнетесь с проблемами преобразования. Однако Ваш код затем был бы платформой, зависящей от БЫТЬ конвенцией. Если Вы хотите написать портативный код, который работает правильно и над LE и ЯВЛЯЕТСЯ платформами, Вы не должны принимать порядок байтов платформы.
Достижение мобильности порядка байтов является целью стандартных программ как ntohs (), ntohl (), htons (), и htonl (). Эти функции/макросы определяются на данной платформе, чтобы сделать необходимые преобразования в передающих и принимающих концах:
Поймите, что Ваш комментарий о доступе к памяти при бросании к символам не имеет никакого влияния на фактическом порядке объектов в памяти. Таким образом, при доступе к буферу как к ряду байтов Вы будете видеть байты в любом порядке, они были на самом деле закодированы в память как, имеете ли Вы БЫТЬ или машина LE. Таким образом, при рассмотрении NBO, закодированный буфер после получает, MSB будет первым - всегда. Если Вы смотрите на буфер вывода после того, как Ваш преобразовали назад для хостинга порядка, если Вы имеете, машина, порядок байтов будет неизменен. С другой стороны, на машине LE, байты будут все теперь инвертированы в преобразованном буфере.
Наконец, в Вашем цикле преобразования, переменной total
относится к байтам. Однако Вы получаете доступ к буферу как shorts
. Ваша защита цикла не должна быть total
, но должен быть:
total / sizeof( unsigned short )
составлять двухбайтовую природу каждого short
.
Это работает хорошо, когда я рассматриваю данные как короткое, однако если я бросил указатель на символ снова, байты инвертируются.
Это - то, что я ожидал бы.
Что я делаю неправильно?
Необходимо знать что отправленный отправитель: знайте, являются ли данные байтами (которым не нужно инвертирование), или короткие замыкания, или longs (которые делают).
Google для учебных руководств, связанных с ntohs
, htons
, и htons
API.
Это не ясно что aResponse
представляет (строка символов? структура?). Порядок байтов важен только для численных значений, нет char
s. Также необходимо удостовериться, что в стороне отправителя, все численные значения преобразовываются от хоста до сетевого порядка байтов (hton*
).
Кроме Вашего исходного вопроса (тому, которое я думаю, уже ответили), необходимо взглянуть на malloc оператор. malloc выделяет байты, и короткое целое без знака, скорее всего, составит два байта.
Ваш оператор должен быть похожим:
unsigned short *ptr = (unsigned short*) malloc(total * sizeof(unsigned short));
сетевой порядок байтов является обратным порядком байтов, таким образом, необходимо преобразовать его в прямой порядок байтов, если Вы хотите, чтобы он имел смысл, но если это - только массив, он не должен поднимать шум, как делает отправителя, отправляет, это - данные?