小编Tim*_*Tim的帖子

什么是`int*userMask [3] [4]`指向?

我正在修改一些代码并遇到一个声明,我无法理解:

int *userMask[3][4] = {0};
Run Code Online (Sandbox Code Playgroud)

究竟是什么指向?它是一个矩阵,每个元素都是指针吗?或者它指向一个大小的矩阵[3] [4]?

谢谢


我想我的问题是userMask[2][maskElement][user]当声明为什么时可以工作int.userMask不能让它int[]正常工作吗?我不能理解这个权利......

请注意,感谢您对cdecl Robert的建议.但是,有没有人知道如何在XP命令提示符中使用它?我只能得到语法错误:(

c arrays pointers

22
推荐指数
3
解决办法
1万
查看次数

如果(TRUE)在C中是个好主意吗?

在C编程语言中,我的理解是变量只能在代码块的开头定义,而变量将具有声明它的块的范围.考虑到这一点,我想知道它是否是被认为是人为地创建新范围的不良做法,如下例所示:

void foo()
{
     ... Do some stuff ...

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }
Run Code Online (Sandbox Code Playgroud)

假设在宏定义中将TRUE设置为1,这段代码是否会被认为是"好代码",或者是否会使经验丰富的程序员在想到它时感到畏缩?

感谢您的输入!

编辑:为了回应一些答案,我正在使用的代码需要与一些非常古老的遗留系统一起工作.虽然按照C99的假设进行操作会很好,但我们真的无法保证他们会拥有它.

c if-statement

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

我可以在C中分配特定的位数吗?

我试图存储在运行时确定的大量布尔信息.我想知道最好的方法是什么.

我目前一直在尝试使用以下方式分配内存:

pStatus = malloc((<number of data points>/8) + 1);

认为这会给我足够的工作量.然后我可以使用数组表示法中的指针引用每个布尔值:

pStatus[element]

不幸的是,这似乎并不是很好.首先,我很难将内存初始化为整数值0.这可以用memset()吗?尽管如此,我认为这不会影响我尝试访问时崩溃的原因pStatus[element].

我也不完全相信这种方法是最好的方法.我真正想要的本质上是一个反映布尔值状态的巨型位掩码.我错过了什么吗?

c malloc bitmask

10
推荐指数
3
解决办法
1万
查看次数

在C#构造函数中使用this()

我一直试图弄清楚这些构造函数之间是否存在任何差异.假设有一个不带参数的Foo()构造函数,所有这些构造函数都会有相同的结果吗?

例1

public Foo()
    : this()
{
     blah;
     blah;
     blah;
}
Run Code Online (Sandbox Code Playgroud)

例2

public Foo()
{
     this();
     blah;
     blah;
     blah;
}
Run Code Online (Sandbox Code Playgroud)

例3

public Foo()
{
     this = new Foo();
     blah;
     blah;
     blah;
}
Run Code Online (Sandbox Code Playgroud)

c# constructor

10
推荐指数
2
解决办法
4474
查看次数

从外部线程关闭模态对话框 - C#

我正在努力找到一种方法来创建我想要使用C#的Forms功能.

基本上,我想要一个具有指定超时时间的模式对话框.看起来这应该很容易,但我似乎无法让它发挥作用.

一旦我打电话this.ShowDialog(parent),程序流程就会停止,如果没有用户第一次点击按钮,我就无法关闭对话框.

我尝试使用BackgroundWorker类创建一个新线程,但我不能让它在另一个线程上关闭对话框.

我错过了一些明显的东西吗?

感谢您提供的任何见解.

c# user-interface winforms

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

LIST <> AddRange抛出ArgumentException

我有一个特殊的方法偶尔崩溃与ArgumentException:

Destination array was not long enough. Check destIndex and length, and the array's lower bounds.:
at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
at System.Collections.Generic.List`1.CopyTo(T[] array, Int32 arrayIndex)
at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
at System.Collections.Generic.List`1.AddRange(IEnumerable`1 collection)
Run Code Online (Sandbox Code Playgroud)

导致此崩溃的代码如下所示:

List<MyType> objects = new List<MyType>(100);
objects = FindObjects(someParam);
objects.AddRange(FindObjects(someOtherParam);
Run Code Online (Sandbox Code Playgroud)

根据MSDN,List <>.AddRange()应根据需要自动调整大小:

如果新的Count(当前Count加上集合的大小)将大于Capacity,则List <(Of <(T>)>)的容量会通过自动重新分配内部数组以适应新元素而增加,并且在添加新元素之前将现有元素复制到新数组.

有人可以想到AddRange会抛出这种类型的异常的情况吗?


编辑:

回答有关FindObjects()方法的问题.它基本上看起来像这样:

List<MyObject> retObjs = new List<MyObject>();

foreach(MyObject obj in objectList)
{
   if(someCondition)
       retObj.Add(obj);
}
Run Code Online (Sandbox Code Playgroud)

c# exception list

9
推荐指数
1
解决办法
7357
查看次数

制作一份char*的副本

我有一个函数接受char*作为其参数之一.我需要操纵它,但保留原始的char*.基本上,我想创建这个char*的工作副本.看起来这应该很容易,但我真的很挣扎.

我的第一个(幼稚)尝试是创建另一个char*并将其设置为等于原始:

char* linkCopy = link;
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,因为我所做的只是让他们指向同一个地方.

我应该使用strncpy来实现这一目标吗?

我尝试过以下操作,但会导致崩溃:

char linkCopy[sizeof(link)] = strncpy(linkCopy, link, sizeof(link));
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西......?

编辑:我很抱歉,我试图简化示例,但我在第二个示例中留下了一些较长的变量名称.固定.

c string

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

覆盖Titlebar按钮的工具提示文本(关闭,最大化,最小化,帮助)

我一直在努力改变为表单主标题栏上的按钮显示的工具提示的文本.

简而言之,我们利用Windows窗体的"帮助"按钮来实现其他目的.这工作正常.问题是,当鼠标悬停在该按钮上时,会出现"帮助"工具提示,这对应用程序没有任何意义.

理想情况下,有一些方法可以为我的应用程序更改该工具提示的文本; 但是,在这一点上,我只是想找到一种完全禁用工具提示的方法.

我知道你可以通过在regedit中修改'UserPreferencesMask'键来禁用整个操作系统的工具提示,但我真的想要一种让它只影响我的应用程序的方法.

同样,理想情况下,托管代码可能会有一些方法,但我不反对链接到Windows API等.

感谢您解决此问题的任何建议!

c# winapi tooltip winforms-interop winforms

8
推荐指数
1
解决办法
2434
查看次数

在c#中转换对象类型

我今天遇到了一个问题,我不完全确定为什么它不起作用.

以下代码示例将崩溃:

static void Main(string[] args)
{
     int i32 = 10;
     object obj = i32;
     long i64 = (long)obj;
}
Run Code Online (Sandbox Code Playgroud)

这将导致InvalidCastException.为什么这不起作用?C#不够聪明,不知道该对象实际上是int类型吗?

我已经提出了一个解决方法,但我很好奇为什么上面的代码示例首先不起作用.

蒂姆,谢谢

c# casting

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

抑制静态代码分析警告CA1806用于TryParse调用

我想知道 在使用FxCop时人们对CA1806(DoNotIgnoreMethodResults)静态代码分析警告的看法.

我有几种情况,我使用Int32.TryParse来提取保存在文件中的内部配置信息.我最终得到了很多看起来像的代码:

Int32.TryParse(someString, NumberStyles.Integer, CultureInfo.InvariantCulture, out intResult);
Run Code Online (Sandbox Code Playgroud)

MSDN说如果出现故障,intResult的默认结果为零,这正是我想要的.

不幸的是,此代码将在执行静态代码分析时触发CA1806.似乎有很多冗余/无用的代码来修复错误,如下所示:

bool success = Int32.TryParse(someString, NumberStyles.Integer, CultureInfo.InvariantCulture, out intResult);
if (!success)
{
 intResult= 0;
}
Run Code Online (Sandbox Code Playgroud)

我应该抑制此消息或咬住子弹并添加所有这些冗余错误检查?或者也许某人对处理这样的案件有更好的想法?

谢谢!

c# fxcop coding-style

7
推荐指数
2
解决办法
3994
查看次数