小编Jac*_*cob的帖子

关于"int const*p"和"const int*p"

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    int i1 = 0;
    int i2 = 10;

    const int *p = &i1;
    int const *p2 = &i1;
    const int const *p3 = &i1;

    p = &i2;
    p2 = &i2;
    p3 = &i2;

    cout << *p << endl
        << *p2 <<endl
        << *p3 <<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

可以使用VC6.0和VC2010编译代码.但我有一个问题:

const int*p =&i1;

这意味着什么"p"点不能修改,但p不能修改,我是对的吗?所以

p =&i2;

这条线可以遵守,是吗?

这一行:

int const *p2 = &i1;
Run Code Online (Sandbox Code Playgroud)

在我看来,这意味着p2无法修改,而p2点可以改变,我是对的吗?为什么

p2 =&i2;

可以编译?

关于这一行:

const int const*p3 …

c++ const

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

C++中的公共朋友功能?

我在C++中看到了一些代码,并对此有疑问:

  class CRectangle {
        int width, height;
      public:
        friend CRectangle duplicate (CRectangle);
    };
Run Code Online (Sandbox Code Playgroud)

变量widthheight是私有的,方法duplicate()是公开的.关键字friend用于访问CRectangle对象外部的私有和受保护函数,但duplicate()已经公开.如果可以从外面访问,为什么我们需要"朋友"?

这是否意味着,虽然我们直接调用类duplicate()外部的公共方法,但是如果方法访问某个私有变量,那么它也是不允许的,我们必须将它声明为"朋友"?

这是duplicate()函数的实现; 我只想澄清问题:

CRectangle duplicate (CRectangle rectparam)
{
  CRectangle rectres;
  rectres.width = rectparam.width*2;
  rectres.height = rectparam.height*2;
  return (rectres);
}
Run Code Online (Sandbox Code Playgroud)

c++ friend

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

不同的铸造行为

这真的很奇怪.我正在追踪这个错误:

否定二进制补码的最小值是无效的.

......事实证明这是由于这样的代码:

var valueFromUser = "470259123000000";
var doubleValue = Convert.ToDouble(valueFromUser, CultureInfo.InvariantCulture);
Math.Abs((int)doubleValue);
Run Code Online (Sandbox Code Playgroud)

的确,当我在LINQPad中运行它时:

(int)Convert.ToDouble("470259123000000", CultureInfo.InvariantCulture)
Run Code Online (Sandbox Code Playgroud)

......它给了我:

-2147483648

但是,这里的另一位开发人员说他得到的东西完全不同(不是在LINQPad中):

-1141206336

当我尝试仅在常量上评估转换时:

(int)470259123000000.0
Run Code Online (Sandbox Code Playgroud)

...因为需要我收到编译错误unchecked.还有这个:

unchecked((int)470259123000000.0)
Run Code Online (Sandbox Code Playgroud)

...评估-1141206336与其他开发人员一样.所以我想也许Convert创造了一个与常数略有不同的值.不,这评估为True:

Convert.ToDouble("470259123000000", CultureInfo.InvariantCulture) == 470259123000000.0
Run Code Online (Sandbox Code Playgroud)

到底发生了什么事?为什么评估这些看似相同的表达式会产生如此不同的结果?

更新:

找到了一个提示.的十六进制表示4.70259123E14-1141206336是:

0x42FABB2BBFA92C00
       0xBBFA92C0
Run Code Online (Sandbox Code Playgroud)

所以我猜其中一个演员将这些位直接推入了int.-2147483648更大的谜团也是如此.

.net c# double casting .net-4.0

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

为什么XamlReader.Load无法识别我在Silverlight 4中的附加属性?

我正在尝试弄清楚如何在运行时以编程方式在Silverlight 4应用程序中应用主题.我认为这应该像从XAML加载资源字典并将其与应用程序的合并字典合并一样简单.到目前为止,这是我的代码:

var themeUri = new Uri(
    "OurApp;component/Themes/Classic/Theme.xaml", UriKind.Relative);
var resourceInfo = GetResourceStream(themeUri);
using (var stream = resourceInfo.Stream)
{
    using (var reader = new StreamReader(stream))
    {
        var xamlText = reader.ReadToEnd();
        var dict = XamlReader.Load(xamlText) as ResourceDictionary;
        Resources.MergedDictionaries.Add(dict);
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的XamlParseException是,在致电期间提出了XamlReader.Load:

在'Bar'类型中找不到可附加属性'Foo'.

这种连接正确正确声明,并在XAML命名空间声明正确引用所需的命名空间.如果通过App.xaml标记以声明方式加载到合并的字典中,附加属性XAML可以正常工作.

这是我正在尝试在运行时加载的XAML的缩写副本:

<ResourceDictionary xmlns:u="clr-namespace:Company.Product.Utils"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Style x:Key="ControlPanelStyle" TargetType="ContentControl">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="ContentControl">
          <Grid Margin="0" u:Bar.Foo="True">
            <!-- Stuff and things -->
            <ContentPresenter Content="{TemplateBinding Content}" />
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

为什么在运行时加载XAML时附加属性的引用在"静态"加载时工作得很好?

silverlight xaml resourcedictionary attached-properties silverlight-4.0

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

如何在datagridview中制作此图(参考图像)类型的图形

我希望在datagridviewcontrol中添加这种类型的图形: -

替代文字

这里的图表是绘制了12个月,我可以输入12个月的像素百分比或比较值....还请告诉我们如何为图表着色

任何有关这方面的想法都将受到高度赞赏

编辑----感谢所有答案,我学到了很多,但仍然无法解决问题...

  1. 我需要在我的datagridview中显示大量的行,大约有15列......所以直接添加行非常奇怪,但每次添加行时都会为图形添加不同的列...无法想到任何行另外一种方法来完成这个....而且我不想保存我发现的图像,如果我将图像直接添加到网格视图中.....

  2. 是否有任何第三方工具可以帮助我使用图表获取自定义datagridview

谢谢 .

.net c# graphics datagridview bar-chart

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

如何区分未接来电和拒绝回答?

我正在设计一个应用程序,在这个应用程序中,我需要区分接收方拒绝的呼叫(通过按拨号按钮)与未应答的呼叫,并且被拨号的用户断开连接.有没有什么可以分化,因为这两个都属于Android的未接来电类别?

android dialing

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

无法消除幻影待定TFS更改

不知何故,由于文件夹重命名和各种其他源代码更改,我有一个恼人的问题.我正在显示一个在TFS中无法撤消的文件的挂起更改.

这有点难以完全解释.以下是目录/文件结构在TFS中的样子:

RootFolder
    Folder
        FileA
        FileB
    OldFolderThatWasRenamedToFolder (shows add icon)
        FileA (shows "edit" pending change)

"OldFolderThatWasRenamedToFolder"已重命名为"Folder",并致力于TFS.该不存在的文件夹下的"FileA"引用与"Folder/FileA"相同的文件,但注册为不同的文件; 例如,如果我更改"Folder/FileA",则会显示两个 "文件"的挂起更改.每当我撤消幻像文件的挂起更改时,TFS都会报告错误:

没有找到.../Folder/FileA的待定更改.

我无法摆脱这种令人烦恼的虚假待定变更.我在文件夹中完成了更新,强制覆盖,甚至在更新之前删除了文件夹.如何消除此幻影待定更改?

更新:

我发现了一个潜在的线索.当我将"待定"文件与最新文件进行比较时,未检测到任何更改,但与"工作区版本"进行比较时,会将文件与文件的旧版本进行比较.我最近尝试删除我的工作区并创建一个新工作区,但同样的问题仍然存在.到底发生了什么?这些挂起的更改甚至存储在哪里?我可以手动编辑一些文件吗?

visual-studio-2010 tfs2010

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

ASP.Net MVC3:将.js文件放在View而不是Scripts文件夹附近

我们想从我们的Razor视图中分离出javascript(所以我们可以测试).我们可以在它们对应的视图附近找到.js文件,而不是在Scripts文件夹中吗?例如,我们希望在解决方案资源管理器中看到这一点:

MyMvcProject
    - Views
      - Home
        - About.cshtml
        - About.js
Run Code Online (Sandbox Code Playgroud)

但是,我不知道从.cshtml视图引用.js文件.

javascript asp.net-mvc

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

为什么不在此代码中使用类型推断?

假设我有一个如下所示的服务接口:

public interface IFooService
{
    FooResponse Foo(FooRequest request);
}
Run Code Online (Sandbox Code Playgroud)

在调用像这样的服务方法时,我想解决一些贯穿各领域的问题; 例如,我想要统一的请求记录,性能记录和错误处理.我的方法是有一个共同的基础"Repository"类,其中包含一个Invoke方法,该方法负责调用该方法并围绕它执行其他操作.我的基类看起来像这样:

public class RepositoryBase<TService>
{
    private Func<TService> serviceFactory;

    public RepositoryBase(Func<TService> serviceFactory)
    {
        this.serviceFactory = serviceFactory;
    }

    public TResponse Invoke<TRequest, TResponse>(
        Func<TService, Func<TRequest, TResponse>> methodExpr,
        TRequest request)
    {
        // Do cross-cutting code

        var service = this.serviceFactory();
        var method = methodExpr(service);
        return method(request);
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,我使代码更清晰的整个目标受到类型推断无法按预期工作这一事实的阻碍.例如,如果我写一个这样的方法:

public class FooRepository : BaseRepository<IFooService>
{
    // ...

    public BarResponse CallFoo(...)
    {
        FooRequest request = ...;
        var response = this.Invoke(svc => svc.Foo, request);
        return …
Run Code Online (Sandbox Code Playgroud)

c# generics type-inference c#-4.0

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

使用ANTLR分析和修改源代码; 我做错了吗?

我正在编写一个程序,我需要解析一个JavaScript源文件,提取一些事实,并插入/替换部分代码.根据以下代码,我需要做的事情的简化描述:

foo(['a', 'b', 'c']);
Run Code Online (Sandbox Code Playgroud)

提取'a','b''c',并将代码重写为:

foo('bar', [0, 1, 2]);
Run Code Online (Sandbox Code Playgroud)

我正在使用ANTLR来解析我的需求,生成C#3代码.其他人已经提供了JavaScript语法.解析源代码是有效的.

我遇到的问题是弄清楚如何实际正确分析和修改源文件.我尝试实际解决问题的每种方法都让我陷入了死胡同.我不禁想到我没有按照预期使用该工具,或者在处理AST时只是太过新手.

我的第一种方法是使用a解析TokenRewriteStream并实现EnterRule_*我感兴趣的规则的部分方法.虽然这似乎使得令牌流的修改变得非常简单,但是我的分析没有足够的上下文信息.似乎所有我可以访问的是一个平坦的令牌流,这并没有告诉我足够的整个代码结构.例如,要检测是否foo正在调用该函数,只需查看第一个令牌就行不通,因为它也会错误地匹配:

a.b.foo();
Run Code Online (Sandbox Code Playgroud)

为了让我能够进行更复杂的代码分析,我的第二种方法是使用重写规则修改语法以生成更多的树.现在,第一个示例代码块产生:

Program
    CallExpression
        Identifier('foo')
        ArgumentList
            ArrayLiteral
                StringLiteral('a')
                StringLiteral('b')
                StringLiteral('c')

这对于分析代码非常有用.但是,现在我无法轻易地重写代码.当然,我可以修改树结构来表示我想要的代码,但我不能用它来输出源代码.我曾希望与每个节点相关联的令牌至少能给我足够的信息来知道我需要在原始文本中进行修改的位置,但我得到的只是令牌索引或行/列号.要使用行号和列号,我必须在源代码中进行尴尬的第二次传递.

我怀疑我在理解如何正确使用ANTLR做我需要的东西时遗漏了一些东西.有没有更合适的方法来解决这个问题?

parsing code-analysis antlr antlr3

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