无法理解通过引用传递

2024-04-03

我发现理解 C# 中的引用传递真的很令人困惑。在我的代码中,我有一个带有两个参数的函数

private bool SerialUnEscape(byte serialData, ref byte serialResult)
    {
        if (((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_START) ||
                     ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_END)) {
            serialEscaped = false;
            serialResult = 0;
            return (true);
            }

        } else if (serialEscaped) {

            if ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_ESCAPE_START) {
                serialResult = (int)SerialProcessValue.SERIAL_PACKET_START;
                serialEscaped = false;
                return (true);
            } 
        } else {
            serialResult = serialData;
            return (true);
        }

    }

我正在使用引用调用该函数serialDataLsb & serialDataMsb.

现在我的困惑是,它的价值是什么serialDataLsb or serialDataMsb, 它得到的值是serialResult ??

  for (i = 0; i < serialElements; i++) {
    serialDataLsb = 0;
    serialDataMsb = 0;
    while (serialBufferWalk < serialIndex) {
        if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataLsb)) {
            break;
                }
               }
    while (serialBufferWalk < serialIndex) {
        if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataMsb)) {
            break;
            }
        }
serialElementData[i] = (UInt16)(serialDataLsb + (serialDataMsb << 8));
}

我需要将此代码移植到Python中,1)如何在Python中实现按引用传递

我尝试使用这个

while serialBufferWalk < serialIndex:
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb):
        break
while serialBufferWalk < serialIndex:
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb):
        break

如果您确实想模仿按引用传递而不是更改代码以返回值,则可以将要更改的原语包装在对象中。为了简单起见,我使用了一个列表:

def change_reference(byteContainer):
    byteContainer[0] = 42

b = 123
print(b) # Prints 123

# Copy the data into the container list.
container = [b]
# Pass a pointer to that list into the function.
change_reference(container)
# Take the value out of the container.
b = container[0]

print(b) # Prints 42

但这让你的函数真的很混乱。您真正应该做的是将修改后的字节包含在返回值中:

def test_and_subtract(v):
    if v == 1:
        return (v - 1, True)
    return (v - 2, False)

v = 1
v, b = test_and_subtract(v)
print(v) # 0
print(b) # True

v = 5
v, b = test_and_subtract(v)
print(v) # 3
print(b) # False

Here return (v - 1, True)将两个结果放入一个元组中,并且b, v正在从该元组中删除它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法理解通过引用传递 的相关文章

随机推荐

  • 如何在 Vue JS SPA 中进行开放图图像?

    我正在尝试在我的 VueJS 单页应用程序中包含开放图形图像 https developers facebook com tools debug https developers facebook com tools debug 给我这个链
  • 模糊测试(框架)Web应用程序?

    是否有可以对 Web 应用程序执行模糊测试的框架 我知道Selenium and WebDriver用于为 Web 应用程序构建测试 但我对内置模糊测试的库 框架或项目特别感兴趣 因此我不需要重新发明轮子 例如 我可以从以下功能中受益 随机
  • `.create()` 方法默认不支持可写嵌套字段。

    关于 DRF 中与中间模型的多对多关系的序列化 我有一个大问题 如果请求方法是 get 则一切正常 但是当我尝试将数据发布或放置到 API 时 我收到以下错误 Traceback most recent call last File Lib
  • ASP.NET MVC4 捆绑单个文件

    有没有办法使用 MVC4 中的新捆绑功能来捆绑单个文件 我知道捆绑单个文件没有多大意义 但我想使用服务器端缩小并让 MVC 在 URL 末尾附加哈希以用于缓存目的 我已经尝试过 Scripts Url Scripts myscript js
  • iOS7 中非消耗性产品的服务器端收据验证和 transactionReceipt 弃用

    我正在从以前的 iOS 移植一个工作应用程序 但在处理新的应用程序内购买收据时遇到了问题 我们现在的工作方式是从SKPaymentTransaction对象并将其发送到服务器进行验证 从我从其他问题中收集到的信息来看 收据现在似乎保存在一个
  • Android studio 1.4 和矢量图像

    今天我将android studio更新到1 4版本 我在变更日志中看到 您也可以为 api Error Execution failed for task app transformClassesWithDexForDebug gt co
  • Eclipse Java IDE JUnit5:junit.jupiter.api.Assertions 不可访问

    我对整个编程很陌生 但这是我的问题 我曾经通过右键单击项目在 Eclipse 中添加 JUnit 测试用例 然后添加新增 gt JUnit 测试用例 目前 我无法实现任何测试方法 因为 Eclipse 在线告诉我 import static
  • FPDF/FPDI 错误:致命错误:找不到类“setasign\Fpdi\FpdfTpl”

    我正在尝试为现有的 PDF 文档添加水印 这个错误在过去两天一直困扰着我 我的 FPDI 库位于 fpdi src 中 fpdf 库位于 fpdf 中 引发错误的文件是 Fpdi php 第 27 行 以下是前 30 行
  • Java 中的 tan() 返回一个奇怪的值

    我的代码将一个以弧度为单位的角度传递给cos tan and sin 一切似乎都工作正常 除了晒黑90 这给出了值16331239353195370由于某些奇怪的原因 示例代码 import java text DecimalFormat
  • 当最小 SDK 从 21 增加到 24 时,APK 大小增加了 35mb

    最近 我们将支持的最小 SDK 从 API 21 提高到了 24 显然 这一变化导致我们的 APK 大小从 65mb 增加到 103mb 从Android studio中的APK分析中 我们可以看到所有的 so文件的大小基本上都增加了一倍
  • 替换 Java 中的静态引用方法

    我有一个如下所示的类 其方法仅返回一个字符串 但我想修改它从另一个类返回的内容 而无需自己对其进行硬编码 public class Name public static String getName return MyName 有什么办法可
  • 协议中的公共默认初始化

    我有这个代码 public protocol MyProtocol init public extension MyProtocol public init self init public final class MyClass MyPr
  • 如何处理“intrin.h:没有这样的文件或目录”?

    include
  • 深层路由的 webpack HistoryApiFallback 配置

    webpack dev server 可以设置为将您发送回 index html 并找到单个路由的脚本 例如http localhost 4301 sdr http localhost 4301 sdr但是当您放入更深的路线 或末尾带有 的
  • Mercurial 和 Notepad++ 集成

    Notepad 是否有插件可以与 Mercurial 和 TortoiseHg 集成 如果将以下内容添加到我们的配置文件中 您可以使用 Notepad 打开文件 tortoisehg editor
  • 在用户交互之前,GoogleMap 不会加载详细地图

    我正在 android 上编写一个应用程序 它将显示谷歌地图的地图 当我启动应用程序时 地图以当前位置为中心 当我使用animateCamera 我可以看到整个世界的放大动画 直到它聚焦于当前位置 问题是我需要触摸地图才能使地图以我期望的缩
  • 将 scipy 稀疏矩阵存储为 HDF5

    我想以 HDF5 格式压缩和存储一个巨大的 Scipy 矩阵 我该怎么做呢 我尝试过以下代码 a csr matrix dat row col shape 947969 36039 f h5py File foo h5 w dset f c
  • pyenv install 3.6.3 发生错误:为什么?

    user syyun pyenv install 3 6 3 Downloading Python 3 6 3 tar xz gt https www python org ftp python 3 6 3 Python 3 6 3 tar
  • 应用程序可以在通知中心同时使用警报和横幅吗?

    我正在创建一个 Mac OS X 应用程序来使用通知中心 一些通知应保留在屏幕上 直到用户与它们交互 而其他通知应在显示后不久消失 The NSUserNotificationAlertStyle键和更改系统偏好设置允许在横幅和警报之间进行
  • 无法理解通过引用传递

    我发现理解 C 中的引用传递真的很令人困惑 在我的代码中 我有一个带有两个参数的函数 private bool SerialUnEscape byte serialData ref byte serialResult if SerialPr