glxhyt

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  15 随笔 :: 0 文章 :: 4 评论 :: 0 Trackbacks
1:指针问题:
错误代码:
//A.cpp
T gTemp;
void GetA(T *p)
{
   p = &gTemp;
}

//B.cpp
T iInfo;
GetA(&iInfo);
或者
T *piInfo;
GetA(piInfo);

正确的是
//A.cpp
T gTemp;
T* GetA()
{
  return &gTemp;
}

//B.cpp
T *piInfo = GetA();

解决方案:
<<你必须知道的495个C语言问题>>
5.4 我有个函数,它应该接受并初始化一个指针 void f(int *ip) { static int dummy = 5; ip = &dummy;} 但是当我如下调用时: int *ip; f(ip); 调用者的指针却没有任何变化。 你确定函数初始化的是你希望它初始化的东西吗?请记住在 C 中, 参数是通过值传递的。被调函数仅仅修改了传入的指针副本。你需要传入指针的地址 (函数变成接受指针的指针), 或者让函数返回指针。


同理下面也是错误的
void Swap(T* rht, T* lht)
{
T *pTemp = rht;
rht = lht;
lht = pTemp;
}

2: 计算算法时间问题

start = beginTime();
for (int i = 0; i < 100; ++ i)
   for (int j = 0; j < 1000; ++ j)
{
      //转化函数:
      A......
      //算法
      B.......
}

End = beginTime();

错误地方:A....花费2毫秒

   结果测试出现很大问题:
   A....花费两毫秒
   100*1000*2 = 200s = 3.3分钟

 修改方案:
 
   //转化函数:
   A......
   放在外面进行转化
   

   start = beginTime();
   for (int j = 0; j < 1000; ++ j)
   {
      //转化函数:
     A......
   }

   for (int i = 0; i < 100; ++ i)
      for (int j = 0; j < 1000; ++ j)
   {
      //算法
      B.......
   }

  End = beginTime();

3: Hash 算法

4:for(u_short i = 100; i >= 0; --i)
   修改:
     for (u_short i = 100; i > 0; --i)
     for(int i = 100; i >= 0; --i)

5:读写文件, 发送消息,最好定义一个头,那样
   容易知道读取的是什么,读取的是否错误
 // 消息头
 struct TMSG_HEADER
 {
  char    cMsgID;   // 消息标识

  TMSG_HEADER(char MsgID = INVALID_MSG)
   : cMsgID(MsgID)
  {
  }
 };


 // 请求传送的文件名
 // 客户端传给服务器端的是全路径名称
 // 服务器传回给客户端的是文件名
 struct TMSG_FILENAME : public TMSG_HEADER
 {
  char szFileName[256];  // 保存文件名的字符数组

  TMSG_FILENAME()
   : TMSG_HEADER(MSG_FILENAME)
  {
  }
 };

 // 传送文件长度
 struct TMSG_FILELENGTH : public TMSG_HEADER
 {
  long lLength;

  TMSG_FILELENGTH(long length)
   : TMSG_HEADER(MSG_FILELENGTH), lLength(length)
  {

  }
 };


累了,以后再写吧,↖(^ω^)↗
posted on 2012-05-15 23:27 郭龙 阅读(485) 评论(3)  编辑 收藏 引用

评论

# re: 自己工作中犯的几个小问题 2012-05-17 16:04 钟谢伟
是的,问题1中,传递的是指针地址的副本,函数GetA也仅仅改变的是副本指针的地址,并没有改变指针指向的位置的内容,它的效果好比:
//A.cpp
int gTemp = 1;
void GetA(int p)
{
p = gTemp;
}

//B.cpp
int iInfo=2;
GetA(iInfo);
自然是不能改变iInfo的值了。

改正后可行,是因为在对piInfo进行声明的时候同时进行了定义,此时它并没有自己的地址,因此定义为返回的地址便可行了。

不知这样理解对否?  回复  更多评论
  

# re: 自己工作中犯的几个小问题 2012-05-23 23:58 郭龙
@钟谢伟
修改之后,通过返回值传回来,这个具体深入原因我也不太理解。

看了你的随笔 <<函数参数传递,一二事 >>
void SetToSix(int *&pTempPtr)
这个也可以修改成二级指针
void SetToSix(int **pTempPtr)
{
*pTempPtr = &nSix;
}

int iTemp = 5;
int *p = &iTemp;
SetToSix(&p);

基本如下:
| --------------|
| 0x0000 FFF1 | -----> 5
|---------------|

|--------------|
| 0x0000 FFF5 | ------> 0x0000 FFF1
|--------------|

修改了指针 0x0000 FFF1,也就是修改了变量。

通过指针的方式给函数参数传值呢,从根本上来讲,它仍然是直接传值。

但是二级指针不好用,昨天就出现问题了,晕

1:只能取出来第一个
int *p[5] = {NULL,};
void Fun(int **p, int *iNum);
Fun(p, &iNum) 或者Fun(&(p[5]), &iNum);
都只能取出来第一个,希望你有时间研究一下,我昨天搞晕了

2:Right
最后改成
int *p = NULL;
int iNum;
Fun(&p, &iNum);
3:Error
int**p = NULL;
Fun(p);  回复  更多评论
  

# re: 自己工作中犯的几个小问题 2012-05-24 09:00 钟谢伟
可以把你遇到的问题描述的详细点吗?  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理