Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中通过引用传递字节数组(到DLL中的C代码)_C#_C_Arrays_Parameter Passing - Fatal编程技术网

C# 如何在C中通过引用传递字节数组(到DLL中的C代码)

C# 如何在C中通过引用传递字节数组(到DLL中的C代码),c#,c,arrays,parameter-passing,C#,C,Arrays,Parameter Passing,我很难弄清楚如何传递字节的I/O数组 从C到DLL中的C例程。我所说的I/O是指 C代码要在数组中设置数据,调用C例程, 并在返回时查看数组中已修改的数据。 在WinXP上使用VisualStudio2008 各种消息来源告诉我,C中的数组总是 通过引用传递。。。所以我希望char[]buf会 解决方案。似乎不是。。。看起来C是 在我背后做鬼鬼祟祟的事情,例如传递数据副本 我已经搜索过了,但是还没有找到一个对C程序员有用的C语言 讨论从C到C的参数传递: 如果我能确定如何在C中获取下面“stem

我很难弄清楚如何传递字节的I/O数组 从C到DLL中的C例程。我所说的I/O是指 C代码要在数组中设置数据,调用C例程, 并在返回时查看数组中已修改的数据。 在WinXP上使用VisualStudio2008

各种消息来源告诉我,C中的数组总是 通过引用传递。。。所以我希望char[]buf会 解决方案。似乎不是。。。看起来C是 在我背后做鬼鬼祟祟的事情,例如传递数据副本

我已经搜索过了,但是还没有找到一个对C程序员有用的C语言 讨论从C到C的参数传递:

如果我能确定如何在C中获取下面“stemp”的地址, 我可以在调用C代码之前和之后显示它。。。 并在C代码中显示传入地址

以下是主要的C代码:

[DllImport("c:/home/sieler/source/upshift.dll")]
internal static extern void ss_upshift1 (char [] buf, Int32 bytes);

static void Main(string[] args)
   {

   char [] stemp = new char [132];
   string s;

   s = "Testing\n\0";
   stemp = s.ToCharArray ();
   Console.WriteLine (stemp);  // I see "Testing" on console window

   ss_upshift1 (stemp, 7);     // Inside the C routine, I see "Testing\n" and
                               // I change it to "TESTING\n"

   Console.WriteLine (stemp);  // I see "Testing", which is WRONG!
当我从ss_升档1回来时,“stemp”仍然保持不变 数据,即使我知道数据已修改…我可以打印“stemp” 在启动前和启动后,从C SSU升档1例行程序内部 升档

如果我将'buf'参数设置为'out',那么我会看到一个空值缓冲区 在C代码中,好像C在说我将为您分配一个新的缓冲区 “stemp”的副本,并将缓冲区归零,并传递其地址, 如果我将数据放入C中的缓冲区,当我 从ss_升档1回来。如果我不在C中输入数据,就没有陷阱 当然,也没有有用的数据:

与“out”或“ref”相反,C似乎没有io标记

如果我将'buf'参数设为'ref',那么C将发送 缓冲区地址,如C中的char**buf。C代码可以 取消引用,查找数据。。。但如果数据发生变化,则 调用C代码看不到更改的数据

所以,要问一个正式的问题:如何从 从C到C,并将修改后的数据取回

谢谢,
斯坦

你有没有试过用谷歌搜索:第一页至少有四个答案!C代码中ss_upshift1的签名是什么?alk…sheesh。首先,我说我找过了。第二,我没有提到字符串有一个很好的理由。我只做了45年以上的编程,但我了解到“字符串”并不总是指“字符数组”:第三,搜索的前五次点击中没有一次讨论字节数组或I/O参数,这些参数是用于将数据传递到函数并返回数据的参数,简言之,它们都不处理从C例程获取数据的问题。提示:C代码中的const char*s表示您没有更改数据。[more next][oart 2…stackoverflow拒绝给我足够长的alk回复:]第四,并非所有支持字符串的语言都可以轻松地在字符串中使用8位数据,例如,在某些语言中,ASCII NUL二进制0终止字符串。第五,礼貌很重要。。。不知道你在问什么,或者为什么。除非你猜测某个神秘权威没有签署我的C代码,因此C/VS故意地、悄悄地丢弃C例程的输出?对于这个问题,ss_升档例行程序的内部内容应该无关紧要。事实上,我应该称之为例行的foo,因为我不希望答案像C中的升档,请这样做谢谢