0

Bluetooth配列に情報を入力するために、C++アプリケーションに取り組んでいます。これは mbed プラットフォームの BLE_API に基づいていますが、関連する必要はないと思います。関数にリファクタリングしようとしている次のコードがあります。

GattAttribute nameDescr1(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"Percentage", strlen("Percentage"));
GattAttribute *pdescriptors[] = { &nameDescr1 };


  PercentageFill(PercentageUUID, valueBytes.getPointer(),
                   valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
                   GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
                   pdescriptors,
                   sizeof(pdescriptors) / sizeof(GattAttribute*)),

私はこれまでのところこれを持っています:

   GattAttribute produceName (char title[]) { 
        GattAttribute nameDescr(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)title, strlen(title));
        GattAttribute *descriptors[] = { &nameDescr };
        return descriptors;
    }

ただし、予想通り、エラーが発生します。

エラー: "GattAttribute *[1]" から "GattAttribute" に変換するための適切なコンストラクターが存在しません

これがスローされている理由はわかりますが、「PercentageFill」コンストラクターで必要な形式であるため、配列全体を返す方法がわかりません。

ありがとう。

アップデート:

完全なコンテキストを提供するために、ここに私が設定している他のCharacteristcisがあります(それぞれ異なる名前が付いています):

NewService(BLE &_ble, uint8_t percentageFill, uint8_t replacementDue) :
    ble(_ble),
    valueBytes(percentageFill),
    PercentageFill(PercentageUUID, valueBytes.getPointer(),
                   valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
                   GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
                   pdescriptors,
                   sizeof(pdescriptors) / sizeof(GattAttribute*)),
    Time(   TimeUUID,
            &replacementDue,
            GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
            tdescriptors,
            sizeof(tdescriptors) / sizeof(GattAttribute*)),
    UseProfile( UseProfileUUID, 
                &controlPointValue,
                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
                Udescriptors,
                sizeof(Udescriptors) / sizeof(GattAttribute*)),) {
                setupService();
}
4

2 に答える 2

1

まず第一にpdescriptors、元のコードの配列は1要素の長さしかないことに注意してください。したがって、オブジェクトへの直接のポインターは問題なく機能します。または、パーセンテージ フィルがポインターの配列を想定していない場合は、正常に機能します。これは、ポインタからポインタへのサイズと 1 のサイズを渡すことで模倣できます。注:sizeof(...)/sizeof(...)元のコードの計算も 1 を返すことを意図しており、関数の境界を導入すると (特に配列を関数への引数)。

GattAttributeそれを超えて、あなたの質問はやや不明確です.異なる値を可能にするつもりですか? そうでない場合は、おそらく次のようなことができます。

void updatePercentage(WhateverTypeValueBytesIs valueBytes) {
    GattAttribute nameDescr(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"Percentage", strlen("Percentage"));
    GattAttribute * ptr = &nameDescr; // needed, because we want to pass pointer-to-pointer-to-nameDescr
    PercentageFill(PercentageUUID, valueBytes.getPointer(),
               valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
               GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
               &ptr, 1), /* are we sure about trailing comma here? */
    // other relevant trailing code?
}

コメントで言及したアクセスできないコピーコンストラクターに関するエラーメッセージから判断すると、GattAttributeおそらく通常のコンストラクターであるため、そこに追加の関数を作成する必要はありません。この特定GattAttributeのものを関数インターフェイスの後ろに隠して、必要に応じて「ルックアップ」できるものに変えたい場合は、次のようにシングルトンに変えることができます(たとえば、同じ目的を達成する他の方法が存在します):

GattAttribute * getNameDescriptor(void) {
    static GattAttribute nameDescr(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"Percentage", strlen("Percentage"));
    return &nameDescr;
}

次に、その関数を次のように使用できます。

void updatePercentage(WhateverTypeValueBytesIs valueBytes) {
    GattAttribute * ptr = getNameDescriptor(); // needed, because we want to pass pointer-to-pointer-to-nameDescr
    PercentageFill(PercentageUUID, valueBytes.getPointer(),
               valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
               GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
               &ptr, 1), /* are we sure about trailing comma here? */
    // other relevant trailing code?
}

編集して、コメントに基づいて追加のオプションを追加します。

void updatePercentage(WhateverTypeValueBytesIs valueBytes, const char* name) {
    GattAttribute nameDescr(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (const uint8_t *) name, strlen(name));
    GattAttribute * ptr = &nameDescr; // needed, because we want to pass pointer-to-pointer-to-nameDescr
    PercentageFill(PercentageUUID, valueBytes.getPointer(),
               valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
               GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
               &ptr, 1), /* are we sure about trailing comma here? */
    // other relevant trailing code?
}

または別のオプション: 些細なことで、GattAttribute参照によって完全に初期化されたものを渡します:

void updatePercentage(WhateverTypeValueBytesIs valueBytes, GattAttribute & descr) {
    GattAttribute * ptr = &descr; // needed, because we want to pass pointer-to-pointer-to-descr
    PercentageFill(PercentageUUID, valueBytes.getPointer(),
               valueBytes.getNumValueBytes(), HeartRateValueBytes::MAX_VALUE_BYTES,
               GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
               &ptr, 1), /* are we sure about trailing comma here? */
    // other relevant trailing code?
}

次のように呼び出します。

void foo(WhateverTypeValueBytesIs valueBytes) {
    GattAttribute nameDescr(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"Percentage", strlen("Percentage"));
    updatePercentage(valueBytes, nameDescr);
}

明らかに、参照を使用する代わりに、関数を作り直してGattAttributeオブジェクトへのポインターを取得することもできます (そして、例で変数が使用されてptrいるのと同じように、変数の代わりにそれを使用しptrます)。

valueBytesさらに追加:に渡すときにコピーを避けたい場合があることに注意してくださいupdatePercentage。ここでは、おそらく参照によって渡したいと考えています。

于 2015-11-18T16:06:00.467 に答える