增加指针不会编译我计划的方式

时间:2009-07-20 22:44:47

标签: delphi pointers

我试图让我的代码尽可能简单,但我失败了。

这是我的代码:

class function TWS.WinsockSend(s:integer;buffer:pointer;size:word):boolean;
begin
  dwError := Send(s,buffer,size,0);
// Debug
  if(dwError = SOCKET_ERROR) then
  begin
    dwError := WSAGetLastError;
    CloseSocket(s);
    WSACleanup;
    case (dwerror) of
      //Case statement
    else
      LogToFile('Unhandled error: ' + IntToStr(dwError) + ' generated by WSASend');
    end;
    Exit(false);
  end;

// if the size of the bytes sent isn't the expected one.
  while(dwError <> size) do
    dwError:= dwError + Send(s,Ptr(cardinal(buffer) + dwError),size-dwError,0);
  Exit(true);
end;

错误发生在

dwError:= dwError + Send(s,Ptr(cardinal(buffer) + dwError),size-dwError,0);

错误是“常量对象不能作为var参数传递”

我知道我需要一个变量,但是如果没有再添加一行,我有没有办法呢?

3 个答案:

答案 0 :(得分:5)

当编译器抱怨你传递参数的方式时,你需要知道的第一件事是参数所期望的。因此,您应该查看Send的声明。如果查看声明并没有立即让您知道要修复的内容,那么您需要将该声明包含在您在问题中发布的代码中。

怀疑这实际上与增加指针无关。相反,编译器抱怨第三个参数,您尝试传递表达式size-dwError。我猜参数声明如下:

var buffersize: Word;

该函数计划为该参数提供 new 值 - 这就是var的意思 - 所以传递给该参数的东西需要是可以接收值的东西。您不能为减去两个变量的结果指定新值。

仔细看看编译器抱怨该行的位置。它没有将光标放在第三个参数附近吗?这就是存在问题的线索。

递减size,然后将其传递给函数。

Dec(size, dwError);
Inc(dwError, Send(s, Ptr(cardinal(buffer) + dwError), size, 0));

为什么要关心添加另一条线?你有没有达到当天的配额?线很便宜;当一个人不做时,不要害怕用两个来表达自己。同样适用于变量。当您的代码不起作用时,保存一两个字节根本不重要。

至少,你应该添加更多行来追踪问题的根源。如果您有一行代码正在执行多个独立计算(例如获取新指针值,获取新大小并调用函数),请将该行分成几个单独的部分。这样,如果其中一个问题和编译器抱怨有问题,你就会确切地知道应该责怪哪一个。

答案 1 :(得分:4)

正确,这不会像书面那样有效。处理var参数时,必须在将参数传递给过程/函数之前构建参数。传递Var参数时,允许该过程对其进行修改。如果您试图在通话中一起复制两个变量,那么这个结果会在哪里?

另一个问题是dwError没有被删除。类方法无权访问类定义的对象的数据元素。如果删除该类,则可以访问数据元素,但需要首先创建该类。

您应该只在输入和输出完全包含在方法中的位置使用类方法。

你是如何分配缓冲区的?内部是一个数组吗?

答案 2 :(得分:0)

听起来像Send有一个格式参数(比如send(const something; size:integer)

解决方法是使用pchar(wholepointerexpression)[0]