0

当初、私のラボでは、addFractionJesseR(*lFrac, *rFrac, **resFrac); という 3 つの引数を渡していました。しかし、3 つの引数を渡すことができないことがわかりました。**resFrac = addFractionJesseR(*lFrac, *rFrac); に変更する必要がありました。そして今、コンパイルに問題があります。ポインターとダブルポインターがどこかで範囲外であることはわかっていますが、どこを見つけることができません。デバッガーは問題として 2 行目を示します。

FractionJesseR& FractionJesseR::operator=(const FractionJesseR& arg) {
  num = arg.num;
  denom = arg.denom;
  return *this;
}

これは次のように呼び出されます:

FractionJesseR& addMenu(FractionJesseR* lFrac, FractionJesseR* rFrac) {
  int option;
  FractionJesseR** resFrac = new FractionJesseR*();
......
    case 2:
      cout << "Calling add() --\n\n";
      **resFrac = addFractionJesseR(*lFrac, *rFrac);
      break;
    ......

**resFrac = addFractionJesseR(*lFrac, *rFrac); 元は addFractionJesseR(*lFrac, *rFrac, **resFrac); でした。

これは次のように呼び出されます:

void displayMenu() {
  int option;
  FractionJesseR *lFrac = nullptr;
  FractionJesseR *rFrac = nullptr;
  FractionJesseR *resFrac = nullptr;
......
    case 2:
      cout << "  Adding Option --\n\n";
      if (lFrac == nullptr && rFrac == nullptr) {
        cout << "    Not a proper call as no Fractions are available!\n\n";
      }
      else {
        *resFrac = addMenu(lFrac, rFrac);
      }
      break;

*resFrac = addMenu(lFrac, rFrac) はもともと addMenu(lFrac, rFrac, &resFrac) でした

(はい、私はすべてのポインターで削除を呼び出しました。私はまだスタック オーバーフローに慣れておらず、関連するコードのスニペットのみを配置することを学んでいます)正しい方向に向ける助けが必要です。addMenu または displayMenu のどこかでポインタが範囲外になっていると思います...二重ポインタの逆参照が間違っているのでしょうか?

どんな助けでも大歓迎です!

編集:

FractionJesseR& addFractionJesseR(FractionJesseR& lFrac, FractionJesseR& rFrac) {
  int n = 0;
  int d = 0;
  FractionJesseR *resFrac = nullptr;

 // Adding the fractions
 n = (&lFrac)->getNum() * (&rFrac)->getDenom() + (&lFrac)->getDenom() *
    (&rFrac)->getNum();
  d = (&lFrac)->getDenom() * (&rFrac)->getDenom();

  resFrac = new FractionJesseR(n / gcd(n, d), d / gcd(n, d));

  if (d < 0) {
    d = -d;
    n = -n;
  }

  return *resFrac;
}
4

1 に答える 1