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

Iva*_*nov 1 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;
Run Code Online (Sandbox Code Playgroud)

错误发生在

dwError:= dwError + Send(s,Ptr(cardinal(buffer) + dwError),size-dwError,0);
Run Code Online (Sandbox Code Playgroud)

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

我知道我需要一个变量,但是如果没有再添加一行,我是不是可以做到这一点?

Rob*_*edy 5

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

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

var buffersize: Word;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dec(size, dwError);
Inc(dwError, Send(s, Ptr(cardinal(buffer) + dwError), size, 0));
Run Code Online (Sandbox Code Playgroud)

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

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