我之前发布过此问题,但似乎无法找到解决方案。因此,为了解决这个问题,我将再次发布精致的描述。非常感谢您的帮助。
我想要做的是从文本文件中连续阅读。此文本文件包含3种类型的行:
我遇到的问题是dataRowPointer
。 dataRowPointer
是一个struct数组。它的指针在main函数中声明,并通过引用传递给以下函数。
当我调用*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的代码:
的DataRow:
struct DataRow
{
std::string tcSetNum;
std::string class_PassFail;
std::string rfPort;
float temp;
float margin;
};
InitializeDataRowPointer:
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; }
}
答案 0 :(得分: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;
}
我的结论是问题出在其他地方,我认为你最好的选择是采取你的完整程序并逐步从中删除代码,直到你拥有仍然可以解决问题的最小程序。一旦你有了,如果问题不明显,请提出一个新问题,使用这个较小的程序作为示例代码。那时我们更有可能帮助你。