我需要将一些代码从FreePascal移植到C.我是一名专业的C开发人员但对Pascal一无所知.大多数代码都可以轻松移植,但是一行代表让我很头疼.究竟应该做什么:
New(newBack);
curBackPtr^ := newBack;
curBackPtr := @(newBack^.next);
Run Code Online (Sandbox Code Playgroud)
让我感到困惑的是,在没有被访问的情况下newBack分配给它curBackPtr并在其之后分配的事实.那么第一个任务是不是多余的,可以安全地删除?或者我在这里遗漏了什么?newBack.nextcurBackPtrcurBackPtr
我需要解析 RAM 转储以获取MFT记录(来自NTFS文件系统)。
我过去做过一些关于读取多个文件的标头(使用 FileSearcher 类等)的编程,但我不完全确定如何从大文件的开头开始读取,通读它,然后当找到某个值时,我需要从找到魔术值的点开始读取 1024 个字节(FILE0在 MFT 条目的情况下),并使用该值和 1024 字节范围末尾之间的值进行“操作” 。然后它需要继续搜索下一个FILE0记录。
到目前为止,我有以下内容 - 我的意图是它读取源文件(这是一个 TFileStream)以查找“FILE0”。当它找到它时,在这个阶段我只想报告它已经找到一条记录并输出位置,但在适当的时候我需要它从找到 FILE0 的点读取一系列字节:
type
MFTRecordsStore = packed record
FILE0MagicMarker: array[0..4] of byte;
// Lots more follow....
end;
var
MFTHeaderArray : MFTRecordsStore;
FILE0Present : string;
i : integer;
begin
SourceFile.Position := 0;
while (SourceFile.Position < SourceFile.Size) do
begin
SourceFile.ReadBuffer(MFTHeaderArray, SizeOf(MFTHeaderArray));
for i := 0 to 4 do
FILE0Present := FILE0Present + IntToHex(MFTHeaderArray.FILE0MagicMarker[i], 2);
if FILE0Present = 'FILE0' …Run Code Online (Sandbox Code Playgroud) 使用FreePascal(或Delphi,如果没有FP示例),给定一个2048字节的缓冲区作为"字节数组",如何在缓冲区中搜索"StringA"?
var
Buffer : array[1..2048] of byte;
...
repeat
i := 0;
BlockRead(SrcFile, Buffer, SizeOf(Buffer), NumRead);
// Now I want to search the buffer for "StringA"?
...
Run Code Online (Sandbox Code Playgroud)
谢谢
我尝试按照安装Indy10和Lazarus的说明进行操作.下载Indy 10下载后,使用正确的密码我只看到Delphi代码,没有名为lazarus或freepascal的文件夹.Indy10的Lazarus版本已被删除吗?
本质上,这是关于Pascal(FPC)中的递归数据结构的问题.正如我想在SICP第4章中所示实现一个Scheme解释器,这个问题也可能与Schemers有关.:)
S表达式应表示为标记数据.到目前为止,我已经构建了一个变体记录,它代表了数字和对.希望代码是可读的和不言自明的:
program scheme;
type
TTag = (ScmFixnum, ScmPair);
PScmObject = ^TScmObject;
TScmObject = record
case ScmObjectTag: TTag of
ScmFixnum: (ScmObjectFixnum: integer);
ScmPair: (ScmObjectCar, ScmObjectCdr: PScmObject);
end;
var
Test1: TScmObject;
Test2: TScmObject;
Test3: TScmObject;
function MakeFixnum(x: integer): TScmObject;
var
fixnum: TScmObject;
begin
fixnum.ScmObjectTag := ScmFixnum;
fixnum.ScmObjectFixnum := x;
MakeFixnum := fixnum;
end;
function MakePair(car, cdr: PScmObject): TScmObject;
var
pair: TScmObject;
begin
pair.ScmObjectTag := ScmPair;
pair.ScmObjectCar := car;
pair.ScmObjectCdr := cdr;
MakePair := pair;
end;
begin
Test1 := MakeFixnum(7);
writeln('Test1, Tag: …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
procedure Test;
var
MyPCharArray: array of PChar;
begin
SetLength(MyPCharArray, 3);
GetMem(MyPCharArray[0], 5);
GetMem(MyPCharArray[1], 5);
GetMem(MyPCharArray[2], 5);
StrCopy(MyPCharArray[0], 'test');
StrCopy(MyPCharArray[1], 'abcd');
StrCopy(MyPCharArray[2], '1234');
// Are these necessary?
FreeMem(MyPCharArray[0], 5);
FreeMem(MyPCharArray[1], 5);
FreeMem(MyPCharArray[2], 5);
end;
Run Code Online (Sandbox Code Playgroud)
是否应手动释放已分配的元素,否则编译器将在MyPCharArray超出范围时自动释放数组元素?
我有一些用Lazarus / FreePascal编写的使用Synapse IMAPSend库单元的代码。我尝试通过SSL(IMAPS)登录到IMAP服务器,但调用Login失败。
我试过检查异常-没有抛出异常。
除了与适当的服务器和端口的TCP三向握手之外,Wireshark没有显示任何内容。
这是代码
function GetImapResponse(host, port, user, pass:String): String;
var
response: String = '';
imap: TIMAPSend;
no_unseen: integer;
begin
imap := TIMAPSend.create;
try
imap.TargetHost := host; //'10.0.0.16';
imap.TargetPort := port; //'993';
imap.UserName := user; //'red';
imap.Password := pass; //'********';
imap.AutoTLS := false;
imap.FullSSL := true;
response := response + 'IMAP login to '+user+'@'+host+':'+port+' ... ';
if imap.Login then
begin
response := response + 'Logged in OK. ';
// How many …Run Code Online (Sandbox Code Playgroud) 以下内容无法编译:
and rax, $7FFFFFFFFFFFFFFF
Run Code Online (Sandbox Code Playgroud)
我已经尝试将值设为常量,甚至将其作为qword投射,但编译器会抛出"dword值超出界限".
当然,这是一个qword,而不是dword.如何让编译器实现这一点?
请注意,64位代码正在编译并正确运行.
我有最新的Lazarus版本.
我想要默认的 http 错误代码 500。
我不能覆盖构造函数(我找到了一些关于它的文档,但编译器说There is no method in an ancestor class to be overridden: "constructor HttpError.Create(const AnsiString);)
我试图添加Default 500到状态属性定义,但它也不起作用(我看到 0)。
500默认情况下,我如何为状态实现价值?
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
program test;
uses
SysUtils;
Type
{:Base http exception}
HttpError = class(Exception)
private
FStatus: Integer;
published
property Status: Integer Read FStatus Write FStatus Default 500;
end;
begin
try
Raise HttpError.Create('Ooops');
except
on e: HttpError do
WriteLn(e.Status);
end;
end.
Run Code Online (Sandbox Code Playgroud) 我的目标是有一个Delphi(或freepascal)代码,它将像这样调用C函数func:
C/Cuda文件:
/* this is the "progcuda.cu" file */
#include <stdio.h>
__global__ void foo(int *a, int *b, int *c, int n){
/*
add all the vector's element
*/
}
void func(int *a, int *b, int *c,int n){
int *da,*db,*dc;
cudaMalloc(&da, n*sizeof(int));
cudaMalloc(&db, n*sizeof(int));
cudaMalloc(&dc, n*sizeof(int));
cudaMemcpy(da,a,sizeof(int)*n,cudaMemcpyHostToDevice);
cudaMemcpy(db,b,sizeof(int)*n,cudaMemcpyHostToDevice);
cudaMemcpy(dc,c,sizeof(int)*n,cudaMemcpyHostToDevice);
foo<<<1,256>>>(da,db,dc);
cudaMemcpy(c,dc,sizeof(int),cudaMemcpyDeviceToHost);
/* do other stuff and call another Host and Device functions*/
return;
}
Run Code Online (Sandbox Code Playgroud)
pascal主文件:
// this is the "progpas.pas" file
program progpas;
{$mode objfpc}{$H+}
uses unitpas;
var
... …Run Code Online (Sandbox Code Playgroud)