Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.20;
Скачать: CL | DM;

Вниз

TMemoryStream   Найти похожие ветки 

 
авыф   (2007-12-18 18:51) [0]

вызываю процедуру, делаю там что-то, возвращаю результат:
var
 frStream, fs : TMemoryStream;
 buf: string;
 outBuff: PChar;
 outLen: DWORD;
Begin
 outLen := 123;
 GetMem(outBuff, 5000000);
 frStream := TMemoryStream.Create;
 frStream.LoadFromFile(frOld);
 frStream.Seek(0, soFromBeginning);
 BuildFRT(Application.Handle, frStream.Memory, frStream.Size, outBuff, 5000000, @outLen);

 fs := TMemoryStream.Create;
 fs.SetSize(outLen);
//  fs.Read(outBuff, outLen);
 fs.ReadBuffer(outBuff, outLen);
 fs.SaveToFile("c:\t4.fr3");

 rep.LoadFromStream(fs);
 frStream.Free;
 FreeMEm(outBuff);

 rep.ShowReport();

вываливает AV на чтение в стрим. Что не так я делаю?


 
Palladin ©   (2007-12-18 18:52) [1]

ну вот собака и порылась в "делаю там что то"


 
Palladin ©   (2007-12-18 18:53) [2]

хотя может и не там, бо
fs.ReadBuffer(outBuff, outLen);
должен выглядеть как
fs.ReadBuffer(outBuff^, outLen);


 
авыф   (2007-12-18 18:55) [3]


> Palladin ©   (18.12.07 18:53) [2]

спасибо

кто этот значок придумал? убил бы!


 
Palladin ©   (2007-12-18 19:01) [4]

остынь, горячий финский парень, нужно осозновать разницу между переменной и указателем на данные, коим и является PChar


 
авыф   (2007-12-19 09:45) [5]


> Palladin ©   (18.12.07 19:01) [4]

а string - не указатель?


 
Palladin ©   (2007-12-19 09:53) [6]

String - это Compiler Magic
фактически указатель, но работать можно и как c обычной переменной, например в твоем случае можно и его использовать вместо PChar, выглядеть будет как:

var
frStream, fs : TMemoryStream;
buf: string;
outBuff: String;
outLen: DWORD;
Begin
outLen := 123;
SetLength(outBuff, 5000000);
frStream := TMemoryStream.Create;
frStream.LoadFromFile(frOld);
frStream.Seek(0, soFromBeginning);
BuildFRT(Application.Handle, frStream.Memory, frStream.Size, @outBuff[1], 5000000, @outLen);

fs := TMemoryStream.Create;
fs.SetSize(outLen);
fs.ReadBuffer(outBuff[1], outLen);
fs.SaveToFile("c:\t4.fr3");

rep.LoadFromStream(fs);
frStream.Free;
// FreeMEm(outBuff); - и это уже не нужно

rep.ShowReport();


 
Palladin ©   (2007-12-19 09:58) [7]

странно, форум сглючил...


 
авыф   (2007-12-19 10:03) [8]


> Palladin ©   (19.12.07 09:53) [6]

Не, в моем случае string не получится - эт я так, для отладки состряпал кусочек, а в реале вся эта байда в длл-ке (моя дельфа не хочет, сволочь, их отлаживать) и на ShareMem вето.


 
авыф   (2007-12-19 10:05) [9]


> Palladin ©   (19.12.07 09:53) [6]

вот именно это я и имел в виду в [3] - что компилятору "трудно догадаться", что это за тип?


 
Palladin ©   (2007-12-19 10:07) [10]

компилятору трудно! откуда он может знать твои желания? ты ему тупо сказал записать все данные начиная с адреса переменной outBuf размером outLen, именно адреса самой переменной, а не адреса на который эта переменная указывает, ты тупо сказал - он тупо и сделал!


 
авыф   (2007-12-19 10:11) [11]


> Palladin ©   (19.12.07 10:07) [10]

а как тогда со стрингом?


 
Palladin ©   (2007-12-19 10:13) [12]

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


 
авыф   (2007-12-19 10:18) [13]


> Palladin ©   (19.12.07 10:13) [12]

да, точно
спс


 
авыф   (2007-12-19 10:26) [14]

блин, засада.
как мне в вызываемой процедуре PChar"у присвоить значение типа string?
var_PChar := PChar(var_srt) - в процедуре видит нормально, а возвращать ничего не хочет


 
Palladin ©   (2007-12-19 10:34) [15]

var в параметрах укажи


 
авыф   (2007-12-19 10:36) [16]

во, блин, а какая разница-то указателю var или не var?


 
Palladin ©   (2007-12-19 10:41) [17]

большая, мля! указатель это он для тебя указатель, а для компилятора обычная перменная, указывая Var в параметрах, ты говоришь компилятору, что бы он в стек заносил не сам значение переменной, а ссылку на нее, соответственно меняя значение параметра, ты меняешь лишь значение которое находится в стеке и никак не отражается на занчении самой переменной, а если ты переменную передал по ссылке (var), то меняя значение параметра ты меняешь значение и самой переданной переменной, а указатель она или нет - абсолютно монопенисуально


 
Сергей М. ©   (2007-12-19 10:45) [18]


> авыф   (19.12.07 10:26) [14]


Возврат именно pchar-типа данных чем обоснован ?

Обычная ф-ция, возвращающая string-тип чем-то не устраивает ?


 
авыф   (2007-12-19 10:48) [19]


> Palladin ©   (19.12.07 10:41) [17]

спасибо, буду знать.

и еще, тады:
fs.ReadBuffer(outBuff, outLen) - не хочет, зараза, ничего записывать!
смотрю в файле, а там:
...
р­є
р­є
р­є
...
здесь-то что не так?


 
авыф   (2007-12-19 10:49) [20]


> Сергей М. ©   (19.12.07 10:45) [18]

да это все в длл-ке, эт, так, для примера, на sharemem мораторий


 
Palladin ©   (2007-12-19 10:50) [21]


> спасибо, буду знать.

а почитал бы любую книженцию по паскалю уже знал бы давно


> здесь-то что не так?

1 ну а outBuff у тебя какого типа?
2 где тут запись? тут чтение только


 
авыф   (2007-12-19 10:58) [22]


> а почитал бы любую книженцию по паскалю уже знал бы давно

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

outBuff у меня PChar

запись чего? файла? просто не написал fs.SaveToFile("c:\t4.fr3");


 
Плохиш ©   (2007-12-19 11:14) [23]


> авыф   (19.12.07 10:58) [22]

Запись в поток fs.


 
авыф   (2007-12-19 11:24) [24]

сорри, попутал
всем спасибо



Страницы: 1 вся ветка

Текущий архив: 2008.01.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.019 c
6-1179133249
Санек2007
2007-05-14 13:00
2008.01.20
Загрузка изображения с сайта


15-1197651799
Ekzot
2007-12-14 20:03
2008.01.20
Вопрос по лицензии Turbo Delphi.


2-1197971940
Indigo
2007-12-18 12:59
2008.01.20
Частотный букварь текста


15-1197359222
Kolan
2007-12-11 10:47
2008.01.20
Code Gear тут дисочки раздает :)


8-1172655767
DevilDevil
2007-02-28 12:42
2008.01.20
Проиграть OGG.