1

何かを尋ねようとする前に、できるだけ明確に物事を明確にしようとします。だから私は現在、プログラマーとして高校で勉強しています。最近、先生から、RAD Studio XE3 で VCL フォーム アプリケーションを作成するように依頼されました。これは、C プログラムのようなものですが、フォームなどのみを使用します。

行列 N*M (最終的には 2 次元の文字配列) を作成し、ラテン文字を格納する必要がありました。次に、挿入ソート方法でソートする必要がありました。これまでに行ったことは、配列を定義し、それらの文字が読み取られる StringGrid1 を作成したことです。私はそれらを 2 次元の char 配列に格納しましたが、私にとって最も難しいのは、これらの文字をアルファベット順にソートすることですが、すべてを一緒にソートする必要はありません。各行を個別にソートしてから、最終的な変更を表示しますStringGrid1 に戻ります (それは問題ではありません)。

前に言ったように、私はそのようなことを機能させるのに大きな困難を抱えています。私は 10 億の例を調べ、Google でソリッド AGE などを検索しました。整数値だったらどうでもいいのですが、C が String 値を嫌うのも我慢できません。

私のプログラム:

http://i.stack.imgur.com/Brx9X.jpg

これは、StringGrid1 文字から読み取り、配列 [i][j] に格納する方法です。mmax と nmax は、ユーザーが行と列のカウントを自分で選択できるため、読み取る範囲を示すために使用されます。

    for(int i=0; i < mmax; i++)    //Rindas (kolonnas)
    {
        for(int j=0; j < nmax; j++) //Kolonnas (rindas)
            {
                char * temp = (char*)(StringGrid1->Cells[i][j]).c_str();    //Nolasam no Edit lauka char elementu
                array[i][j] = temp[0];       //Piešķiram masīvam šo elementu
                ListBox1->Items->Add(array[i][j]);    //Ierakstam ListBox1 masīva elementu
                Button3->Enabled = False;
                Button6->Enabled = True;

            }
    }
StringGrid1->Options = StringGrid1->Options >> goEditing;  //Neatļauj lietotājam rediģēt StringGrid1 laukus

さて、ここでちょっと…どうすればいいですか?手がかりがありません。各行を個別に並べ替える必要があるように、2-D から文字を並べ替えるにはどうすればよいですか。たとえば、5 つの行があり、各行が 1 つずつ並べ替えられます。

4

1 に答える 1

0

まず最初に、配列を正しく埋めていません。この行:

char * temp = (char*)(StringGrid1->Cells[i][j]).c_str();

プロパティから一時的な StringインスタンスをCells取得し、そのc_str()メソッドを介して内部データへのポインタを取得し、範囲外になったときに を解放しStringて、ポインタをぶら下げたままにして、この行では有効にしないようにします。

array[i][j] = temp[0];

配列はたまたま正しい文字値になりますが、 aStringの内部データが参照カウントされており、元の値TStringGridへのアクティブな参照が残っているため、データはまだメモリから物理的に解放されていないため、ポインタまだ生きている元のメモリをまだ指していますが、それは依存すべきではない実装の詳細です。StringStringtemp

代わりにこれを使用してください:

String temp = StringGrid1->Cells[i][j];
array[i][j] = temp[1]; // or temp.c_str()[0]

またはこれ:

array[i][j] = StringGrid1->Cells[i][j][1]; // or StringGrid1->Cells[i][j].c_str()[0]

そうは言っても、実際の並べ替えロジックはかなり簡単です。特に STL を使用して実際の並べ替えを行う場合は、次のようになります。

#include <algorithm>

for(int i=0; i < mmax; i++)
{
    std::sort(&(array[i][0]), &(array[i][nmax]));
}

並べ替えをさらに制御する必要がある場合は、カスタム比較関数を使用できます。

#include <algorithm>

bool my_compare(char a, char b)
{
    // return true if the first argument is less than the second, otherwise return false.
}

for(int i=0; i < mmax; i++)
{
    std::sort(&(array[i][0]), &(array[i][nmax]), my_compare);
}
于 2013-02-28T02:31:28.327 に答える