2013-02-19 112 views
1

在尝试询问任何内容之前,我会尽可能澄清事情。 所以我现在正在高中作为程序员学习。最近,我的老师要求我在RAD Studio XE3中创建一个VCL表单应用程序,就像C程序一样,但只能用于表单和内容。在RAD Studio XE3中按字母顺序排列二维字符数组

我不得不创建矩阵N * M(最终2-D字符数组),其中存储拉丁字符。然后我不得不使用插入排序方法进行排序。所以我到目前为止所做的是,我定义了数组,我创建了一个从中读取这些字符的StringGrid1。我将它们存储到二维字符数组中,但对我来说最困难的事情是使它按字母顺序排列字符,但我不必将所有内容排序在一起,只对每行分别进行排序,然后进行最终更改出现在StringGrid1上(这不是问题)。

正如我之前说过的,我在解决这个问题时遇到了一些困难。我已经经历了十亿个例子,搜索谷歌像坚实的年龄。如果这些都是整数值,它就没有任何意义了,但我几乎不能承担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 

所以,现在的排序事情...我该怎么做?我没有线索。如何从二维排序字符,并且不应该对每行进行单独排序,例如,有5行,并且每行都被逐一排序。

回答

0

首先,你没有正确地填充你的数组。这条线:

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

取得从Cells属性临时String例如,经由其c_str()方法抓起一个指向它的内部数据,然后释放该String当它超出范围,留下指针悬空所以它不是在这条线有效:

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

你的阵列发生用正确的字符来结束acter值,但仅仅是因为String的内部数据是引用计数的,并且TStringGrid仍然具有对原始String值的主动引用,因此String数据没有从内存中物理释放,因此您的temp指针仍指向原始内存仍然存在,但这是您不应该依赖的实现细节。

用这个代替:

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); 
}