5

外部ライブラリを使用して、2 つのアプリ間の udp (OSC) 通信を処理します。送信されるメッセージをフォーマットするために、ライブラリは char* を想定していますが、変換する必要がある UI から文字列を取得します。

コードの他の部分を扱っている間、udp の部分は次のようにハードコードされていました。

    char* endofMess = "from setEndMess"; 

そしてうまくいっていました。私の文字列で動作させるのは簡単だと思い、次のように書きました:

    std::string s = "from setEndMess";
    char* endofMess = const_cast<char*>(s.c_str());

しかし、正しくフォーマットされたメッセージを受信して​​いた最初の例とは異なり、意味不明な文字しか受信しません。誰かがそれがどこから来るのか知っていますか?

ありがとう!

マチュー

EDIT:私が使用するコード:OSCValが変更されるたびにメッセージを送信する方法:

void osc500::testOSC(int identifier, float OSCval)
{
UdpTransmitSocket transmitSocket( IpEndpointName( destIP, port ) );
 char buffer[1024];
 osc::OutboundPacketStream p( buffer, 1024 );

p << osc::BeginBundleImmediate
    << osc::BeginMessage( endofMess )
       << OSCval << osc::EndMessage
<< osc::EndBundle;


transmitSocket.Send( p.Data(), p.Size() );
}

OSC パターンを変更する必要がある場合は、これを次のように呼び出します。

void osc500::setEndMess(String endpattern){
// endofMess = "from setEndMess"; //OK works fine each time it's called

//1st try :
//std::string s = "from setEndMess"; 
//endofMess = const_cast<char*>(s.c_str()); //gibberish    

//2nd try :
//std::string s = "from setEndMess";
//endofMess = &s[0]; //gibberish    

//3rd & 4th tries :
//char s[4] = {'t','e','s','t'}; 
//char s[5] = {'t','e','s','t','\0'};
//endofMess = s; //gibberish    
}
4

3 に答える 3

4

c_str()の読み取り専用アクセス用ですstd::string

ポインターを介して文字列に書き込みたい場合は、次のいずれかを使用します...

  1. charの代わりの配列 (またはベクトル)std::string
  2. char* buf = &str[0];- 文字列の最初の文字を直接指す

トリック (2) は C++11 で動作することが保証されています。std::string実際には、C++03 でも機能しますが、それは、 contignuos ストレージを持つコンパイラの実装に依存しています。

(そして、何をするにしても、バッファの長さに注意してください。)

于 2012-11-18T10:44:48.733 に答える
3

char* が書き込まれていないと思われます。これはレガシー API であるため、const ではないだけです。もしそうなら、あなたの問題はおそらく std::string が範囲外に落ちたか、c_str を呼び出すポイントと API の内部で使用されるポイントの間で変更されたことです。

于 2012-11-18T11:04:09.730 に答える
1

コンテンツを変更したい場合はstd::string、使用する必要があると思います&s[0](文字列が十分に大きいことを確認してください)。

std::string s = "abcdef...";
char* ptr = &s[0];

例 (MSVC10 でテスト済み):

#include <iostream>
#include <ostream>
#include <string>

using namespace std;

void f(char* ptr, size_t count)
{
    for (size_t i = 0; i < count; i++)
        ptr[i] = 'x';
}

int main()
{
    string s = "abcdef";
    cout << s << endl;

    f(&s[0], 3);
    cout << s << endl;    
}

出力:

abcdef
xxxdef
于 2012-11-18T10:42:18.583 に答える