考虑以下c ++代码
#include "stdafx.h"
#include<iostream>
using namespace std;
this much part i want in c#..
void ping(int,char* d[]);
void ping(int a,char *b[])
{
int size;
size=sizeof(b)/sizeof(int); // total size of array/size of array data type
//cout<<size;
for(int i=0;i<=size;i++)
cout<<"ping "<<a<<b[i]<<endl;
}
以下部分是c ++
int _tmain(int argc, _TCHAR* argv[])
{
void (*funcptr)(int,char* d[]);
char* c[]={"a","b"};
funcptr= ping;
funcptr(10,c);
return 0;
}
我如何在c#中实现相同的功能.. 我是c#的新手。我怎样才能在c#中使用char指针数组?
答案 0 :(得分:3)
您通常会避免使用char*
或char[]
来支持string课程。如果你想要一个字符串数组,你可以使用char* d[]
而不是string[] d
,如果你想要一个字符列表,你可以使用简单的string d
。
C ++和C#之间的互操作总是很棘手。一些好的参考文献包括Pass C# string to C++ and pass C++ result (string, char*.. whatever) to C#和Using arrays and pointers in C# with C DLL。
答案 1 :(得分:0)
string
是一个字符列表。在提到字符操作和循环使用时,我假设您关注的是从一个列表/数组中定位特定字符 - 在这种意义上,当您从string
查询特定字符时,您可以几乎相同地编码(如如果它是char
数组。)
例如:
string testString = "hello";
char testChar = testString[2];
在这种情况下,testChar将等于'l'。
答案 2 :(得分:0)
首先,你的“C ++”代码实际上是C和坏C,它根本无法正确执行。 sizeof(b)
将不为您提供数组或其他类似内容的大小,它会为您提供指针的大小。在尝试转换为C#之前,请考虑编写一些正确的C ++。
template<int N> void ping(int a, std::array<std::string, N>& arr) {
for(int i = 0; i < N; i++) std::cout << a << arr[i] << "\n";
}
int _tmain(int argc, _TCHAR* argv[]) {
std::array<std::string, 2> c = { "a", "b" };
ping(10, c);
return 0;
}
C#没有静态大小的数组,但其余的很容易完成
public static void ping(int a, string[] arr) {
for(int i = 0; i < arr.Length; i++) {
System.Console.Write(a);
System.Console.Write(arr[i]);
}
}
public static void Main(string[] args) {
string[] arr = { "a", "b" };
ping(10, arr);
}
答案 3 :(得分:0)
这应该可以帮到你,虽然注意输出缓冲区的大小是固定的,所以这对于动态大小的字符串不起作用,你需要事先知道它的大小。
public unsafe static void Foo(char*[] input)
{
foreach(var cptr in input)
{
IntPtr ptr = new IntPtr(cptr);
char[] output = new char[5]; //NOTE: Size is fixed
Marshal.Copy(ptr, output, 0, output.Length);
Console.WriteLine(new string(output));
}
}
请记住允许不安全的代码,因为这是您在C#中使用固定指针的唯一方法(右键单击项目,属性,构建,允许不安全的代码)。
下一次更加具体和明确,并尝试更加尊重这里的人,我们没有得到报酬,以帮助您了解: - )
答案 4 :(得分:0)
我们可以这样做
在DLL中我们将 extern "C" __declspec(dllexport) void __stdcall Caller()
{
static char* myArray[3];
myArray[0]="aasdasdasdasdas8888";
myArray[1]="sssss";
FunctionPtr1(2,myArray);
}
and in C# i just added following lines
public static void ping(int a, IntPtr x)
{
Console.WriteLine("Entered Ping Command");
//code to fetch char pointer array from DLL starts here
IntPtr c = x;
int j = 0;
string[] s = new string[100]; //I want this to be dynamic
Console.WriteLine("content of array");
Console.WriteLine("");
do
{
s[j] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(c, 4 * j));
Console.WriteLine(s[j]);
j++;
} while (s[j - 1] != null);
//**********end****************
Console.WriteLine("Integer value received from DLL is "+a);
}