0

実行時にクラッシュ エラーが発生し、関数の正確な処理方法やデータの取得方法がわかりません。

機能詳細

int配列を引数として受け取る関数をsize作成し、指定された要素よりも 1 要素大きい新しい配列を作成します。最初の要素を に設定0し、引数配列の内容を新しい配列にコピーします。

主な詳細

int n入力から読み取るプログラムで使用し、int nファイル データ名から読み取り、data それを要素シフターに渡し、出力に出力します (1 行に 1 つ)。

#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;

int element_shift(int elmts[], int size) {
  int new_size = size + 1;
  int shifter[new_size];
  int *elmt_sft;
  shifter[0] = 0;
  for (int i = 1; i >= new_size; i++) {
    shifter[i + 1] = elmts[i];
  }
  return *elmt_sft;
}

int main() {
  fstream infile;
  infile.open("D:\\data.txt");
  int n, x;
  infile >> x;
  cout << "size of array: ";
  cin >> n;
  const int ARRAY_SIZE = n + x;
  int elements[ARRAY_SIZE];
  element_shift(elements, ARRAY_SIZE);

  system("PAUSE");
  return EXIT_SUCCESS;
}
4

2 に答える 2

1

まずARRAY_SIZE、メイン関数で宣言されているのは定数変数ではなく、ユーザー入力に応じて実行時に定義されます。これは、配列elementsを動的に作成する必要があることを意味します。一方x、配列のサイズを定義するためだけに使用され、配列をまったく初期化していない変数を読み取ります。問題のステートメントは、入力から配列のサイズを読み取り、次にファイルから配列のデータを読み取ることだと思います。

element_shift 関数にも多くの間違いがあります。

コードは次のようになります。

#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;

void element_shift(int* elmts, int size)
{
    int new_size = size + 1;
    int* shifter = new int[new_size];
    shifter[0] = 0;
    for(int i = 0; i < size; ++i)
    {
        shifter[i + 1] = elmts[i];
    }
    delete [] elmts;
    elmts = shifter;
}


int main()
{
    fstream infile;
    infile.open("D:\\data.txt");

    int n;
    cout << "size of array: ";
    cin >> n;

    int* elements = new int[n];

    for (int i = 0; i < n; ++i) {
        infile >> elements[i];
    }

    element_shift(elements, n);

    for (int i = 0; i < n; ++i) {
        std::cout << elements[i] << std::endl;
    }

    return EXIT_SUCCESS;
}
于 2012-04-18T05:10:55.260 に答える
0

まず、シフトされた配列の作成に多くの時間を費やしますが、それを返さないでください。

int element_shift(int elmts[], int size) {
  int new_size = size + 1;
  int shifter[new_size];
  int *elmt_sft;
  shifter[0] = 0;
  for (int i = 1; i >= new_size; i++) {
    shifter[i + 1] = elmts[i];
  }
  return *elmt_sft;
}

elmt_sftポインターが割り当てられることはありません。を使用して、そこにないメモリにアクセスしようとしています*elmt_sft。これがエラーの原因になっている可能性があります。shifterまた、この変数はローカルで宣言されており、関数が終了すると消えるため、この関数には新しい配列を返す方法がありません。関数で何か新しいものを作成し、関数が終了してもメモリに保持したい場合は、配列を動的に作成し、それへのポインターを返すことをお勧めします。

これはテストされていませんが、正しい方向に進むはずです。他の配列をオーバーライドしない、動的に割り当てられた別の配列を返します。

int* element_shift(int elmts[], int size) {
  int *result_array = new int[size + 1]; //dynamically create new array MAKE SURE TO DELETE
  result_array[0] = 0; //set 0 index to 0
  for (int i = 1; i < size + 1; i++)//start at 1 of the result and put value in
  {
    result_array[i] = elmts[i - 1];
  }
  return result_array; //returning pointer
}
于 2012-04-18T05:19:14.463 に答える