2015-07-01 9 views
0

Я хочу разбить строку в X partstrings.Delphi Разделить строку с CopyMemory в части с помощью смещения

Это мой код до сих пор:

procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer); 
var 
    i, Rest, partSize: integer; 
    tmp: AnsiString; 
begin 
    Rest := len mod numberParts; 
    SetLength(a, numberParts); 
    partSize := (len - Rest) div numberParts; 
    numberParts := numberParts - 1; 
    for i := 0 to numberParts do 
    begin 
    // Get access violation here 
    CopyMemory(@a[i][1], @filestring[i * partSize], partSize); 
    end; 
    if Rest <> 0 then 
    CopyMemory(@a[numberParts][numberParts*partSize], @filestring[numberParts*partSize], Rest); 
end; 

Я получаю нарушение прав доступа на этой линии:

CopyMemory(@a[i][1], @filestring[i * partSize], partSize); 

Я не уверен, где именно получает вызвавшую ошибку. Как получить адрес a [i], sin't it @a [i] [1]? и вызывает ошибку в любом случае, когда он пытается получить доступ к @filestring [i * partSize] в первом цикле, потому что это будет 0?

Надеюсь, кто-то может мне это объяснить.

Благодаря

+0

Почему вы используете функцию Win32 'CopyMemory()' вместо того, чтобы использовать собственную функцию 'Copy()' Delphi? Вы неправильно используете «CopyMemory()», поэтому вы получаете ошибки. –

ответ

2

Ваш код слишком сложный для того, что вы пытаетесь. Попробуйте этот простой код вместо:

// assuming StringArray is "array of (Ansi)String"... 
procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer); 
var 
    i, partSize: integer; 
begin 
    partSize := len div numberParts; 
    SetLength(a, numberParts); 
    for i := 0 to numberParts-1 do begin 
    a[i] := Copy(filestring, (i * partSize)+1, partSize); 
    end; 
end; 

На последней итерации, Copy() усечет возвращенную подстроку для вас, если запрошенный отсчета более доступное количества символов в соответствии с требуемым смещением.

1

Я вижу три основные проблемы:

  • Overtangled подсчета части приводит к ошибкам в определении длины массива.
  • Вы должны добавить 1 для надлежащего решения AnsiString символов:
  • должны установить длину строки назначения

    for i := 0 to numberParts {probably - 1} do begin SetLength(a[i], partSize); CopyMemory(@a[i][1], @filestring[i * partSize + 1], partSize); end;

че же верно и для последней обработки штучных

+0

О, спасибо большое! ** @ filestring [i * partSize + 1] ** эта часть я заметил сам, но я полностью забыл SetLength(). Спас мой день! Но число-части вычитаются -1 выше;) – nemoest