Змінюй хід війни! Допомагай ЗСУ!

шарпы и длл на с+

🔴 21:30 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 11.03.2009
Повідом.: 44
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #1
шарпы и длл на с++

как ясно из темы приложение на шарпах, а длл-ка на плюсах
немогу работать с масивом пишет все время
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. System.Exception {System.AccessViolationException}
все написано в MS VS 2005
остановился вот на этом варианте думал избежать ее переганяя матрицу с матрицы но и это не получается...
часть на плюсах
Код:
void FrMToM(int FromMatr [][1],	int **ToMatr)
{
	for(int i=0; i<Row; i++)
	{
		for(int j=0; j<Col; j++)
		{
			ToMatr[i][j]=FromMatr[i][j];
		}
	}
}


__declspec(dllexport) void start(int Row_csh,int Col_csh,int matr_csh [][1])
{

Row = Row_csh;
Col = Col_csh;

FrMToM(matr_csh,matrix);
}
часть на шарпах
Код:
public class dllchik
        {
            [DllImport("my_DLL.dll", EntryPoint = "start")]
            public static extern void start(int Row_csh, int Col_csh, int [,] matr_csh);

        }

dllchik.start(rowMatr, colMatr, matFile);
вот что должно передется
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
0 0 1 1
1 0 0 1
1 1 0 0
0 0 0 1
1 0 0 0
1 1 1 1
0 0 0 0
и что передалось
0 1 1 1
1 1 1 1
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
1 1 1 1
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #2
Попробуйте так:
Код:
__declspec(dllexport) void FrMToM(int **FromMatr,int **ToMatr, int Row, int Col)
{
	for(int i=0; i<Row; i++)
	{
		for(int j=0; j<Col; j++)
		{
			ToMatr[i][j]=FromMatr[i][j];
		}
	}
}
(В этом случае у вас будет экспортироваться не start, а FrMToM)
Из # тогда будете вызывать так:
Код:
public class dllchik
        {
            [DllImport("my_DLL.dll", EntryPoint = "FrMToM")]
            public static extern void FrMToM(int **FirsMatrPtrPtr, int** SecondMatrPtrPtr, int Row_csh, int Col_csh);

        }
int Matr1[x][y];
int Matr2[x][y];

//Инициализируйте матрицы

dllchik.FrMToM(Matr1, Matr2, rowMatr, colMatr);
 
Останнє редагування:
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #3
подобное пробывал выскакивала ошибка
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. System.Exception {System.AccessViolationException}
но сейчас проверю ваш вариант
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #4
Передавайте вашей функции FromMToM указатель на первый элемент двумерного массива. И еще - массив естественно должен быть корректных размеров, иначе безусловно будут "вылазки" за границы массива с непредсказуемыми последствиями.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #5
Передавайте вашей функции FromMToM указатель на первый элемент двумерного массива. И еще - массив естественно должен быть корректных размеров, иначе безусловно будут "вылазки" за границы массива с непредсказуемыми последствиями.

int Matr1[rowMatr][colMatr];
Error Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type.
это я записевал перед этим так
int [][] Mart1 = new int [rowMatr][]
for (int i = 0; i < Matr1.Length; i++)
{
Matr1 = new int[colMatr];
}

Error Pointers and fixed size buffers may only be used in an unsafe context
public static extern void FrMToM(int ** FirsMatrPtrPtr, int ** SecondMatrPtrPtr, int Row_csh, int Col_csh);

там я менял на int [][] FirsMatrPtrPtr
выскакивала ошибка что не пожет упаковать, т.е. даже в дллку не передавало...

чтоб так записивать я думаю нужно использовать блоки unsafe, но мне хотелось обойтись без них

а разве имя масива это не указатель на первый елемент?
я ваш код еще не запускал...
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #6
Есть еще один вариант (проверить правда не успела), но он будет довольно таки "в лоб":
Код:
void FrMToM(int FromMatr[Nrow][Ncol],int ToMatr[Nrow][Ncol],int Row,int Col)
{
	for(int i=0; i<Row; i++)
	{
		for(int j=0; j<Col; j++)
		{
			ToMatr[i][j]=FromMatr[i][j];
		}
	}
}
причем размерности массивов Nrow и Ncol - это константы, что не есть хорошо...
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #7
:)
это уже проверял, проблема в том, что масив когда передался в длл уже кривой, проверял записью в файл
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #8
Чтобы использовать указатели в .NET, тебе прийдётся отключить безопасный код. В имени функции пишешь unsafe
Например так: public unsafe void lalala(){...}
Тогда не будет возникать ошибка
Error Pointers and fixed size buffers may only be used in an unsafe context
public static extern void FrMToM(int ** FirsMatrPtrPtr, int ** SecondMatrPtrPtr, int Row_csh, int Col_cs
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #9
да я знаю, писал, что хочу без них, знакомый делал без unsafe, но как он эго передавал и изменял в дллке не знаю и возможности узнать не будит долго...
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #10
По поводу неявной передачи ссылок в C# (без включения режима unsafe), может вам пригодится: Посилання видалено
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #11
error.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #12
Не знаю, все открывается:
Ключевое слово ref используется для передачи аргументов по ссылке. В результате все изменения параметра в методе будут отражены в переменной при передаче элемента управления обратно в вызывающий метод. Для работы с параметром ref определение метода м вызывающий метод должны явно использовать ключевое слово ref. Пример.

Язык C# Копировать код
class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}



Аргумент, передаваемый в параметр ref, сначала следует инициализировать. В этом заключается отличие от out, аргументы которого не требуют явной инициализации перед передачей. Дополнительные сведения см. в разделе out.

Хотя ref и out по-разному обрабатываются во время выполнения, в режиме компиляции они управляются одинаково. Следовательно, если один метод принимает аргумент ref, а другой — out, они не могут быть перегружены. Эти два метода идентичны, например, при компиляции, поэтому данный код скомпилирован не будет.

Язык C# Копировать код
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}


Однако перегрузка возможна, если один метод принимает аргумент ref или out, а другой не принимает ни одного, как показано в следующем примере.

Язык C# Копировать код
class RefOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}



Свойства не являются переменными и поэтому не могут быть переданы в качестве параметров ref.

Дополнительные сведения о передаче массивов см. в разделе Передача массивов при помощи параметров ref и out (руководство по программированию на C#).

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

Язык C# Копировать код
class RefExample2
{
static void Method(ref string s)
{
s = "changed";
}
static void Main()
{
string str = "original";
Method(ref str);
Console.WriteLine(str);
}
}
// Output: changed


Спецификация языка C#
Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:

5.1.5 Параметры ссылок

10.6.1.2 Параметры ссылок

См. также
Основные понятия
Руководство по программированию в C#
Ссылки
Передача параметров (Руководство по программированию в C#)
Параметры методов (Справочник по C#)
Ключевые слова C#
Другие ресурсы
Справочник по C#
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #13
Ну в общем я пробовал, были ерроры я и забил…
Сделал считку и запись с файла массива c dll`ки и все ок, когда матрица 11х4, а когда 120х7, то зависает…
Почему не могу понять, кто что скажет???
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #14
чуть не забыл, тотже код с компилированой екзешки работает на ура...
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #15
Ну в общем я пробовал, были ерроры я и забил…
Сделал считку и запись с файла массива c dll`ки и все ок, когда матрица 11х4, а когда 120х7, то зависает…
Почему не могу понять, кто что скажет???

зависает потому что засираешь не свою память. Я что-то в твоем коде не увидел как ты память под второй массив выделяешь. Куда оно все пишецца?
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #16
зависает потому что засираешь не свою память. Я что-то в твоем коде не увидел как ты память под второй массив выделяешь. Куда оно все пишецца?

под какой массив(точнее)?
поподробней насчет засирания памяти...
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #17
Под массив в который ты копируешь - где память выделяется, святым духом? :)

А засрать память - вот по моему так и выходит, указатель смотрит хз куда и в некоторых случах твой код лезет в защищенную память - получаешь генерала (general protection fault). А если повезло - то лезет в разрешенную память но которая уже выделена для кого-то - получаешься зависание.

Ты бы полностью solution выложил. Там 5 минут под отладчиком понять где ты налажал.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #18
Под массив в который ты копируешь - где память выделяется, святым духом? :)

А засрать память - вот по моему так и выходит, указатель смотрит хз куда и в некоторых случах твой код лезет в защищенную память - получаешь генерала (general protection fault). А если повезло - то лезет в разрешенную память но которая уже выделена для кого-то - получаешься зависание.

Ты бы полностью solution выложил. Там 5 минут под отладчиком понять где ты налажал.

там много, всмисле налажал... я ж писал, что приложение отлично делает то что нужно, но когда дллка тогда виснит...
дайте хоть имя массива, а то я не догоню...
и ваще я создаю один массив при считке, потом когда нужно еще создаю временые массивы и удаляю их, а после вывода в файл и первый массив тож удаляю
еще проблема что это приложение не я писал, а я его должен дописать
с шарпов я просто вызываю start();
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #19
там много, всмисле налажал... я ж писал, что приложение отлично делает то что нужно, но когда дллка тогда виснит...
дайте хоть имя массива, а то я не догоню...
и ваще я создаю один массив при считке, потом когда нужно еще создаю временые массивы и удаляю их, а после вывода в файл и первый массив тож удаляю
еще проблема что это приложение не я писал, а я его должен дописать
с шарпов я просто вызываю start();

Блять. Вот здесь:
void FrMToM(int FromMatr [][1], int **ToMatr)

ToMatr - где память выделяется?
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #20
Назад
Зверху Знизу