【问题标题】:structs and array incrementation in CC中的结构和数组增量
【发布时间】:2021-10-31 08:21:03
【问题描述】:

目前我正在尝试将一些代码从 C 转换为 C#,但遇到了一些问题。 因为我是 C# 程序员并且不知道 C 我必须在这里问一些东西(没有找到任何可以回答我的问题的东西)。我在 C 中有以下代码:

struct item { short sectorno,sx1,sx2; } queue[MaxQueue], *head=queue, *tail=queue;
short ytop[W]={0}, ybottom[W], renderedsectors[NumSectors];

*head = (struct item) { player.sector, 0, W-1 };

if(++head == queue+MaxQueue) head = queue;

const struct item now = *tail;
    
if(++tail == queue+MaxQueue) tail = queue;
    if(renderedsectors[now.sectorno] & 0x21) continue;
    ++renderedsectors[now.sectorno];

我是用 C# 写的:

        Item[] queue = new Item[MaxQueue];
        Item[] head = queue;
        Item[] tail = queue;

        int[] ytop = new int[W]; //{ 0 };
        int[] ybottom = new int[W];
        int[] renderedsectors = new int[NumSectors];

        for (int x = 0; x < W; ++x)
        {
            ybottom[x] = H - 1;
        }
        for (int n = 0; n < NumSectors; ++n)
        {
            renderedsectors[n] = 0;
        }

        head[0] = new Item { sectorno = player.sector, sx1 = 0, sx2 = W - 1 };
        if (head[1] == queue[queue.Length - 1])
        {
            head = queue;
        }

我希望到目前为止这是正确的。现在我的问题:

做什么

         short ytop[W]={0} 

做吗? 这是一系列的短裤,对吧?这里是把0分配给数组的第一个位置吗?这就是我从调试器中得出的结论。

下面这行我看不懂:

         if(++head == queue+MaxQueue) head = queue;

数组上的 ++ 是否会增加数组的索引? queue+32 是否意味着数组的最后一个位置? (奇怪,因为那将是位置 32,这将超出范围......)

最后一件事..这是什么意思?

         ++renderedsectors[now.sectorno];

我会说增加了数组的索引,但是它在哪里以及如何存储?

非常感谢!如果能帮助我理解这段 C 代码,我会很高兴的。

【问题讨论】:

  • “我希望到目前为止这是正确的” - 它不是。如果您想了解 C 代码,则需要了解指针。或者您可以重写它以使用数组中的索引(这就是您在 C# 中处理它的方式)
  • 我在某处读到 C# 中不需要指针。你能用 C 重写这段代码来告诉我你的意思吗?我的意思是索引的解决方案

标签: c# arrays c increment translate


【解决方案1】:

short ytop[W]={0}ytop 声明为W 类型为short 的元素的数组,并将它们中的第一个显式初始化为零。其余元素默认初始化,这也将元素初始化为零。 (这是 C 中的一个习惯用法,因为在函数内定义一个带有 short ytop[W]; 的数组根本不会初始化它;元素值将是不确定的。显式初始化其中一个会触发其余部分的默认初始化。)

if(++head == queue+MaxQueue) head = queue;++head 做了两件事:

  • 它增加head 的存储值。
  • 为了评估表达式的其余部分,++head 的值是 head 的值,包括增量。

关于此的两个注意事项:

  • if(++head == queue+MaxQueue) head = queue; 与先进行增量 head = head + 1; 然后 if(head == queue+MaxQueue) head = queue; 基本相同。但是,C 语义中的技术细节有所不同; head 的值对内存的实际更新不一定与表达式的计算同步。
  • 将 1 添加到指针时,结果是指向内存中下一个数组元素的指针,而不是内存中的下一个字节。指针的类型用来知道它指向什么类型的元素以及该元素有多大。

queue+MaxQueue 生成一个指针,该指针指向MaxQueue 元素超出queue 指向的位置。如果queue 是一个数组或指向数组开头的指针,而MaxQueue 是数组中的元素数,则它指向数组的最后一个元素。没关系;我们可以通过这种方式指向数组的“结束”,将其用作结束位置的标记。

++renderedsectors[now.sectorno]; 中,renderedsectors[now.sectorno]renderedsectors 中具有索引now.sectorno 的元素。 ++ 增加其存储的值。

【讨论】:

  • 非常感谢!我有一些问题:所以 head++ 增加了数组的位置?例如,指针指向索引 0 处的元素 - ++ 指向索引 1?所以里面的值不会受到影响?您的意思是“储值”吗?与渲染扇区相同吗?然后queue+MaxQueue指向数组的最后一个元素?
  • @Canox:数组没有位置。它是数组中的元素序列。当*head 出现在struct item { short sectorno,sx1,sx2; } 类型的声明中时,它将head 声明为指向该类型的指针。使用*head=queue,它被声明为指针并被初始化为指向数组的开头。 (当在这样的代码中使用数组名时[并非总是如此],它会自动转换为指向数组第一个元素的指针。)head 有自己的独立存在;它不是数组的“位置”。它是一个可以使用和修改的指针。
  • @Canox: 对象的存储值是已经为它写入内存的值。
  • @Canox: queue+MaxQueue 不指向数组的最后一个元素。它指向最后一个元素之外,如果有另一个元素,下一个元素将在哪里。
  • 好的,非常感谢。这对理解代码有很大帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 2012-05-30
相关资源
最近更新 更多