чёнибудь покрупнее STRING'а

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

чёнибудь покрупнее STRING'а

Сообщение itwork » 31.03.2007 14:47:09

Люди есть в паскале ченибудь покрупнее STRING'а, т.е. чтоб болше чем 255 символов влезало????
itwork
новенький
 
Сообщения: 41
Зарегистрирован: 28.12.2006 14:32:28

Сообщение Serge30 » 31.03.2007 15:11:25

Есть! AnsiString или тот же String :)

AnsiString - это динамические строки, туда можна пихать до 2Гб.

При {$H+} String стает тем же самым что и AnsiString. {$H+} устанавливается автоматом при {$mode objfpc} и {$mode delphi}.

Для этого их нужно объявлять:
Код: Выделить всё
{$mode objfpc}
var
  s: String;


Можна еще использовать PChar, правда там надо будет еще следить за выделением и освобождением памяти и пользоватся ими не совсем удобно (ИМХО).
Serge30
незнакомец
 
Сообщения: 6
Зарегистрирован: 08.01.2007 23:57:21

Сообщение alexs » 31.03.2007 15:11:30

string :-)
сйчас в string 2Г влазиет :-)))
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение itwork » 31.03.2007 16:10:20

Код: Выделить всё
{$mode delphi}
Uses
        Dos;
Var
       query: string;

PROCEDURE Init;
Begin
        writeln('content-type: text/html');
        writeln;
End;

Begin
    query:= getenv('QUERY_STRING');
    Init;
    writeln('<html>');
    writeln(query);
    writeln('</html>');
End.


теперь передаю значение
index.exe?fsdfs=dfgdfgdfgdfg dfg df gdfgdfgsdf dfgdfgdfg dfgdfgdfgdfgdfgd gfdfgdfgdg dgfgdfgdfgdf gdfgdfg dfgdfgdf gfd fgfdgdfg dgfdfg sdfgdf gdfgdfgd fgddfg dfgdf gdfgdfgdf g dgdf gg g dfg gf df gdfg dfgdfgd fgdfg g d fgdf gdf g gf gd fgd gdfgertergfrd gdfg d fgeergfdfgdf g gdfdfg sd sdffg sd gsd gsdf gsd gf s gdfsdgf gdf gsd s df gdfgdefg dfdf gdf gdf g df f sg gfdfgderergergdfgerftghgrdfggtr dr r erg dr gf dfg er 1111

но выдает вот такое (то есть обрезает строку)

fsdfs=dfgdfgdfgdfg%20dfg%20df%20gdfgdfgsdf%20dfgdfgdfg%20dfgdfgdfgdfgdfgd%20gfdfgdfgdg%20dgfgdfgdfgdf%20gdfgdfg%20dfgdfgdf%20gfd%20fgfdgdfg%20dgfdfg%20sdfgdf%20gdfgdfgd%20fgddfg%20dfgdf%20gdfgdfgdf%20g%20dgdf%20gg%20g%20

ЛЮди почему строка обрезается если она как вы говорите 2G??????????
itwork
новенький
 
Сообщения: 41
Зарегистрирован: 28.12.2006 14:32:28

Сообщение shade » 31.03.2007 18:55:14

Добавь в начале {$H+}
Если не поможет значит Dos.getenv возвращает ShortString
Используй SysUtils.GetEnvironmentVariable
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение itwork » 31.03.2007 19:08:37

shade писал(а):Добавь в начале {$H+}
Если не поможет значит Dos.getenv возвращает ShortString
Используй SysUtils.GetEnvironmentVariable


СПАСИБО за подсказку с SysUtils.GetEnvironmentVariable
itwork
новенький
 
Сообщения: 41
Зарегистрирован: 28.12.2006 14:32:28

Сообщение bw » 01.04.2007 08:12:07

Насколько я понимаю в RTL (System) String является ShortString'ом. Правильно? Т.е. все функции RTL (каких-то модулей RTL) имеющие в качестве параметров String будут работать именно со строками длиной 255 символом?

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Сообщение shade » 01.04.2007 09:50:33

bw
SysUtils в основном работает с AnsiString. Или вы склонны считать что он не относиться к RTL

То что в модуле System {$H-} это еще не значит что он не использует AnsiString.

Видимо в данном случае, для совместимости в модуле Dos используется ShortString, потому что старый код может на это полагаться.
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение bw » 01.04.2007 16:08:33

Я не вы, я ты :-).
SysUtils я не рассматривал. Собственно я говорил только о System. Кажется crt тоже компилируется с ShortString. Все же это низкоуровневые, базовые модули и они задают правила игры. SysUtils и mode objfpc все же высокоуровневые модули. И их можно либо не использовать либо заменить своими.
Собственно я не спорю и не говорю что использование ShortString в System катастрофа, просто это нужно иметь ввиду, если функция из RTL использует String, то это вероятнее всего ShortString.

p.s. Assign и ChDir, к примеру, использут строки (и следовательно допустимо не больше 255 символов).

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Сообщение Attid » 02.04.2007 13:40:18

ну раз здесь стринг обсуждается сюда добавлю:

код:
Код: Выделить всё
var str:string;
begin
  str := stdErr;
  //***--***//
end;


fMain.pas(1212,10) Error: Incompatible types: got "Text" expected "AnsiString"

что-то не пойму как мне тут приведение типов сделать ?
as string не пашет =/
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Alexander » 02.04.2007 13:51:34

Attid писал(а):str := stdErr;


Круто ! Ты хочешь к сроке присвоить текстовый ФАЙЛ.

stdErr это файловая переменная означающая стандартный вывод ошибки.

WriteLn(stdErr, 'Ku Ku');

И не думаю что из него можно читать.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 823
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение Attid » 03.04.2007 12:21:48

:oops:
это я переборщил с удалением writeln в консоль =)
надо в отпуск :roll:
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение bw » 04.04.2007 16:36:14

Не понял, нужен ли тебе этот StdErr, но на всякий случай:
Код: Выделить всё
procedure AssignMy(var f: Text);
begin
  Assign(f, '');
  TextRec(f).OpenFunc := @OpenMy;
  Rewrite(f);
end;

procedure OpenMy(var f: TextRec);
begin
  TextRec(f).InOutFunc := @WriteMy;
  TextRec(f).FlushFunc := @WriteMy;
  TextRec(f).CloseFunc := @CloseMy;
end;

...

begin
  Close(StdErr);
  AssignMy(StdErr);
...


Дальше стоит дело за реализацией указанных WriteMy и CloseMy. Сейчас понемногу портирую RTL на KolibriOS, так что немного навострился :-) в таких делах.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Сообщение alexs » 05.04.2007 00:37:19

Сейчас понемногу портирую RTL на KolibriOS

И как успехи?
и вобще стоит ли смотреть на эту ОС - поделись впечатлениями
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение bw » 05.04.2007 18:38:39

Отписал в "личное", тут об этом говорить "невтему".

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru