小编And*_*ing的帖子

拳击和拆箱与泛型

.NET 1.0创建整数集合的方法(例如)是:

ArrayList list = new ArrayList();
list.Add(i);          /* boxing   */
int j = (int)list[0]; /* unboxing */
Run Code Online (Sandbox Code Playgroud)

使用它的代价是由于装箱和拆箱而缺乏类型安全性和性能.

.NET 2.0方式是使用泛型:

List<int> list = new List<int>();
list.Add(i);
int j = list[0];
Run Code Online (Sandbox Code Playgroud)

拳击的价格(据我所知)是需要在堆上创建一个对象,将堆栈分配的整数复制到新对象,反之亦然,以便取消装箱.

泛型的使用如何克服这个问题?堆栈分配的整数是否保留在堆栈上并从堆中指向(我想这不是这种情况,因为当它超出范围时会发生什么)?似乎仍然需要将其复制到堆栈外的其他地方.

真的发生了什么?

.net c# generics boxing unboxing

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

序列化FixedDocument时的FileFormatException

当将FixedDocument序列化为XPS时,我有时会FileFormatException告诉我字体的格式(我假设)不符合预期的文件格式规范(请参阅下面的例外).

神秘的部分是:

  • 异常只会偶尔发生一次
  • 它只会发生在某些FontFamily/Style/Weight组合中(Segoe UI用斜体和粗体似乎触发它)

有人知道为什么会发生这种情况(特别是为什么它不会一直发生但只是在不可预测的时间间隔内)?

遵循最小可重复性示例将在每次运行时触发异常约4至5次(在我的Windows 10计算机上,发生在.NET 4,4.6.1等):

private void TestXpsSerialization(object a)
{
    for (int i = 0; i < 400; ++i)
    {
        TextBlock block = new TextBlock
        {
            Text = "Test",
            FontFamily = new FontFamily("Segoe UI"),
            FontStyle = FontStyles.Italic,
            FontWeight = FontWeights.Bold,
            Background = null,
            FontSize = 12
        };
        FixedDocument fixedDoc = new FixedDocument();

        PageContent pageContent = new PageContent();
        FixedPage fixedPage = new FixedPage();
        fixedPage.Children.Add(block);
        ((IAddChild) pageContent).AddChild(fixedPage);
        fixedDoc.Pages.Add(pageContent);
        using (MemoryStream documentStream = new MemoryStream())
        {
            string …
Run Code Online (Sandbox Code Playgroud)

c# xpsdocument

19
推荐指数
1
解决办法
642
查看次数

Delphi,FileStream和MemoryStream

我想将FileStream的一部分复制到内存流.

FileStream.Write(Pointer(MemoryStream)^, MemoryStream.Size);
FileStream.Read(Pointer(MemoryStream)^, count);
Run Code Online (Sandbox Code Playgroud)

是对的吗?它不适合我.

delphi delphi-7

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

指针/地址差异

为什么两个地址之间的区别是错误的? http://codepad.org/NGDqFWjJ

#include<stdio.h>
int main()
{
   int i = 10, j = 20;
   int *p = &i;
   int *q = &j;
   int c = p - q;
   printf("%d\n", p);
   printf("%d\n", q);
   printf("%d", c);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

-1083846364
-1083846368
1
Run Code Online (Sandbox Code Playgroud)

c pointers pointer-arithmetic

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

std::getline() 将回车符 \r 读取到字符串中,如何避免这种情况?

我需要从 at\xd0\xb5xt 文件中读取一个(engl.: Star)对象的所有属性,如下所示Stern。我需要将字符串替换"leer""",但也可能存在不应替换为 的有效字符串""

\n\n

即对于另一个Stern对象也可以有"leer"代替"Sol"

\n\n

问题:
\n问题是它没有将 替换"leer""". 看起来它保存"leer\\\\r"在对象中而不是仅保存在对象"leer"中,但我也尝试替换"leer\\\\r",但它仍然不起作用。

\n\n

这是Stern应该阅读的文本文件中的一个:

\n\n
0\nSol\n0.000005\n0.000000\n0.000000\nleer\n1\n0\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的operator >>阅读内容:

\n\n
istream& operator>>(istream& is, Stern& obj)\n{\n    string dummy;\n    is >> obj.m_ID;\n    getline(is, dummy);\n    getline(is, obj.m_Bez);\n\n    if (obj.m_Bez == "leer")\n        obj.m_Bez = "";\n\n    is >> obj.m_xKoord >> obj.m_yKoord >> obj.m_zKoord;\n    getline(is,dummy);\n    getline(is,obj.m_Sternbild);\n\n    if (obj.m_Sternbild …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading

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

删除动态分配的变量设置指针为0

我无法理解这段代码的结尾(array = 0;):

#include <iostream>

int main()
{
    std::cout << "Enter a positive integer: ";
    int length;
    std::cin >> length;

    int *array = new int[length];

    std::cout << "I just allocated an array of integers of length " << length << '\n';

    array[0] = 5; // set element 0 to value 5

    delete[] array; // use array delete to deallocate array
    array = 0; // use nullptr instead of 0 in C++11

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

最后,删除动态分配的数组(返回到OS),然后分配值0.

为什么这样做?数组返回操作系统后,无需为其赋值0,对吗?

代码来自:http …

c++ arrays pointers memory-management dynamic-allocation

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

在32位和64位程序中使用std :: chrono :: duration :: rep和printf

有这个代码:

#include <cstdio>
#include <chrono>

int main()
{
  auto d = std::chrono::microseconds(1).count();
  printf("%lld", d);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当在64位模式下编译时,会出现警告:

main.cpp: In function ‘int main()’:
main.cpp:7:19: warning: format ‘%lld’ expects argument of type ‘long long int’, but argument 2 has type ‘long int’ [-Wformat=]
   printf("%lld", d);
                   ^
Run Code Online (Sandbox Code Playgroud)

在32位模式下编译时使用此警告(使用-m32标志).它看起来就像std::chrono::duration::rep是一个类型的long int在64位程序,并long long int在32位程序.

有没有一种可移植的方式来打印它像%zu说明符size_t

c++ io c++11 long-integer c++-chrono

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

为什么不允许条件属性方法返回除void之外的其他方法

我最近开始用一本好书学习C#,现在阅读有关Conditional属性和#if编译器指令的内容.

我知道#if编译器指令的用法:

#if DEBUG
public void foo(int value)
{ ... }
#endif
Run Code Online (Sandbox Code Playgroud)

Conditional属性:

[System.Diagnostics.Conditional("DEBUG")]
public void foo(int value)
{ ... }
Run Code Online (Sandbox Code Playgroud)

我也知道被#if... #endif语句包含的代码没有到达IL但是Conditional属性代码会这样做,并且对该函数的调用将被省略.

我的问题:
为什么有关于限制Conditional属性的使用,标志着与属性函数必须返回void作为这里的文件中写

如果将此属性应用于不返回void的方法,则会在Visual Studio中出现编译错误.

我已经搜索了信息,但没有找到任何解释.

.net c#

6
推荐指数
1
解决办法
1105
查看次数

Arduino 中的 Serial.print uint64_t

我使用Arduino UNO(Arduino 1.8.3)。

这是我的代码:

void setup() { 
    Serial.begin(115200);
}
void loop() { 
    uint64_t num = 9223372036854775807; 
    Serial.print(num); 
    delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

退出状态1

重载“print(uint64_t&)”的调用不明确

我该如何解决这个错误?

c++ arduino-uno

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

C中的数据类型混淆

以下代码有效:

int main(void)
{  
   float f = get_float();
   int i = round(f*100);
   printf("%i\n", i); 
}
Run Code Online (Sandbox Code Playgroud)

然而,如果以这种方式编码会产生错误:

printf("%i\n", round(1.21*100));
Run Code Online (Sandbox Code Playgroud)

输出说round(1.21*100)float.那么,为什么呢

int i = round(f*100); 
Run Code Online (Sandbox Code Playgroud)

很好吗?

c type-conversion

5
推荐指数
2
解决办法
335
查看次数