关于TStingList数组的问题,请各位大侠帮忙!先谢谢呢

sue3140 2010-06-11 11:07:11
最近在做个读文件的程序,请大家帮我看看程序有什么问题,烦躁ing。
这是个调用的函数,就在这里面出问题,我没打开一个新文件就调用这个函数

void TForm1::ReadDatFile(AnsiString FileName)
{
int iFor,jFor;
AnsiString sd;
sd = FileName;
if(sd == "..\\") return;
int i,j,k,n;
//新建链表
TStringList *myTitleList0[2];
TStringList *myTitleList1[2];
TStringList *myTitleList2[2];
TStringList *myNewList0[30];
TStringList *myNewList1[30];
TStringList *myNewList2[30];
for(int i=0; i<2; i++)
{
myTitleList0[i] = new TStringList;
}
for(int i=0; i<2; i++)
{
myTitleList1[i] = new TStringList;
}
for(int i=0; i<2; i++)
{
myTitleList2[i] = new TStringList;
}
int type;
type = ReadFirstNum(sd); //从dll中读取我要switch的类型,这里第二遍读数据的时候就会出问题Access Violation之类的
R0 = ReadNumFromFile(myTitleList0,sd,rf_OneTitle); //从dll中读取要new的个数
for(int i=0; i<R0; i++)
{
myNewList0[i] = new TStringList;
}
//添加数据
switch(type)
{
case 0:
ReadOneFromFile(myTitleList0,myNewList0,sd); //从dll中读取,并保存至链表
break;
case 1:
R1 = ReadNumFromFile(myTitleList1,sd,rf_TwoTitle);
for(int i=0; i<R1; i++)
{
myNewList1[i] = new TStringList;
}
ReadTwoFromFile(myTitleList0,myNewList0,myTitleList1,myNewList1,sd); //从文件读取,保存至链表
for(i=0; i<R1; i++)
{
delete myNewList1[i]; //这里也出问题 当i为R1-1的时候,access violation什么什么的
}
break;
default: break;
}
for(i=0; i<2; i++)
{
delete myTitleList0[i];
// myTitleList0[i] = NULL;
}
for(i=0; i<2; i++)
{
delete myTitleList1[i];
// myTitleList1[i] = NULL;
}
for(i=0; i<2; i++)
{
delete myTitleList2[i];
// myTitleList2[i] = NULL;
}
for(i=0; i<R0; i++)
{
delete myNewList0[i]; //这里出问题 当i为R0-1的时候,invalid pointer operation什么什么的
// myNewList0[i] = NULL;
}
DBGrid1->Visible = true;
}
我看了dll的说明 说要加memmgr.lib,我在dll和我的工程里面都加了,但是问题还是在
谢谢大家,希望大家帮忙看看
...全文
99 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sue3140 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yeyanbin 的回复:]

这样删除没有问题,你的问题可能是DLL参数传递的类型问题,与TStringList无关。
C/C++ code

TStringList *pList[30];
for(int i=0; i<30; i++)
{
pList[i] = new TStringList;
}
if(MessageBox(NULL,"是否删除?","测试",MB_Y……
[/Quote]
哎。。 不知道是什么原因引起的
我如果用bcb的codeguard的话,每一个delete 他都显示一个错误
bad parameter
a bad memory block has been passed to the function
在运行到下面的时候开始显示
[code=C/C++][for(i=0; i<2; i++)
{
delete myTitleList0[i]; //这里出错
}
/code]
sue3140 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ccrun 的回复:]

从大到小删除:
C/C++ code
for(i = R0 - 1; i > -1; i--)
{
delete myNewList0[i];
}
[/Quote]
试过了,说是Invalid Pointer Operation
YeBinYe 2010-06-11
  • 打赏
  • 举报
回复
这样删除没有问题,你的问题可能是DLL参数传递的类型问题,与TStringList无关。

TStringList *pList[30];
for(int i=0; i<30; i++)
{
pList[i] = new TStringList;
}
if(MessageBox(NULL,"是否删除?","测试",MB_YESNO)==IDYES)
{
for(int i=0; i<30; i++)
{
delete pList[i];
}
ShowMessage("删除OK");
}
ccrun.com 2010-06-11
  • 打赏
  • 举报
回复
从大到小删除:
for(i = R0 - 1; i > -1; i--)
{
delete myNewList0[i];
}
sue3140 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ccrun 的回复:]

建议从大到小的删除,并且在循环中,删除前始终判断一下i>-1。防止删除-1元素出错。
[/Quote]
妖哥可否举个例子。。比如说来段小程序说明下 呵呵。。。
属下愚钝。。
ccrun.com 2010-06-11
  • 打赏
  • 举报
回复
建议从大到小的删除,并且在循环中,删除前始终判断一下i>-1。防止删除-1元素出错。
sue3140 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ring_pt 的回复:]

for(i=0; i<R1; i++)
{
delete myNewList1[i]; //这里也出问题 当i为R1-1的时候,access violation什么什么的
}
这样有问题的

for(i=0; i<R1; i++)
{
delete myNewList1[0]; //删除要么从尾巴删 要么只删0
}
[/Quote]
我刚按你的方法试了 还是那个问题啊,。。。
Jim@luckeeinc.com 2010-06-11
  • 打赏
  • 举报
回复
例如TStringList的count是5
1
2
3
4
5
按照你那样删 第一次删除的是1 第二次删除的是3 第三次删的是5, 循环到第四次就越界了
Jim@luckeeinc.com 2010-06-11
  • 打赏
  • 举报
回复
for(i=0; i<R1; i++)
{
delete myNewList1[i]; //这里也出问题 当i为R1-1的时候,access violation什么什么的
}
这样有问题的

for(i=0; i<R1; i++)
{
delete myNewList1[0]; //删除要么从尾巴删 要么只删0
}
sue3140 2010-06-11
  • 打赏
  • 举报
回复
结贴了 发现是自己写的动态链接库的问题。。
虽然还没解决,谢谢大家!~~
sue3140 2010-06-11
  • 打赏
  • 举报
回复
[code=C/C++][/
extern "C" __declspec(dllexport) int __stdcall ReadTwoFromFile(TStringList *myTitleList0[],TStringList *myStrList0[],
TStringList *myTitleList1[],TStringList *myStrList1[],String myCurrenDir)
{
int k;//,n;
char miTempChar[50];
char FileName[100];

strcpy(FileName,myCurrenDir.c_str());
fp=fopen(FileName, "rt");
//读出二段
ReadOnlyOneSection(myTitleList0,myStrList0,fp); //这个函数将文件中的字符串读到stringlist中去
ReadOnlyOneSection(myTitleList1,myStrList1,fp);
k = -1;

fclose(fp);
return k;
}
void ReadOnlyOneSection(TStringList *myTitleList[],TStringList *myStrList[],FILE *myfp)
{
int i,j,k,n;
char miTempChar[50];
for (i=0;i<12;i++)
{ for (j=0;j<2;j++)
{ fscanf(myfp,"%s, ",miTempChar);
Checked_His_Char(miTempChar); //这个是去掉“,”号的函数
myTitleList[j]->Add(AnsiString(miTempChar));
}
}
//读出内容
for (i=0;i<n;i++)
{ for (j=0;j<k;j++)
{
fscanf(myfp,"%s, ",miTempChar);
Checked_His_Char(miTempChar);
myStrList[j]->Add(AnsiString(miTempChar));
}
}

}
]
ccrun.com 2010-06-11
  • 打赏
  • 举报
回复
你的ReadTwoFromFile函数对这些列表进行了什么操作?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧