-2

我以前发布过这个问题,但我似乎找不到解决方案。因此,我再次发布详细的描述,希望能解决这个问题。非常感谢您的帮助。

我想做的是从文本文件中连续读取。此文本文件包含 3 种类型的行:

  1. 包含单词“start”的行,指示特定测试用例结果的开始
  2. 包含单词 PASS 或 FAIL 或 PWU 或 FWU 以及随附数据的行
  3. 包含单词“stop”的行,表示测试用例结果的结束

我遇到的麻烦是dataRowPointer. dataRowPointer是一个结构数组。它的指针在主函数中声明,并通过引用传递给下面的函数。

当我调用 时*dataRowPointer = new DataRow[MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET];,我可以在调试器中看到第一个数组元素 dataRowPointer[0] 已正确分配在内存中。然而,第二个、第三个和所有其他元素没有正确分配,因为调试器在内存中将它们显示为 0xcccccccc。

这影响了我的其他函数调用getDataRow( line, loc, tcsPointer, dataRowPointer );,其中包含类似于(*dataRowPointer)[dataRowIndex].tcSetNum = testCaseSetID;.

void getRow( std::istream& myfile, HeaderLocations* loc, TestCaseSet* tcsPointer, DataRow** dataRowPointer )
{
            std::string line;
            std::string word;
            int currentLoc = 0;
            bool startStop = true;

            std::getline( myfile, line);
            std::stringstream sline(line);

            while ( sline >> word )
            {
                if ( word == "PASS" || word == "PWU" || word == "FWU" || word == "FAIL" )
                {   
                       startStop = false;
                       break;   
                }
                else if( word == "start" )
                {   
                        dataRowIndex = 0;
                    *dataRowPointer = new DataRow[MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET];
                        initializeDataRowPointer( dataRowPointer );

                    testCaseSetID = captureTestCaseSetNumber( line, tcsPointer );
                    getHeaderRow( myfile, loc );

                    startStop = true;
                    break;
                }
                else if ( word == "stop" )
                {   tcsNumber++;

                    *dataRowPointer = NULL;
                    startStop = true;
                    break;
                }
                else
                {   startStop = false;  }
            }

            if( !startStop )
            {   
                (*dataRowPointer)[dataRowIndex].tcSetNum = testCaseSetID;
                getDataRow( line, loc, tcsPointer, dataRowPointer );
                dataRowIndex++;
            }
    }

任何帮助将不胜感激。

注意:我知道我的代码很脆弱(如果文本文档没有开始或停止等),并且包含错​​误代码(使用全局变量等)。但请我只想在继续之前先解决这个问题。请尝试忽略语句*dataRowPointer = NULL;中的else if内容,一旦修复了此错误,我会将其更改为更有用的内容。

编辑按要求提供 struct DataRow 的代码和函数 InitializeDataRowPointer 的代码:

数据行:

struct DataRow
{
    std::string tcSetNum;
    std::string class_PassFail;
    std::string rfPort;
    float temp;
    float margin;
};

初始化数据行指针:

void initializeDataRowPointer( DataRow** dataRowPointer )
{
    DataRow newDataRow = {"a", "a", "a", 0.0, 0.0 };
    for ( int i = 0; i < MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET; i++ )
    {   (*dataRowPointer)[i] = newDataRow;  }
}
4

1 回答 1

0

好的,您显示的代码应该可以工作;见证这个程序,它确实有效。

#include <string>
#include <cstdio>

#define MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET 10

struct DataRow
{
  std::string tcSetNum;
  std::string class_PassFail;
  std::string rfPort;
  float temp;
  float margin;
};

static void
initializeDataRowPointer(DataRow** dataRowPointer)
{
  DataRow newDataRow = { "a", "a", "a", 0.0, 0.0 };
  for (int i = 0; i < MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET; i++)
    (*dataRowPointer)[i] = newDataRow;
}

static void
f(DataRow** dataRowPointer)
{
  *dataRowPointer = new DataRow[MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET];
  initializeDataRowPointer(dataRowPointer);
}

int
main(void)
{
  DataRow *ptr;
  f(&ptr);

  for (int i = 0; i < MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET; i++)
    std::printf("%d %s %s %s %f %f\n", i,
                ptr[i].tcSetNum.c_str(),
                ptr[i].class_PassFail.c_str(),
                ptr[i].rfPort.c_str(),
                ptr[i].temp,
                ptr[i].margin);

  return 0;
}

我的结论是问题出在其他地方,我认为最好的办法是获取完整的程序并逐步删除其中的代码,直到您拥有仍然可以证明问题的最小程序。一旦你有了这个,如果问题不明显,问一个新问题,使用这个较小的程序作为你的示例代码。那时我们更有可能为您提供帮助。

于 2013-06-11T01:53:13.013 回答