【问题标题】:Return a string / pass by reference返回一个字符串/通过引用传递
【发布时间】:2017-03-10 07:55:50
【问题描述】:

我正在为连接了一些硬件的 Arduino 板编写一些 C++ 代码。在代码的各个地方,我需要构造一个带有各种附加硬件值的字符串,并将其作为命令的一部分通过串行发送。由于它需要成为通过串行发送的非常特定命令的一部分,因此我首先构建它并在整个命令准备好时发送它。

目前我正在通过以下函数进行操作

'String constructDataString ()
 {
    // Set up data to transmit
    String dataStr = String(var1);                          
    dataStr += ",";
    dataStr += String(var2);
    dataStr += ",";
    dataStr += String(var3);        
    dataStr += ",";
    dataStr += String(var4);    
    dataStr += ",";
    dataStr += String(var5);                            

    return dataStr;
 }'

然后我调用它

String dataString = constructDataString ();

我想知道是否可以通过在 main 中声明一个字符串然后通过引用将其传递给函数并允许函数直接修改它来做到这一点。我已经尝试了几种方法,但我无法让它工作。我尝试了类似下面的方法,但不太熟悉这样做,所以我希望有人能提供帮助。

原型

void constructDataString (String* extString)

从主调用

String dataString =””;
String* dataStringPtr = & dataString;
constructDataString (dataStringPtr);

功能

void constructDataString (String* extString)
{
 // Set up data to transmit
    extString = String(var1);                           
    extString += ",";
    extString += String(var2);                                  
    extString += ",";
    extString += String(var3);      
    extString += ",";
    extString += String(var4);  
    extString += ",";
    extString += String(var5);
}

【问题讨论】:

    标签: c++ string arduino pass-by-reference


    【解决方案1】:

    当然可以。但是在constructDataString 的主体中,您需要使用*extString 而不是extString 来取消引用指针。 否则,您可以在 C++ 中使用引用。

    使用参考,代码将是:

    void constructDataString (String& extString)
    {
     // Set up data to transmit
        extString = String(var1);                           
        extString += ",";
        extString += String(var2);                                  
        extString += ",";
        extString += String(var3);      
        extString += ",";
        extString += String(var4);  
        extString += ",";
        extString += String(var5);
    }
    

    你使用它如下:

    String dataString =””;
    constructDataString (dataString);
    

    【讨论】:

    • 您好 Cantfindname,非常感谢您,已解决。我最近一直在写很多非 C++ 代码,所以我完全忘记了那部分。如果参数为空,我通常也会避免引用。我想知道您是否知道第二种方式是否更有效,这样我就不会在堆栈上传递字符串?
    • 感谢 Raw,这里只是一个错字:D
    • 据我所知,引用大多是C++中的语法糖,所以编译后两种方式都是一样的,只会压栈指针
    • 对不起 Cantfindname 我实际上是指在我返回一个字符串并且什么都不传递的旧方法和我只传递指针的新方法之间
    • 啊,我明白了,是的,它更有效,因为当返回一个字符串时,它会被复制,而使用指针直接写在它的预期内存上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2017-07-25
    • 2016-07-05
    • 2013-04-07
    • 2018-09-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多