-1

特定の入力値が見つかった配列のインデックスを含む配列を返すプログラムを試みましたが、実行するたびにエラーが発生し、無限の実行時間のようです。エラーは、見つかった最後のインデックスを出力した直後に発生しているようです。

誰でも助けることができますか?(補足: ポインターを使い終わったときにポインターを削除することについて、複数のページを見てきました。ここでそれを行う必要がありますか?)

言及するのを忘れました-返された配列の最初のスロットに配列のサイズを保存して、後でプログラムで簡単にアクセスできるようにします

#include <iostream>
#include <vector>
using namespace std;

int* linearSearch(int* n, int k, int f) {
    // Input: Index 0 Address ; Size of Array; Element to Search
    // Output: Array of Found Indicies
    vector <int> a;
    int* b;
    for(int i = 0; i < k; i++)
        if(n[i] == f)
            a.push_back(i);
    *b = a.size();
    for(int i = 0; i < a.size(); i++)
        b[i + 1] = a[i];
    return b;
}

int main() {
    int c[10] = {4, 4, 6, 3, 7, 7, 3, 6, 2, 0};
    int* k = linearSearch(&c[0], sizeof(c)/sizeof(int), 4);
    for(int i = 0; i < k[0]; i++) {
        cout << "Found at index: " << k[i + 1] << endl;
    }
    return 0;
}
4

4 に答える 4

0

これは完璧ではありませんが、これは正しい実装にはるかに近いものであり、いくつかの作業を行うことでさらに進めることができるはずです:

#include <iostream>
#include <vector>
using namespace std;

std::vector<int> linearSearch(int* n, int k, int f)
{
  vector <int> a;

  for(int i = 0; i < k; i++)
  {
      if(n[i] == f)
      {
          a.push_back(i);
      }
  }

  return a ;
}

int main() {
  int c[10] = {4, 4, 6, 3, 7, 7, 3, 6, 2, 0};
  std::vector<int> result = linearSearch(&c[0], sizeof(c)/sizeof(int), 4);

  for(unsigned int i = 0; i < result.size(); i++)
  {
      cout << "Found at index: " << result[i + 1] << endl;
  }
  return 0;
}
于 2013-02-28T00:06:20.767 に答える
0

とにかく std::vector を使用する場合、最も必要な場所で使用しないのはなぜですか? また、そのポインターで配列を変更することを想定していない場合は、const ポインターでそれを表現します。

std::vector<int> linearSearch(const int* n, int k, int f)
{
   std::vector<int> res;
   for(int i = 0; i < k; i++)
        if(n[i] == f) res.push_back(i);
   return res;
}

int main() {
    int c[10] = {4, 4, 6, 3, 7, 7, 3, 6, 2, 0};
    std::vector<int> k = linearSearch(&c[0], sizeof(c)/sizeof(int), 4);
    for(int i = 0; i < k.size(); i++) {
        cout << "Found at index: " << k[i] << endl;
    }
    return 0;
}
于 2013-02-28T00:07:34.973 に答える
0
int* b;
....
*b = a.size();

b割り当てる必要があります。以下を試してください:

int* b = new int[a.size() + 1];
b[0] = a.size();

私はあなたが何を意味するかわかりました。b最初の要素に魔法のような長さがあります。これは Pascal/Delphi ではありましたが、C/C++ ではそうではありませんでした。

于 2013-02-27T23:57:05.867 に答える
0

要求したことのないヒープメモリに書き込んでいます。

int* b;

このポインタは、初期化されていないため、未定義のメモリ アドレスを指しています。次に、インデックス演算子を使用して一致を割り当てると、未定義のメモリ アドレスに続く後続のバイトに書き込みます。

「new[]」演算子を使用して、結果を保存するためのスペースを割り当てる必要があります。さらに、メモリを正しく要求した場合、一致結果の数を結果配列の最初の要素に割り当てることになりますが、これは意図していないようです。

new [] 演算子を使用した C++ での動的メモリ割り当てを見てみましょう。

于 2013-02-27T23:59:44.863 に答える