Wpis z mikrobloga

Witam mirków!
Prosze o pomoc, bo jestem w kropce... Pisze aplikacje w C# z biblioteką z C++. Aplikacją jest kalkulator macierzy, aktualnie chce dodać macierze do siebie, za co ma odpowiedziec biblioteka. Kod wyglada tak:
void SumowanieMacierzy (int pierwsza[10], int druga[10], int trzecia[10])
{
for (int i = 0; i < 10; i++)
{
if (pierwsza[i] != NULL && druga[i] != NULL)
{
trzecia[i] = pierwsza[i] + druga[i];
}
}

}
W C# interfejs jest zrobiony, po wpisaniu przez uzytkownika liczby wierszy i kolumn tworzy sie macierz z textboxów, wiec powstają nam dwie tablice textboxów. Tablice te następnie konwertuje na tablice intów które jak widac prześle wyżej do tej dll'ki. no i mam trzy tablice intów, arr4(która powstała z pierwszej macierzy), arr5(z drugiej z macierzy) oraz arr6 która jest aktualnie pusta i zostanie po wykonaniu metody uzupełniona.
int[] arr4 = new int[10];
int[] arr5 = new int[10];
int[] arr6 = new int[10];
Tutaj kod zaimportowania metody do C#:
[DllImport("KalkMacierzyLib.dll")]
public static extern void SumowanieMacierzy(int[] pierwsza, int[] druga, int[] trzecia);

No i teraz chce wykonać metode która jako parametry pobierze moje tablice arr4, arr5 i arr6(class1 to nazwa klasy w bilbiotece, w której jest ta metoda):
Class1 cls2 = new Class1();
cls2.SumowanieMacierzy(arr4, arr5, arr6);
I tu jest problem. wszystkie parametry (arr4, arr5, arr6) są podkreślane osobno i kazda z nich ma błąd "Cannot convert from 'int[]' to 'int*' ".
Mirki pomóżcie, albo chociaz sposoby ominięcia tego, albo pomysł jak inaczej to rozegrać. Wszystkie znaki na niebie i ziemi mówią mi, że powinno to działać. Stack i inne zakątki internetu przejrzane, ale nikt nie pisał o takim problemie. Czy to niezgodność typów pomiedzy tymi językami, który uniemożliwi mi zrobienie tego w ten sposób? czy to tylko jakiś mały błąd?

#csharp #cpp #programowanie
  • 13
@Slowo: Nie miałem nigdy takiego problemu, ale pierwszy strzał:

[DllImport("KalkMacierzyLib.dll", CallingConvention=CallingConvention.Cdecl)]
Jak możesz to solucję :P
Ewentualnie może:

cls2.SumowanieMacierzy(ref arr4, ref arr5, ref arr6);
int[]

w c# to nie to samo co

int pierwsza[10]

w c++

@Slowo: Po za tym czemu mieszasz cpp z c#? Tak dla sportu/ćwiczenia? Bo generalnie szybciej napiszesz wszystko w c#/cpp niż ożenisz oba (co nie znaczy, ze się nie da :P)
@Golomp: refy niestety nie działają, jedna z pierwszym rzeczy które probowałem (,). Callingconvention mi sie podkresla jako: 'callingconvetion is not a attribute class'. System.Runtime.InteropServices oczywiście mam. @kozunio12: Kod z C++ jest zawarty na początku, to jest ta metoda SumowanieMacierzy. Poczytam o tych typach, myslalem ze zgodne, czyli wlasnie tablica int do tablicy intów :/
@Yahoo_: Wiem niestety, w C# już bym sobie to napisał, ale
bo rozmiaru 10 nie mogę wcisnąć do niej, bo wyskakuje błąd ze to nie miejsce na definiowanie wielkosci tablic. Czy chodzi ci o zgodność typów, że czegos innego powinienem użyc?


@Slowo: int[] w c# to tylko allias na Array, który jest klasą zdefiniowaną w .NET. int[10] w cpp to w dużym uproszczeniu (bo szczerze mówiąc cpp nie znam za dobrze :P) wskaźnik na pierwszy i rezerwacja w pamięci dla 10 elementów