问一个char***得问题

RockDH 2003-09-13 07:05:38
我主要是想把一个字符串数组写到NameValue当中,所以把NameValue用
char***作为输出参数,功能函数说明如下:
int GetOutFileEditInfo(XMLTag* pRootTag, const char* TrackName, int NodeInde
x, char*** NameValueArray//关键所在)
{ //下面语句没有问题
XMLTag* pTempTag =
pRootTag->GetEmbeddedTag(1)->GetEmbeddedTagByName(TrackN
ame);
if (!pTempTag)
return 0;
if (NodeIndex > pTempTag->GetNumEmbeddedTags())
return 0;
char* TrackNameWithIndex = new char[strlen(TrackName)+1+sizeof(int)];
char* tempstring = new char[sizeof(int)];
strcpy(TrackNameWithIndex,TrackName);
strcat(TrackNameWithIndex, itoa(NodeIndex, tempstring, 10));
XMLTag* pTempTag1 = pTempTag->GetEmbeddedTagByName(TrackNameWithIndex);
int ArrayLen = pTempTag1->GetNumEmbeddedTags();
XMLTag* pTempTag2 = NULL;
//下面这句出现问题了
*NameValueArray = new char*[ArrayLen*2];
//
for (int EntryIndex = 0; EntryIndex < ArrayLen; EntryIndex++)
{
//pTempTag2Ö¸ÏòÊôÐÔ¶ÓÁеĽڵã
pTempTag2 = pTempTag1->GetEmbeddedTagByName(_PREF, EntryIndex);
if (!pTempTag2)
return 0;
*(NameValueArray[EntryIndex]) =
pTempTag2->GetSynDesEntryValue(_Entry);
*(NameValueArray[EntryIndex+1]) = pTempTag2->GetValue();
}
delete []TrackNameWithIndex;
delete []tempstring;
return ArrayLen;
}
main()函数的主要语句如下:
char* errorbuf = new char[1024];
int buflen = 1024;
XMLTag* pRootTag = ParseSynDesFile("c:\\ad.xml", errorbuf, buflen);
char** fNameValueArray;
int i = GetOutFileEditInfo(pRootTag,_VideoEditInfo, 1,
&fNameValueArray); //这儿调用功能函数
cout<< i<<endl;

为了认证上面的参数调用没有问题我变了下面的测试程序:
void f(char*** aa)
{
*aa = new char*[9];
(*aa)[0] = "asdfasdF";
(*aa)[1] = "asdfasdF";
(*aa)[2] = "asdfasdF";(*aa)[3] = "asdfasdF";
(*aa)[4] = "asdfasdF";(*aa)[5] = "asdfasdF";
(*aa)[6] = "asdfasdF";
(*aa)[7] = "asdfasdF";
(*aa)[8] = "asdfasdF";
}
void main()
{
char** b;
char***c = &b;
f(&b);

cout<<b[0]<<endl<<b[1]<<endl<<b[2]<<endl
<<b[3]<<endl<<b[4]<<endl<<b[5]<<endl<<b[6]<<endl<<b[7]<<endl;

}
测试程序没有问题的!
请大家帮帮忙看看,多谢多谢!
分数慷慨!!
...全文
70 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
RockDH 2003-09-13
  • 打赏
  • 举报
回复
To gernal_dn(),我有想了一下,可能你没有理解我得意思,
NameValueArray是用来输出的,而不是用来输入的,
所以这个地方不是纠缠于指针还是数组,我觉得还是只能用char***,
你再想想看,
Good Luck!
RockDH 2003-09-13
  • 打赏
  • 举报
回复
*(NameValueArray[EntryIndex]) =
pTempTag2- >GetSynDesEntryValue(_Entry);
*(NameValueArray[EntryIndex+1]) = pTempTag2- >GetValue();
应该是EntryIndex×2 EntryIndex×2+1的,现在程序通了。

To gernal_dn(),其实这种情况我考虑了,可能是脑子太乱了,所以越搞越糊涂。
清醒一下,明天再考虑一下。谢谢你了。
BTW:编程真的是太伤脑了,看来对我来说是只能玩玩不能当饭碗的了,苦笑
gernal_dn 2003-09-13
  • 打赏
  • 举报
回复
这样声明原型即可:
int GetOutFileEditInfo(XMLTag* pRootTag, const char* TrackName, int NodeInde
x, char* NameValueArray[])
{
...
}
可以满足char* NameValueArray[]= {"name1" , "value1","name2" , "value2","name3" , "value3"}这样的参数传递的,由于传递的是指针,如果绞缠在“字串数组指针”、“字串数组指针之指针”之间传值、传地址的差别是毫无意义的,记得main函数的原型么?
int main(int argc, char* argv[])
仔细冷静地考虑一下吧。
RockDH 2003-09-13
  • 打赏
  • 举报
回复
sakurar(人脑修理工):
我想实现的是:用户只要送入一个char***NameValueArray,功能函数可以
对他分配内存并且填入字符串数组。

我有认真的看了一下,确实是那个地方可能读写了没有野指针。我再认真看看,
问题想告一段罗把,谢谢各位,特别是emmyjeff(jeff)!
emmyjeff 2003-09-13
  • 打赏
  • 举报
回复
有些系统在例外处理时,定位错误不一定正确,你试一试下面我修改的


int GetOutFileEditInfo(XMLTag* pRootTag, const char* TrackName, int NodeInde
x, char*** NameValueArray//关键所在)
{ //下面语句没有问题
XMLTag* pTempTag =
pRootTag->GetEmbeddedTag(1)->GetEmbeddedTagByName(TrackN
ame);
if (!pTempTag)
return 0;
if (NodeIndex > pTempTag->GetNumEmbeddedTags())
return 0;

char* TrackNameWithIndex = new char[strlen(TrackName)+1+20];

////问题2:问题同上
char* tempstring = new char[20];

memset(TrackNameWithIndex, 0, strlen(TrackName)+1+20);
strcpy(TrackNameWithIndex,TrackName);
strcat(TrackNameWithIndex, itoa(NodeIndex, tempstring, 10));
XMLTag* pTempTag1 = pTempTag->GetEmbeddedTagByName(TrackNameWithIndex);
int ArrayLen = pTempTag1->GetNumEmbeddedTags();
XMLTag* pTempTag2 = NULL;
//下面这句出现问题了。//////什么问题,能够详细说明吗?
*NameValueArray = new char*[ArrayLen*2];
//
for (int EntryIndex = 0; EntryIndex < ArrayLen; EntryIndex++)
{
//pTempTag2Ö¸Ïò
/////下面两行代码什么意思,我没有看懂??
ÊôÐÔ¶ÓÁеĽڵã
pTempTag2 = pTempTag1->GetEmbeddedTagByName(_PREF, EntryIndex);
if (!pTempTag2)
return 0;
*(NameValueArray[EntryIndex]) =
pTempTag2->GetSynDesEntryValue(_Entry);
*(NameValueArray[EntryIndex+1]) = pTempTag2->GetValue();
}
delete []TrackNameWithIndex;
delete []tempstring;
return ArrayLen;
}
sakurar 2003-09-13
  • 打赏
  • 举报
回复
比如说你的NameValueArray在送入函数前初始化了吗?
sakurar 2003-09-13
  • 打赏
  • 举报
回复
你想实现什么?说了半天你也没说问题。
出现未定义错误,看看是不是写了只读、或已被释放的内存。
RockDH 2003-09-13
  • 打赏
  • 举报
回复
那儿是从Vc拷过来的时候形成的乱麻,没什么东西。偶大部分是用人家的代码和思想的。
其实*NameValueArray = new char*[ArrayLen*2]; 在一个工程里面的时候我还没有试过。
我是把XML生成器和XML解析起做成了一个LIB,提供几个出口函数,具体的实现我想对用户透明。结果这个地方老师出现unhandled exception in xmlmain.exe 0x00000005 什么的错误。
也不知道怎么解决啊。
emmyjeff 2003-09-13
  • 打赏
  • 举报
回复
老兄挺牛啊,在做XML解析器吗?
不知道你出了问题的详细情况,但是这一段代码还有其他问题,有问题的地方做了标记

int GetOutFileEditInfo(XMLTag* pRootTag, const char* TrackName, int NodeInde
x, char*** NameValueArray//关键所在)
{ //下面语句没有问题
XMLTag* pTempTag =
pRootTag->GetEmbeddedTag(1)->GetEmbeddedTagByName(TrackN
ame);
if (!pTempTag)
return 0;
if (NodeIndex > pTempTag->GetNumEmbeddedTags())
return 0;

/////问题1:下一行代码中不能用sizeof(int),对于16平台应该为6(0x7FFF = 32767),
////32位平台应该为11(0x7FFFFFFF=2147483647),64位平台应该为20
////(9223372036854775807=0x7fffffffffffffff),而sizeof(int),根据平台不同分别
////为2,4,8;因此此参数最好直接设置为20
char* TrackNameWithIndex = new char[strlen(TrackName)+1+sizeof(int)];

////问题2:问题同上
char* tempstring = new char[sizeof(int)];

/////问题3(包括以下两行代码):这样使用使用TrackNameWithIndex以前,应该
/////把TrackNameWithIndex所指内存清一下0
strcpy(TrackNameWithIndex,TrackName);
strcat(TrackNameWithIndex, itoa(NodeIndex, tempstring, 10));
XMLTag* pTempTag1 = pTempTag->GetEmbeddedTagByName(TrackNameWithIndex);
int ArrayLen = pTempTag1->GetNumEmbeddedTags();
XMLTag* pTempTag2 = NULL;
//下面这句出现问题了。//////什么问题,能够详细说明吗?
*NameValueArray = new char*[ArrayLen*2];
//
for (int EntryIndex = 0; EntryIndex < ArrayLen; EntryIndex++)
{
//pTempTag2Ö¸Ïò
/////下面两行代码什么意思,我没有看懂??
ÊôÐÔ¶ÓÁеĽڵã
pTempTag2 = pTempTag1->GetEmbeddedTagByName(_PREF, EntryIndex);
if (!pTempTag2)
return 0;
*(NameValueArray[EntryIndex]) =
pTempTag2->GetSynDesEntryValue(_Entry);
*(NameValueArray[EntryIndex+1]) = pTempTag2->GetValue();
}
delete []TrackNameWithIndex;
delete []tempstring;
return ArrayLen;
}

char* errorbuf = new char[1024];
int buflen = 1024;
XMLTag* pRootTag = ParseSynDesFile("c:\\ad.xml", errorbuf, buflen);
char** fNameValueArray;
int i = GetOutFileEditInfo(pRootTag,_VideoEditInfo, 1,
&fNameValueArray); //这儿调用功能函数
cout<< i<<endl;
RockDH 2003-09-13
  • 打赏
  • 举报
回复
我想得到的是类似于下面的形式:
char* NameValueArray[]= {"name1" , "value1",
"name2" , "value2","name3" , "value3"}的形式,
如果传char**的话就类似于普通的传值了,不行的。
sakurar 2003-09-13
  • 打赏
  • 举报
回复
char***?
多此一举。传char**就行了。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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