0

2D配列を使用してC++ですべての行列を生成しようとしていますが、735文字を超えて書き込もうとすると、バスエラーが発生します。メモリ割り当てに問題があると思います。助けてください。

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

#define symbols 800

int main ()

{

    fstream file("/Users/Caste/Documents/MAESTRIA/PROGRAMMING TEST/CAPACITY/test1.txt",ios::out);

    int *ptr;
    ptr =(int*)calloc(symbols, sizeof(symbols));
    int i,j,array[1][symbols];
    for (i=0; i<1; i++)
    {
        for (j=0; j<symbols; j++) 
            array[1][symbols]=1;
    }
    cout << "Array indicates:\n";
    for (i=0; i<1; i++) {
        for (j=0; j<symbols; j++) 

            file<<array[1][symbols];
            file.close();

        cout << "\n";
        }
4

6 に答える 6

3

おそらく他のエラーがありますが、最初に、 (型の) 要素が 1 つしかないarray[1]ときに (2 番目の要素)を使用しています。未定義の動作であり、あなたが書いているので、スタック上の他のオブジェクトを確実に破損しています。arrayint[symbols]

calloc見た目も少し奇妙です。sizeof 定数で指定された要素サイズを見たのは初めてです。この場合、定数の型intは で、 に割り当てているint*ので、運が良かったのかもしれません。しかし、std::vector<int>より適切に思えるでしょう。

そしてもちろん、最初の書き込みの後にファイルを閉じています。つまり、それ以降の書き込みはすべてノーオペレーションになります。

于 2011-05-05T16:24:03.460 に答える
1

助けてくれてありがとう、それは本当に役に立ちました。ここに私がそれを減らす最終的なコードを投稿します:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstring>

using namespace std;

#define symbols 1000000
//#define SNR 7

int main () 
{
    fstream file("/Users/Caste/Documents/MAESTRIA/PROGRAMMING TEST/CAPACITY/test1.txt",ios::out);
    int channel[1][symbols];
    memset((void*)channel, '\0', symbols);
    for (int i=0; i<1; i++) 
        for (int j=0; j<symbols; j++) {
            channel[i][j]=1;
        }
    for (int i=0; i<1; i++) {
        cout << endl;
        for (int j=0; j<symbols; j++) 
            //cout << channel[i][j];
            file<<channel[i][j];
        }
    }
于 2011-05-06T08:52:40.997 に答える
1

ループ内では、配列を宣言するために使用される定数を介して配列にアクセスしています。

array[1][symbols]

ループ変数を使用する必要があります。

array[i][j]
于 2011-05-05T16:07:37.907 に答える
0

たくさんの「1」をファイルに書き込みたいだけなら、次のようなものはどうでしょうか。

std::ofstream file("whatever path");

std::fill_n(std::ostream_iterator<int>(file), how_many, 1);

編集:最初にデータをベクトルに入れてからファイルにコピーするには、次のようにします。

std::vector<int> data;

std::fill_n(std::back_inserter(data), how_many, 1);

それをファイルにコピーするには、次のようにします。

std::copy(data.begin(), data.end(), std::ostream_iterator<int>(file));
于 2011-05-05T16:50:37.457 に答える
0

ptr =(int*)calloc(symbols, sizeof(symbols));
する必要があります
ptr =(int*)calloc(symbols, sizeof(int));

ただし、それがあなたの問題を直接引き起こしているかどうかはわかりません。

于 2011-05-05T16:02:16.033 に答える
0

あなたのプログラムには多くの論理エラーがありますが、クラッシュを引き起こしている問題は、ネストされたループでファイルを閉じてから書き込もうとしていることにあると思います。

于 2011-05-05T16:07:04.787 に答える