0
void pushSynonyms (string synline,  char  matrizSinonimos [1024][1024]){


             stringstream synstream(synline);

             vector<int> synsAux;


             int num;

             while (synstream >> num) {synsAux.push_back(num);}


             int index=0;
             while (index<(synsAux.size()-1)){

                   int primerSinonimo=synsAux[index];
                   int segundoSinonimo=synsAux[++index];
                   matrizSinonimos[primerSinonimo][segundoSinonimo]='S';
                   matrizSinonimos [segundoSinonimo][primerSinonimo]='S';

                   }

           } 

和电话..

char matrizSinonimos[1024][1024];
     pushSynonyms("1 7", matrizSinonimos)

matrizSinonimos通过引用传递对我来说很重要。

编辑:从&matrizSinonimos.

编辑:运行时错误是:

An unhandled win32 exception occurred in program.exe [2488]![alt text][1]
4

6 回答 6

5

它出什么问题了

你在那里的代码 - 我找不到错误。我发现的唯一问题是,如果您根本不提供号码,那么这部分会造成伤害:

(synsAux.size()-1)

它将从 0u 中减去一个。这将环绕,因为size()返回一个无符号整数类型。你最终会得到一个非常大的值,大约是 2^16 或 2^32。您应该将整个 while 条件更改为

while ((index+1) < synsAux.size())

您可以尝试在呼叫方周围寻找错误。通常情况下,在此之前某处发生缓冲区溢出或堆损坏,因此程序在程序的稍后时间点崩溃。

其中的参数和参数的东西

关于数组及其传递方式,我认为您做得很好。虽然,您仍然按值传递数组。也许你已经知道了,但我会重复一遍。你真的传递了一个指向这个数组的第一个元素的指针:

char matrizSinonimos[1024][1024];

二维数组实际上是一个数组数组。该数组的第一个元素是一个数组,指向它的指针就是一个指向数组的指针。在这种情况下,它是

char (*)[1024]

即使在参数列表中您说您接受一个数组数组,编译器也会一如既往地对其进行调整并使其成为指向此类数组第一个元素的指针。所以实际上,在编译器对参数类型的调整完成后,你的函数就有了原型:

void pushSynonyms (string synline,  char (*matrizSinonimos)[1024]);

尽管经常建议,您不能将该数组作为 a 传递char**,因为被调用的函数需要内部维度的大小,才能正确处理正确偏移处的子维度。在被调用函数中使用 a char**,然后编写类似matrizSinonimos[0][1]的内容,它将尝试将该数组的第一个 sizeof(char**) 字符解释为指针,并尝试取消引用随机内存位置,然后再执行该操作时间,如果它没有在两者之间崩溃。不要那样做。您在该数组的外部维度中写入的大小也无关紧要。它合理化了。现在,通过引用传递数组并不重要。但如果你愿意,你必须把整个事情改成

void pushSynonyms (string synline,  char (&matrizSinonimos)[1024][1024]);

通过引用传递不会传递指向第一个元素的指针:所有维度的所有大小都被保留,并且传递的是数组对象本身,而不是一个值。

于 2009-01-22T19:20:02.770 回答
4

数组作为指针传递——不需要对它们进行传递引用。如果你声明你的函数是:

void pushSynonyms(string synline, char matrizSinonimos[][1024]);

您对数组的更改将持续存在 - 数组永远不会按值传递。

于 2009-01-22T16:51:52.320 回答
3

异常可能是0xC00000FD,或者堆栈溢出!

问题是您正在堆栈上创建一个 1 MB 数组,这可能太大了。

于 2009-01-22T18:55:23.383 回答
0

编辑 1)我忘了回答你的实际问题。好吧:在您更正了代码以正确方式传递数组之后(不再有不正确的间接),在我看来,您最有可能没有检查您的输入是否正确。您从流中读取,将其保存到向量中,但您从未检查过您获得的所有数字是否实际上都在正确的范围内。(结束编辑1

第一:使用原始数组可能不是您真正想要的。有std::vector,或boost::array。后者是像原始数组一样的编译时固定大小数组,但提供了 C++ 集合类型定义和方法,这对于通用(阅读:模板化)代码很实用。

而且,使用这些类可能会减少关于类型安全、按引用传递、按值传递或传递指针的混淆。

第二:数组作为指针传递,指针本身是按值传递的。

第三:你应该在堆上分配这么大的对象。在这种情况下,堆分配的开销是微不足道的,它将减少堆栈空间用完的机会。

第四

void someFunction(int array[10][10]);

真的是:

编辑 2)感谢评论:

void someFunction(int** array);

void someFunction(int (*array)[10]);

希望我没有在其他地方搞砸......(结束编辑2

10x10 数组的类型信息丢失。要了解您可能的意思,您需要编写:

void someFunction(int (&array)[10][10]);

这样编译器可以检查调用方的数组实际上是一个 10x10 的数组。然后,您可以像这样调用该函数:

int main() {
  int array[10][10] = { 0 };
  someFunction(array);
  return 0;
}
于 2009-01-22T18:46:02.183 回答
0

尝试将其声明为:

void pushSynonyms (const string & synline,  char  *matrizSinonimos[1024] )

我相信这会做你想做的事。正如其他人所说,您拥有它的方式在堆栈上创建了一个 1MB 数组。此外,将 synline 从 更改stringconst string &消除了将完整的字符串副本推入堆栈。

另外,我会使用某种类来封装 matrizSinonimos。就像是:

class ms
{
    char m_martix[1024][1024];
    public:
    pushSynonyms( const string & synline );
}

那么你根本不必通过它。

于 2009-01-22T19:23:44.917 回答
0

我不知道上面的代码有什么问题,但如果你不能让数组语法工作,你总是可以这样做:

void pushSynonyms (string synline,  char  *matrizSinonimos, int rowsize, int colsize )
{
   // the code below is equivalent to 
   // char c = matrizSinonimos[a][b];
   char c = matrizSinonimos( a*rowsize + b );
   // you could also Assert( a < rowsize && b < colsize );
}

pushSynonyms( "1 7", matrizSinonimos, 1024, 1024 );

如果在编译时已知,您还可以将 rowsize 和 colsize 替换为 #define SYNONYM_ARRAY_DIMENSION 1024,这将使乘法步骤更快。

于 2009-01-22T19:44:48.697 回答