2017-01-09 4 views
1

I持ってこのようないくつかの配列(特定の名前を無視してください):C:削除する要素の中間配列と以前のポインタが動作している

static resource_t coap_cmp_res[MAX_CMPS]; 
e.g. [cmp1,cmp2,cmp3,cmp4,cmp5,0,0,0] 

例えば、これらの要素を使用するコード、coap_cmp_res [4]( cmp5)がRESTリソースに関連付けられている場合は、Res5とします。ある時点で

、私は位置でその配列の要素を削除するには、次のようにxは:私は、やりたい何

rest_deactivate_resource(&coap_cmp_res[x]); 
    e.g. for x = 2 
    [cmp1,cmp2,0,cmp4,cmp5,0,0,0] 

この

のように、再び単一の連続配列を持っています
e.g. [cmp1,cmp2,cmp4,cmp5,0,0,0,0] 

私は現在、やることは次のとおりです。

for(UInt8 i = x; i < MAX_CMPS; i++){ 
    coap_cmp_res[i] = coap_cmp_res[i+1]; 
} 
which gives [cmp1,cmp2,cmp4,cmp5,cmp5,0,0,0] 

その後、私は手動で最後の非ゼロエルを設定0

e.g. [cmp1,cmp2,cmp4,cmp5,0,0,0,0] 

にementだから、これはよさそうだが、問題はRes5がまだcoap_cmp_resに関連付けられていることである[4]ので、今、私が望むものではない代わりにCMP5の値が0、、。

配列内のxの後にあるすべてのリソースを非アクティブ化して再度アクティブにして、関連付けを再度行うことができますが、これについてもっと効率的な方法があるかどうか疑問に思っていました。 うまくいけば、これは理にかなっています。

+1

私は本当に配列の中でより効率的な方法を知っていませんが、あなたはデータ表現を変更することができれば、多分リンクされたリストはこれをより良くすることができます。 – encryptoferia

+0

ちょうど作成したフリースポットに配列の最後の要素を置き、最後の要素への参照をすべて更新することはできませんか? 各要素への参照が1つしかない場合は、非常に高速です... – yakoudbz

+1

値の配列の代わりに、ポインタの配列を使用します。次に、配列要素を指す代わりに、同じポインタを持つ他の変数を持つことができます。 – Barmar

答えて

0

諺には「間接レベルを追加する」と書かれています。 coap_cmp_resを指し、安定しているresource_t*の配列。次に、Rea5をポインタに関連付けて、間接指示を使用して有効なエントリに到達させます。

static resource_t coap_cmp_res_data[MAX_CMPS]; 
static resource_t* coap_cmp_res_ptrs[MAX_CMPS]; // points into coap_cmp_res_data 

あなたは要素を削除すると、あなたがそれらを移動することなく、coap_cmp_res_ptrsのエントリを更新し、coap_cmp_res_dataを縮小。すべてのリソースは、依然としてcoap_cmp_res_ptrsの同じ位置を参照し、間接指定はそれをリソースの現在の場所に移動します。

あなたの場合(プロファイルする必要があります)は、ノードベースのストレージを使用することをお勧めします。私はリンクされたリストです。

+0

@Sven - 解決策について質問がある場合は、別の質問を投稿してください。これを編集しないでください。これは、SOをきれいに保つためのガイドラインであり、有用な投稿であり、助けを得るチャンスを増やします。 – StoryTeller

+0

@Sven - この投稿へのリンクを新しいものから参照用に追加することができます。 – StoryTeller

関連する問題