Понял! Проблема заключалась во включении __stdcall
в объявление функции или, скорее, в __stdcall
в определении типа указателя на функцию. Кажется, что при определенных сочетаниях архитектуры __stdcall
может вызывать или не вызывать ошибку преобразования типа, если __stdcall
также отсутствует в определении типа указателя. Объявление типа моего указателя на функцию выглядит следующим образом:
typedef double(__stdcall *convertFunc)(EUnits, EUnits, double);
typedef int(__stdcall *convertFuncD)(EUnits, EUnits, double*,double*,int);
typedef int(__stdcall *convertFuncF)(EUnits, EUnits, float*, float*, int);
исправили ошибку!
using System.IO;
using System.Xml;
using System.Xml.XPath;
. . .
string xml = @"<poi>
<city>stockholm</city>
<country>sweden</countr>
<gpoint>
<lat>51.1</lat>
<lng>67.98</lng>
</gpoint>
</poi>";
XmlReaderSettings set = new XmlReaderSettings();
set.ConformanceLevel = ConformanceLevel.Fragment;
XPathDocument doc =
new XPathDocument(XmlReader.Create(new StringReader(xml), set));
XPathNavigator nav = doc.CreateNavigator();
Console.WriteLine(nav.SelectSingleNode("/poi/gpoint/lat"));
Console.WriteLine(nav.SelectSingleNode("/poi/gpoint/lng"));
Вы могли, конечно, использовать xpath SelectSingleNode
выбрать <gpoint>
элемент в переменную.
Использование Linq для XML:
XDocument doc= XDocument.Parse("<poi><city>stockholm</city><country>sweden</country><gpoint><lat>51.1</lat><lng>67.98</lng></gpoint></poi>");
var points=doc.Descendants("gpoint");
foreach (XElement current in points)
{
Console.WriteLine(current.Element("lat").Value);
Console.WriteLine(current.Element("lng").Value);
}
Console.ReadKey();
Еще более простой, чем ответ Mitch Wheat, так как рассматриваемый фрагмент является правильно построенным XML-документом:
using System.Xml;
using System.IO;
...
string xml = @"<poi>
<city>stockholm</city>
<country>sweden</country>
<gpoint>
<lat>51.1</lat>
<lng>67.98</lng>
</gpoint>
</poi>";
XmlDocument d = new XmlDocument();
d.Load(new StringReader(xml));
Console.WriteLine(d.SelectSingleNode("/poi/gpoint/lat").InnerText);
Console.WriteLine(d.SelectSingleNode("/poi/gpoint/lng").InnerText);
Если можно использовать LINQ для XML, можно считать те два значения, прямые как это:
var doc = XDocument.Parse("...");
var point = doc.Element("poi").Element("gpoint");
Console.WriteLine("Lat: {0}, Lng: {1}",
point.Element("lat").Value,
point.Element("lng").Value);
При необходимости в них как дважды, необходимо преобразовать их:
double lat = Convert.ToDouble(point.Element("lat").Value,
CultureInfo.InvariantCulture);
Не забывайте указывать культуру, которая использует точку для частей. Иначе это уступило бы 511.0 как широта.