Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Форум .::NoWa.cc::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование > Visual C++ / С/C++

Уважаемые пользователи nowa.cc. Мы работаем для вас более 20 лет и сейчас вынуждены просить о финансовой помощи по оплате за сервер.
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: Z021474945171 Webmoney WME: E159284508897 Webmoney WMUSDT: T206853643180
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!

Ответ
 
Опции темы Опции просмотра Language
Старый 23.02.2008, 02:41   #1
Неактивный пользователь
 
Регистрация: 10.02.2008
Сообщений: 4
Репутация: 0
По умолчанию ошибка при вызове C++ ATL DLL из C#, иногда при вызове DLL из C#, иногда server error

проблема в следующем:

на С++ создана (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.. Причина: Добавлено сообщение
bublik478 вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама:


Старый 23.02.2008, 21:40   #2
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Ответ: ошибка при вызове C++ ATL DLL из C#, иногда при вызове DLL из C#, иногда serv

Без контекста вызова этой функции трудно что-либо сказать.
Но скорее всего, происходит выход индекса за границы массива Vx или Vy
(например, при n=1 i=0 индекс Vx[i+1] уже неверный).
__________________
Сергей Сергеевич

Последний раз редактировалось zss; 25.02.2008 в 22:30..
zss вне форума
 
Ответить с цитированием Вверх
Старый 27.02.2008, 08:43   #3
bublik478
Неактивный пользователь
 
Регистрация: 10.02.2008
Сообщений: 4
Репутация: 0
По умолчанию Ответ: ошибка при вызове C++ ATL DLL из C#, иногда при вызове DLL из C#, иногда serv

у меня в С# стандартный массив
int[] Vx = new int[100]
int[] Vy = new int[10]

вначале он заполняется и от туда я передаю так:

plgIn(Px, Py, ref Vx[0], ref Vy[0], Vy.length);

так что здесь врядли есть ошибка.

интересно как лучше данные передавать из C# в C++ ?
bublik478 вне форума
 
Ответить с цитированием Вверх
Старый 28.02.2008, 18:40   #4
vbogd
Неактивный пользователь
 
Регистрация: 28.02.2008
Сообщений: 4
Репутация: 0
По умолчанию Ответ: ошибка при вызове C++ ATL DLL из C#, иногда при вызове DLL из C#, иногда serv

Пока могу дать один совет, простой, но верный:
распечатывать, распечатывать и распечатывать.
Не лениться.

Печатайте и адрес, и значение.

Сами удивитесь, когда найдете ошибку.

Добавлено через 9 минут
Разные размеры массивов. Это очепятка или ошибка или правильно ?
Мне кажется, что надо такие массивы создавать динамически.

Последний раз редактировалось vbogd; 28.02.2008 в 18:49.. Причина: Добавлено сообщение
vbogd вне форума
 
Ответить с цитированием Вверх
Старый 14.03.2008, 18:08   #5
Baller
Неактивный пользователь
 
Пол:Мужской
Регистрация: 28.01.2008
Сообщений: 26
Репутация: 5
По умолчанию Ответ: ошибка при вызове C++ ATL DLL из C#, иногда при вызове DLL из C#, иногда serv

как уже zss сказал -- ты вылазишь за границы. Когда подходишь к концу массива (последняя итерация), то n = 1, i = n - 1 и Vy[i+1] -- это Vy[n]. А это уже выход за границу, ибо в С++ индексация массивов начинается с нуля.
Baller вне форума
 
Ответить с цитированием Вверх
Ответ


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 01:40. Часовой пояс GMT +3.


Copyright ©2004 - 2026 NoWa.cc

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.04512 секунды с 11 запросами