想传个数组好难那!

dadafeng 2002-11-06 12:23:54
原本想传地址
比如这样
int a[2]={1,2};
int *p;
p = &a[0];

fun(p,...)

可到了外面,这个p[0],p[1]里面的值乱七八糟
函数是外部调用的(再另外一个dll里)
怎么做?
...全文
41 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
dadafeng 2002-11-13
  • 打赏
  • 举报
回复
问题解决了,是我一个疏忽造成的:)

提到C++的封装性,我现在真的对他很有意见,哎,算了,有机会再跟大家讨论一番
bearforcat 2002-11-06
  • 打赏
  • 举报
回复
gz
lysde 2002-11-06
  • 打赏
  • 举报
回复
p = a;就可以了;
若是在外部调用的话,你的程序有问题。
就是你的数组的生存时间有问题。你可以使用指针来完成。然后的外部函数中delete掉它
realdreamer 2002-11-06
  • 打赏
  • 举报
回复
看你的调用应该没问题.
另一个 DLL 中的函数声明是如何的?

danmao 2002-11-06
  • 打赏
  • 举报
回复
看了一通,感觉楼主没有描述清楚。我到现在还是没有理解楼主的意思。

但是光看楼主设计的两个类不是很正确,封装不好。就着楼主的意思分析一下问题:
int *getweight();这个函数你返回的是什么呢?
1、在函数中new的一个数组,是否正确拷贝了。
2、直接是m_weightList,对象在哪里声明的?如果在不同的dll中声明,我怀疑会有问题。

“但是他们并不在一个dll里”——是对象的声明吗?描述清楚一点吧。

共同学习 :)
Aizz 2002-11-06
  • 打赏
  • 举报
回复
如果你只赋值了weightlist[0],而没有weightlist[1],那么你在另一个地方取weightlist[1]的时候你取出的是什么呢?
没有越界检查的指针是危险的。
你可以类中定义一个计数变量,赋值的时候改变该变量。传递指针的时候把计数值也传过去。
dadafeng 2002-11-06
  • 打赏
  • 举报
回复
数组边界是不能确定的,所以才用int *这样的方法存储数据链,复值时我这样做
weightlist[0]=
weightlist[1]=
地址应该是连续的,具体多少个数在程序中保存,所以树组的边界我并不管。
我也确定weightlist并没有其他什么操作改变过他,但就是不行,奇了怪了
Aizz 2002-11-06
  • 打赏
  • 举报
回复
那么你取指针内容的时候用什么方式取呢?你在使用weightlist[1]时能保证里面是有效数据吗?我想你程序里应该有一个约定或者其他的方法决定指针所指的数组的边界吧,呵呵。
dadafeng 2002-11-06
  • 打赏
  • 举报
回复
我也曾想过用memcpy,麻烦就麻烦点吧
但是这个树组的大小我怎么判断呢,声明时都是用int *这样定义的
Aizz 2002-11-06
  • 打赏
  • 举报
回复
可能用拷贝而不是用赋值要好一点(让两个DLL分别拥有自己的weightlist),感觉两个指针都指着一块内存,只不准什么时候一变就天下打乱了,呵呵。
如果要保证两个DLL统一weightlist,那就在主程序中定义static好了。
愚见,请指教。
dadafeng 2002-11-06
  • 打赏
  • 举报
回复
p=a和p=&a[0]作用是相同的,这是个人都知道

只要能传道解惑,言词激烈并没关系

我为了检查数据传递是否成功才写的上面的程序

真正的原型大概是这样

Class CFocus
{
private:
int *m_weightList;
...
public
int *getweight();
void setweight(int *weight);
...
}
Class Beam
{
private:
int *m_weightList;
...
public
int *getweight();
void setweight(int *weight);
...
}
这两个类有相同的数组成员weightlist,我象传递他们的值,但是他们并不在一个dll里面(不知道会不会又影响)

调试发现从类Beam取出weightlist时正常,当时负值给Focus也成功,但程序运行到其他地方时weightlist的值就变了。(beam类并没有唏构,weightlist成员应该还存在着)
这个树组的值怎么就变了,这才是问题的关键
lysde 2002-11-06
  • 打赏
  • 举报
回复
楼主明白没有????
GZCompiler 2002-11-06
  • 打赏
  • 举报
回复
对嘛,谁都有过不明白的时候,不要嘲笑人家嘛!
双杯献酒 2002-11-06
  • 打赏
  • 举报
回复
水平有高低,这很正常。
请各位 高手/老手/专家/菜鸟们 在说话的时候尽量“温柔”一些,
不要让刚刚起步的小弟弟小妹妹们感到不友好。
BlueAtlantis 2002-11-06
  • 打赏
  • 举报
回复
这肯定是个初学者,你可能是在函数里出现问题了。
你好好查你的函数吧。
还有那个p=&a[0];
真便扭,刚考过二级吧。
双杯献酒 2002-11-06
  • 打赏
  • 举报
回复
您的问题描述不清楚。
到底是
(1)
函数fun在这里定义
在另外的DLL中调用它

还是
(2)
函数在DLL中定义
在这里调用它

如果是(1)
那么,fun的参数内容就应该是
DLL调用的时候传递的实际参数,
与这里的a没有关系,
它的值当然也不会正好是{1,2}。

如果是(2),
则应该没有问题.
gaoql 2002-11-06
  • 打赏
  • 举报
回复
int *p=a;
双杯献酒 2002-11-06
  • 打赏
  • 举报
回复
您应该

int a[2]={1,2};
int *p;
p = a; //不需要 p=&a[0]; 但也可以这样
fun(p,2,...); // 2 表示数组的数据个数


定义:
int fun(int* data,size_t size,...)
{
int i;
for(i=0;i<size;i++)
{
printf("%d\n",data[i]);
}
//........
return 0;
}
dadafeng 2002-11-06
  • 打赏
  • 举报
回复
public类型的,没什么特别的

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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