我试图让我的代码尽可能简单,但我失败了。
这是我的代码:
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参数传递”
我知道我需要一个变量,但是如果没有再添加一行,我有没有办法呢?
答案 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]