Что является самым легким способом преобразовать широту и долготу для удвоения значений

Язык C оставляет компилятору некоторую свободу в отношении расположения структурных элементов в памяти:

  • могут появляться отверстия памяти между любыми двумя компонентами и после последнего компонента. Это было связано с тем, что определенные типы объектов на целевом компьютере могут быть ограничены границами адресации
  • «отверстий в памяти», включенными в результат оператора sizeof. Размер sizeof не включает в себя размер гибкого массива, который доступен в C / C ++
  • . Некоторые реализации языка позволяют вам управлять компоновкой памяти структур через параметры прагмы и компилятора

Язык C предоставляет некоторую уверенность программисту в компоновке элементов в структуре:

  • компиляторы должны назначать последовательность компонентов, увеличивая адреса памяти
  • Адрес первого компонента совпадает с начальным адресом структуры
  • неназванные битовые поля могут быть включены в структуру в требуемые выравнивания адресов соседних элементов

Проблемы, связанные с выравниванием элементов:

  • Различные компьютеры строят ребра объектов по-разному
  • Различные ограничения ширины битового поля
  • Компьютеры отличаются тем, как хранить байты в слове (Intel 80x86 и Motorola 68000)

Как работает выравнивание:

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

ps. Более подробную информацию можно найти здесь: «Сэмюэл П. Харбисон, Гай Л. Стейле CA Reference, (5.6.2 - 5.6.7) "

9
задан Nick Randell 19 September 2008 в 15:38
поделиться

3 ответа

Если Вы подразумеваете, что C# кодируют, чтобы сделать это:

закончитесь = 25 + (36 / 60) + (55.57 / 3600)

Сначала необходимо будет проанализировать выражение с Regex или некоторым другим механизмом и разделить его на отдельные части. Затем:

String hour = "25";
String minute = "36";
String second = "55.57";
Double result = (hour) + (minute) / 60 + (second) / 3600;

И конечно переключатель для зеркального отражения знака в зависимости от N/S или E/S. Википедия имеет немного на этом:

Для вычислений Западный/Восточный суффикс заменяется знаком минус в западном полушарии. Смутно, конвенция отрицания для Востока также иногда замечается. Предпочтительная конвенция - что Восток быть положительным - согласовывается с предназначенной для правой руки Декартовой системой координат с Северным полюсом. Определенная долгота может затем быть объединена с определенной широтой (обычно положительный в северном полушарии) для предоставления точной позиции по поверхности Земли. (http://en.wikipedia.org/wiki/Longitude)

11
ответ дан 4 December 2019 в 11:09
поделиться

Спасибо за все быстрые ответы. На основе ответа amdfan я поместил этот код вместе, который делает задание в C#.

/// <summary>The regular expression parser used to parse the lat/long</summary>
private static Regex Parser = new Regex("^(?<deg>[-+0-9]+)[^0-9]+(?<min>[0-9]+)[^0-9]+(?<sec>[0-9.,]+)[^0-9.,ENSW]+(?<pos>[ENSW]*)$");

/// <summary>Parses the lat lon value.</summary>
/// <param name="value">The value.</param>
/// <remarks>It must have at least 3 parts 'degrees' 'minutes' 'seconds'. If it 
/// has E/W and N/S this is used to change the sign.</remarks>
/// <returns></returns>
public static double ParseLatLonValue(string value)
{
    // If it starts and finishes with a quote, strip them off
    if (value.StartsWith("\"") && value.EndsWith("\""))
    {
        value = value.Substring(1, value.Length - 2).Replace("\"\"", "\"");
    }

    // Now parse using the regex parser
    Match match = Parser.Match(value);
    if (!match.Success)
    {
        throw new ArgumentException(string.Format(CultureInfo.CurrentUICulture, "Lat/long value of '{0}' is not recognised", value));
    }

    // Convert - adjust the sign if necessary
    double deg = double.Parse(match.Groups["deg"].Value);
    double min = double.Parse(match.Groups["min"].Value);
    double sec = double.Parse(match.Groups["sec"].Value);
    double result = deg + (min / 60) + (sec / 3600);
    if (match.Groups["pos"].Success)
    {
        char ch = match.Groups["pos"].Value[0];
        result = ((ch == 'S') || (ch == 'W')) ? -result : result;
    }
    return result;
}
8
ответ дан 4 December 2019 в 11:09
поделиться

Что Вы желаете представить его как? Секунды дуги? Затем 60 минут в каждом градусе, 60 секунд в каждую минуту. Необходимо было бы затем сохранить E и N собой.

Это не то, как это обычно делается все же.

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

0
ответ дан 4 December 2019 в 11:09
поделиться
Другие вопросы по тегам:

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