我试图让我的代码尽可能简单,但我失败了.
这是我的代码:
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参数传递"
我知道我需要一个变量,但是如果没有再添加一行,我是不是可以做到这一点?
当编译器抱怨您传递参数的方式时,您需要知道的第一件事是参数所期望的.因此,你应该去看看声明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)
你为什么要关心添加另一条线?你有没有达到当天的配额?线很便宜; 当一个人不做时,不要害怕用两个来表达自己.同样适用于变量.当您的代码不起作用时,保存一两个字节根本不重要.
至少,您应该添加更多行以跟踪问题的根源.如果您有一行代码正在执行多个独立计算(例如获取新指针值,获取新大小并调用函数),请将该行分成几个单独的部分.这样,如果其中一个问题和编译器抱怨有问题,你就会确切地知道应该责怪哪一个.