2

std.RedBlackTreeソートされた連想配列が必要なため、組み込みの連想配列 (またはハッシュ) の代わりに使用することにしました。std::map望ましい動作は、C++/STLとほとんど同じです。

void main() {

  alias Tuple!(float, float) Pair;
  alias RedBlackTree!Pair Map;
  Map m1;
  m1.insert(Pair(1.1, 2.2));
}

上記のコードは、コンパイル方法 (-release の有無にかかわらず) に応じて、セグメンテーション フォールトを引き起こすか、アサーションをスローします。

これと同じこと:

void main() {

  struct Pair { float first, second; }
  alias RedBlackTree!(Pair, "a.first < b.first") Map;
  Map m1;
  m1.insert(Pair(1.1, 2.2));
}

バグのような匂いがしますが、回避策はありますか?

4

2 に答える 2

8

RedBlackTree はクラスであるため、初期化する必要があります。m1 のデフォルトはヌルです。表示されているのは、Java の NullPointerException に相当します。

これを試して:

import std.stdio, std.container;
void main() {
  struct Pair { float first, second; }
  alias RedBlackTree!(Pair, "a.first < b.second") Map;
  Map m1 = new Map;
  m1.insert(Pair(1.1, 2.2));
}

また、このプログラミング例の脇のヒントとして、RedBlackTree!(Pair, "a.first < b.first")代わりに検討することをお勧めします。その理由は、奇妙な (まったく未定義ではありませんが、おそらくあなたが望むものではない) 振る舞いをするからです。

たとえば、Pair(1, 2) < Pair(1, 3)本当でしょう。奇妙なことに、それPair(1, 3) < Pair(1, 2)もまた真実です。

于 2012-04-14T22:30:08.827 に答える
3

segfault が発生したときに一般的に確認する必要がある最初の 2 つのことは、null ポインター/参照と無限再帰であることを指摘しておきます。また、デバッガーを使用して、それらが発生した場所を正確に特定できます。

RedBlackTreeはクラスであるため、 a である変数はすべてRedBlackTree参照型です。したがって、 以外の値を割り当てる必要があります。そうしないと、nullになりnull、使用しようとすると segfault が発生します。何かへのポインターである変数があり、null 以外の値を割り当てずに使用しようとした場合も、まったく同じことが起こります。

初期化行は

Map m1 = new Map;

または、を使用してRedBlackTree、次のことができます

Map m1 = redBlackTree!"a.first < b.first"(Pair(1.1, 2.2));

redBlackTreeRedBlackTree要素を1 行で作成して a に挿入するためのヘルパー関数です。

于 2012-04-15T00:57:09.023 に答える