Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема с присваиванием stringToPointer и StringToArray


Georgiy ©   (2006-03-27 01:11:00) 

var
Buffer:pointer;
BufSize:dword;

studio:string;
t:array [0...250] of char;

BufSize:=length(studio);
GetMem(Buffer,BufSize);
Buffer:=studio+char[0]; // ???pointer and string

t:='Welcome'; // ok!
t:=t+' '+studio; // ????

попытка через бубен
1
Buffer:=@studio;

2
for a:=0 to length(studio) do begin
chr1:=copy(studio,a,1);
chrReal:=chr[1];
t[a+7]:=chrReal;
.....
вызывало ошибку в программе(


Amoeba   (2006-03-27 10:50:00) [1]

Рекомендую автору вопроса ознакомиться с этой статьей:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206


ЮЮ   (2006-03-27 10:13:00) [2]

GetMem(Buffer,BufSize);  // выделил память
Buffer:=PCHAR(Value); // указатель на выделенную память потерял, установил совсем в другое место памяти, куда, что писать, что освобождать - получишь AV


Georgiy   (2006-03-27 10:08:00) [3]

>Зачем это t:array [0...250] of char; ? Можно просто ShortString или string[250]

в procedure используется такой тип,и стоит t:='Welcome';
статическое присваивание,хочу добавить свое t:=t+' '+studio; ,но
array <>string

>Чтобы память по Buffer хранила в себе содержимое строки?
ДА!

новый код


procedure SaveDBLog(Value:string);
var
Buffer:pointer;
BufSize:dword;
begin
BufSize:=length(Value);
GetMem(Buffer,BufSize);
Buffer:=PCHAR(Value);
......использую
FreeMem(Buffer);
end;


действие делается,но валит программу с ошибкой
Runtime 204

изменив на

BufSize:=length(Value)+1;
GetMem(Buffer,BufSize);
Buffer:=PCHAR(Value+chr(0));
......использую
FreeMem(Buffer);


вызывает программа вызвала ошибку и будет закрыто(

Но всетаки работает ,Buffer пишется на диск,
SaveDBLog('test write') и в логе есть эта строка
Анализ показал,что если убрать FreeMem(Buffer);,то
ошибки нет,но строка не пишется,не пойму как это может быть


Fay   (2006-03-27 01:50:00) [4]

2 Georgiy   (27.03.06 1:11)
> BufSize:=length(studio);
> GetMem(Buffer,BufSize);
Из кода не следует, что переменная studio проинициализирована

> Buffer:=studio+char[0];
Не думаю, что это можно скомпиллировать.
Для таких случаев есть StrPCopy (кажется). Или Move.
Но, в любом случае, Памяти выделенно на 1 байт меньше, чем нужно.

> попытка через бубен
> Buffer:=@studio;
Это ещё зачем?! Ты же не думаешь, что так получишь указатель на первый символ строки?
Тогда уж
Buffer := PChar(studio);
или
Buffer := Pointer(studio); // Если studio = '', то вернёт nil

> for a:= 0to length(studio) do begin
Это ваше трындец!

> вызывало ошибку в программе(
Неужели " Обнаружено влияние космических лучей!" ?


unknown   (2006-03-27 01:41:00) [5]

Зачем это t:array [0...250] of char;? Можно просто ShortString или string[250]


Zeqfreed   (2006-03-27 01:39:00) [6]

А чего вы, собственно, добиваетесь? Чтобы память по Buffer хранила в себе содержимое строки? См. Move, а под конструкцией char[0] видимо имелось в виду #0, т.е. символ с кодом 0?


Наверх

Титульная страница Поиск, карта сайта Написать письмо