![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Неактивный пользователь
Регистрация: 10.02.2008
Сообщений: 4
Репутация: 0
|
проблема в следующем:
на С++ создана (ATL) DLL для использование в C# проекте. в c++ DLL пока тока одна функция, передаётся указатель на массив чисел INT (координаты X и Y, это полигон) из c#, и точка с координатами X,Y. Функция определят лежит ли точка внутри полигона или снаружи. тест работает нормально, но в многократном вызове этой функции из C# (раз 50-150 подряд) иногда выскакивает следующая ошибка: "The server threw an exception." если у кого есть опыт посдкажите пожалуйста хотябы где начать рыть. С++ тока начал изучать и не хочу отказываться, работает быстрее, темболее есть возможность компилировать в Native code. Добавлено через 1 минуту вот сама функция c++ static int __fastcall PointInPoly(LONG Px, LONG Py, LONG* Vx, LONG* Vy, LONG n) { LONG cn = 0; // the crossing number counter int i = 0; // loop through all edges of the polygon while(n) {// edge from V[i] to V[i+1] if (((Vy[i] <= Py) && (Vy[i+1] > Py)) // an upward crossing || ((Vy[i] > Py) && (Vy[i+1] <= Py))) { // a downward crossing // compute the actual edge-ray intersect x-coordinate float vt = (float)(Py - Vy[i]) / (Vy[i+1] - Vy[i]); if (Px < Vx[i] + vt * (Vx[i+1] - Vx[i])) // P.x < intersect ++cn; // a valid crossing of y=P.y right of P.x } i++; n--; } return (cn&1); // 0 if even (out), and 1 if odd (in) } Последний раз редактировалось bublik478; 23.02.2008 в 02:43.. Причина: Добавлено сообщение |
|
|
|
| Реклама: |
|
|
#2
|
|
Постоялец
![]() ![]() ![]() ![]() ![]() Пол:
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
|
Без контекста вызова этой функции трудно что-либо сказать.
Но скорее всего, происходит выход индекса за границы массива Vx или Vy (например, при n=1 i=0 индекс Vx[i+1] уже неверный).
__________________
Сергей Сергеевич Последний раз редактировалось zss; 25.02.2008 в 22:30.. |
|
|
|
|
|
#3
|
|
Неактивный пользователь
Регистрация: 10.02.2008
Сообщений: 4
Репутация: 0
|
у меня в С# стандартный массив
int[] Vx = new int[100] int[] Vy = new int[10] вначале он заполняется и от туда я передаю так: plgIn(Px, Py, ref Vx[0], ref Vy[0], Vy.length); так что здесь врядли есть ошибка. интересно как лучше данные передавать из C# в C++ ? |
|
|
|
|
|
#4
|
|
Неактивный пользователь
Регистрация: 28.02.2008
Сообщений: 4
Репутация: 0
|
Пока могу дать один совет, простой, но верный:
распечатывать, распечатывать и распечатывать. Не лениться. Печатайте и адрес, и значение. Сами удивитесь, когда найдете ошибку. Добавлено через 9 минут Разные размеры массивов. Это очепятка или ошибка или правильно ? Мне кажется, что надо такие массивы создавать динамически. Последний раз редактировалось vbogd; 28.02.2008 в 18:49.. Причина: Добавлено сообщение |
|
|
|
|
|
#5
|
|
Неактивный пользователь
Пол:
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
|
как уже zss сказал -- ты вылазишь за границы. Когда подходишь к концу массива (последняя итерация), то n = 1, i = n - 1 и Vy[i+1] -- это Vy[n]. А это уже выход за границу, ибо в С++ индексация массивов начинается с нуля.
|
|
|
|
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Glofiish X650 иногда перезагружается | tedddy | КПК | 8 | 08.07.2009 13:14 |
| Компьютер иногда сам перезагружается. | G_Ivolgin | Компьютерные проблемы | 11 | 07.07.2009 14:14 |
| mp3 при вызове (Asus P535) | chemist | КПК | 4 | 25.12.2007 21:14 |
| при вызове диспетдиспетчер задач отключен администратором | elizbar | Windows XP | 4 | 11.04.2007 19:50 |
| Иногда они возвращаются / Sometimes They Come Back | Мафия | Зарубежные фильмы | 0 | 08.10.2006 17:16 |
|
|