Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.044 c
15-1197971177
ArtemESC
2007-12-18 12:46
2008.01.20
А у вас такой же ребёнок?


15-1197452705
DelphiN!
2007-12-12 12:45
2008.01.20
Алгоритм вычисления, максимального колличества пересечений времен


1-1192715378
Still Swamp
2007-10-18 17:49
2008.01.20
Мои Messages


15-1197349485
AntiPupkin
2007-12-11 08:04
2008.01.20
Скажите правду?


2-1198127548
DimonS
2007-12-20 08:12
2008.01.20
Рисование, TImage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский