0

考虑以下 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 指针数组?

4

5 回答 5

3

你通常避免char*char[]赞成字符串类。如果您想要一个字符串数组,而不是使用 a char* d[],您将使用 a ,或者如果您想要单个字符列表,则使用 simple 。string[] dstring d

C++ 和 C# 之间的互操作总是很棘手。一些很好的参考资料包括将C# 字符串传递给 C++ 并将 C++ 结果(字符串、char*.. 不管)传递给 C#以及在 C# 中使用数组和指针与 C DLL

于 2012-09-20T09:28:56.180 回答
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);

        }
于 2012-09-21T11:17:56.560 回答
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);
}
于 2012-09-20T09:44:19.460 回答
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# 中使用固定指针的唯一方法(右键单击项目、属性、构建、允许不安全代码)。

下次更具体和明确,并尝试对这里的人更加尊重,我们不会得到报酬来帮助你了解:-)

于 2012-09-20T10:50:14.873 回答
0

Astring是一个字符列表。随着您提到字符操作和循环的使用,我假设您关心的是从一个列表/数组中定位特定字符 - 从这个意义上说,您可以在从 a 询问特定字符时几乎相同地编码string(好像它是一个char数组)。

例如:

string testString = "hello";
char testChar = testString[2];

在这种情况下,testChar 将等于“l”。

于 2012-09-20T09:33:40.737 回答