2015-09-07 5 views
0

Мне нужно изменить строку pchar во время выполнения. Помогите мне с этим кодом:delphi изменить pchar во время выполнения

var 
    s:pChar; 
begin 
    s:='123123'; 
    s[0]:=#32; // SO HERE I HAVE EXCEPTION !!! 
end. 

Теперь у меня есть исключение в Delphi 7! В моем проекте не используются встроенные строки pascal (нет классов windows.pas и т. Д.)

ответ

0

Вы можете:

procedure StrCopy(destination, source: PChar); 
begin 
    // Iterate source until you find #0 
    // and copy all characters to destination. 
    // Remember to allocate proper amount of memory 
    // (length of source string and a null terminator) 
    // for destination before StrCopy() call 
end; 

var 
    str: array[0..9] of Char; 
begin 
    StrCopy(str, '123123'); 
    s[0]:=#32; 
end. 
+0

Вы можете передать str прямо в StrCopy в третьем блоке. Asker не использует библиотеки, хотя поэтому не может использовать ни один из первых трех блоков кода. Последний блок такой же, как и в вопросе. Не удалось выполнить ошибку времени выполнения по причинам, которые я объяснил в своем ответе. –

+0

1 пример не будет работать, потому что нет getMem и memoryManagement. 2,3, потому что нет strCopy. 4 отправил меня в исключение :( –

+0

Argh ... Извините. Если вам нужно написать код без каких-либо стандартных модулей и без использования строк pascal, вы должны реализовать свой собственный StrCopy (как писал DH). Разве это не вид из домашней работы или что-то?!? – g2mk

1

Строковые литералы доступны только для чтения и не могут быть изменены. Следовательно, ошибка времени выполнения. Вам нужно будет использовать переменную.

var 
    S: array[0..6] of Char; 
.... 
// Populate S with your own library function 
S[0] := #32; 

Поскольку вы не используете библиотеку времени выполнения Delphi вы должны придумать свои собственные функции для заполнения массивов символов. Например, вы можете написать свой собственный StrLen, StrCopy и т. Д. Вам нужно будет сделать версии, которым передаются длины буфера назначения, чтобы гарантировать, что вы не переполняете упомянутые буферы.

Конечно, использование встроенного строкового типа будет неудобно. Возможно, вам придется придумать нечто более мощное, чем специальные массивы символов.

+0

так, как я могу написать некоторые, как этот: вар S: массив [0..1024] из Чар; ... s: = '123123'; –

+0

Вы не можете. Вы должны написать свою собственную функцию копирования, как я объяснил. Напишите свой собственный StrCopy, но убедитесь, что он имеет параметр len, чтобы остановить переполнение буфера. –

+0

Хорошо. Я хочу мечтать о функции, которая копирует байты из (может быть массивом) в pchar ... (когда у меня нет getmem) –

Смежные вопросы