小编pbe*_*ean的帖子

如果我有一个void指针,我该如何将int放入其中?

我有一个任意值的数组,所以我将它定义为一个void指针数组,所以我可以指向任何类型的信息(如int字符数组等).但是,我如何实际分配int给它?

以这些初始化为例:

void* data[10];
int x = 100;
Run Code Online (Sandbox Code Playgroud)

我的直觉会想到这一点,但这会产生编译错误:

data[0] = malloc(sizeof(int));
*(data[0]) = x;
Run Code Online (Sandbox Code Playgroud)

我也考虑过使用&x,但我会考虑一个局部变量的地址,这个(据我的理解)将在退出程序后被清除.所以,如果我有一个局部变量x,我如何正确地将它变为void指针类型的变量?

c pointers void-pointers

12
推荐指数
2
解决办法
2万
查看次数

超出范围会释放(字符)数组的内存吗?

我之前的问题非常相关,但我发现这是一个单独的问题,我无法找到一个可靠的答案.

是否超出范围释放(字符)数组使用的内存?

一个例子:

void method1()
{
  char str[10];
  // manipulate str
}
Run Code Online (Sandbox Code Playgroud)

所以在method1调用之后,str(10字节)使用的内存是否被释放,或者我是否需要在此上显式调用free?

我的直觉告诉我这只是一个简单的原始类型数组,因此它会自动释放.我有点怀疑,因为在C中你不能假设任何东西被自动释放.

c memory arrays

11
推荐指数
2
解决办法
7297
查看次数

如何从Windows Mobile应用程序实现向导?

我对Windows Mobile(使用C#和紧凑框架)开发有点新,所以我有点不确定如何做到这一点.用户必须以类似向导的方式浏览多页信息.一开始就有一个登录窗口.

我将如何实现这一目标?我是否会为每个页面设置不同的用户控件并根据请求创建/显示和销毁/隐藏它们?或者我是否需要创建不同的表单并以某种方式显示这些?

编辑(来自与OP不同的用户)

由于我还没有找到一个很好的解决方案,一些答案的链接在Windows Mobile 6.5中无法使用我开始赏金

这看起来很有前景,但可以为移动6.5而构建

http://weblogs.asp.net/justin_rogers/articles/117859.aspx

http://www.codeproject.com/KB/dialog/WizardForm.aspx

http://www.codeproject.com/KB/miscctrl/DesignTimeWizard.aspx

http://winformswizard.codeplex.com/

http://www.differentpla.net/content/2005/02/implementing-wizard-c(与上述相同,但早期的工作)

.net c# compact-framework wizard windows-mobile

8
推荐指数
2
解决办法
1750
查看次数

如何安全地摆脱事件处理程序?

假设我有一个类A可以触发一个名为X的事件.现在我有一个B类,在一个方法中我得到一个实例到A并将事件绑定到B中的一个处理程序:

public void BindEvent(A a)
{
    a.X += AEventHandler;
}
Run Code Online (Sandbox Code Playgroud)

我有三个问题.

  • 当我现在将对B实例的引用设置为null时,它不会被垃圾收集,因为垃圾收集器认为它仍然在使用(因此在内存中保留了无用且可能干扰的B副本).

  • 当我有另一个对象c(C类)时,我有一个名为a的引用("this.a = new A()").然后我调用"b.BindEvent(this.a)",在c中我将a的引用设置为null("this.a = null").这会将A的副本保存在内存中,因为它是通过b中的事件引用的吗?

  • 如果其中任何一个或两个都是如此,我怎样才能最好地规避这些问题呢?如果我有一个事件处理程序的完整列表(比如"a.SomeEvent + = SomeMethod"这样的10行),我应该再次清理它们("a.SomeEvent - = SomeMethod").我应该在代码中的哪个时间或地点做这些事情?

嗯,它有点模糊,但我不知道如何以更好的方式解释.如果我需要解释更详细的内容,请发表评论.

c# events

7
推荐指数
1
解决办法
778
查看次数

数组作为DataGrid的DataSource:如何自定义列?

在我的Windows Mobile .NET应用程序中,我有一个简单的对象数组,其中包含我想要在DataGrid中显示的数据.为此,我只需致电:

myDataGrid.DataSource = myArray;

这有效,但我遇到了问题:它使用所有属性作为列,并使用属性的名称作为列标题.我无法弄清楚如何自定义两件事:

  • 选择应将哪个属性子集显示为列(例如,我有一个ID,名称和值属性,我只想显示名称和值);

  • 重命名列标题以使其更有意义(例如,如果属性被称为ID,则显示列标题为"Number").

这有可能吗?

如上所述,这是在Windows Mobile .NET(版本2)应用程序中.

.net c# datagrid compact-framework windows-mobile

7
推荐指数
1
解决办法
9080
查看次数

如何有条件地确定在编译时调用哪些函数?

我正在用C实现一个非常非常基本的组件系统,但现在我想要"动态"调用某些函数.设置非常简单:主程序只是一个无限循环,其中检查一些条件,并为每个启用的组件调用"进程"函数.

例如,现在它的工作原理如下:

while (1) {
  input_process();
  network_process();
  graphics_process();
}
Run Code Online (Sandbox Code Playgroud)

但我想将它分成单独的组件,并以某种方式在中心位置定义使用哪些部件.这可以通过简单的定义来完成,如下所示:

#define HAS_NETWORK
...
while (1) {
  input_process();
#ifdef HAS_NETWORK
  network_process();
#endif
  graphics_process();
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,1或者只有少数组件是正常的,但是如果我想在未来对所有这些(输入,网络和图形)和其他组件这样做,我将不得不将#ifdefs单独放入他们每个人都有,这很乏味.

在伪代码中,我想要完成的是以下内容:

components = {'input', 'network', 'graphics'}
...
foreach component in components
  execute component_process()
Run Code Online (Sandbox Code Playgroud)

这样,组件可以在将来轻松添加.我不介意检查是在编译时还是在运行时完成(虽然我显然更喜欢编译时,但我可以想象运行时更容易实现).我不知道怎么开始.

c function dynamic c-preprocessor

6
推荐指数
3
解决办法
344
查看次数

超出这样的范围会释放相关的记忆吗?

我只是想知道,在下面的方案中,是在执行了method1之后释放的'stringvar'所使用的内存?

// Just some method
void method2(char* str)
{
  // Allocate 10 characters for str
  str = malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  method2(stringvar);

  // Is the memory freed hereafter, or do I need to call free()?
}
Run Code Online (Sandbox Code Playgroud)

我问,因为如果我在method1的末尾添加一个'free(stringvar)',我会得到一个警告,即stringvar在method1中是单元化的(这是真的).

c memory malloc

3
推荐指数
2
解决办法
2295
查看次数