Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2009, 22:10   #1
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
Вопрос Лимит на строки и массивы?

Правда ли что в дельфи строки string ограничены 255 символами?..
Правда, что цикл for может пройти только до 256 итераций?
Хотелось бы использовать строки динамически, как в С, через указатели.
И как лучше выделять память (аналог malloc в С?) и ориентироваться в ней?
BaronTreep вне форума Ответить с цитированием
Старый 01.06.2009, 22:28   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Цитата:
Правда ли что в дельфи строки string ограничены 255 символами?..
нет
Цитата:
String types

Type Maximum length Memory required Used for
ShortString 255 characters 2 to 256 bytes Backward compatibility
AnsiString ~2^31 characters 4 bytes to 2GB 8-bit (ANSI) characters, DBCS ANSI, MBCS ANSI, Unicode characters, etc.
UnicodeString ~2^30 characters 4 bytes to 2GB Unicode characters, 8-bit (ANSI) characters, multi-user servers and multi-language applications
WideString ~2^30 characters 4 bytes to 2GB Unicode characters; multi-user servers and multi-language applications. UnicodeString generally preferred
Для D2009:
Цитата:
On the Win32 platform, the compiler interprets string (when it appears without a bracketed number after it) as UnicodeString.
Цитата:
Правда, что цикл for может пройти только до 256 итераций?
нет
Цитата:
Integer -2147483648..2147483647 signed 32-bit
для выделения памяти можно использовать много вариантов:
Цитата:
StrAlloc allocates a buffer for a null-terminated string with a maximum length of Size - 1 (1 byte must be reserved for the termination character). The result points to the location where the first character of the string is to be stored. A 32-bit number giving the total amount of memory allocated is stored in the four bytes preceding the first character; it is equal to Size + 4. If space for a string is allocated with StrAlloc, it should be deallocated via StrDispose.

Because AnsiStrings (long strings) are implicitly null terminated and dynamically allocated, the use of StrAlloc is deprecated.
Цитата:
StrNew allocates a copy of Str on the heap.

If Str is nil (Delphi) or NULL (C++) or points to an empty string, StrNew returns a pointer to a new empty string.

Otherwise, StrNew makes a duplicate of Str, obtaining space with a call to StrAlloc, and returns a pointer to the duplicated string.

The allocated space is the length of Str + 5 bytes.
Цитата:
GetMem allocates a block of the given Size on the heap, and returns the address of this memory in parameter P. The bytes of the allocated buffer are not set to zero. To dispose of the buffer, use FreeMem. If there isn't enough memory available to allocate the block, an EOutOfMemory exception is raised.

Note: If the memory needs to be zero-initialized, use AllocMem instead.
Цитата:
AllocMem allocates a block of the given Size on the heap, and returns the address of this memory. Each byte in the allocated buffer is set to zero. To dispose of the buffer, use FreeMem. If there isn't enough memory available to allocate the block, an EOutOfMemory exception is raised.

Note: If the memory does not need to be zero-initialized, it is more efficient to use GetMem instead.
Цитата:
GetMem allocates a block of the given Size on the heap, and returns the address of this memory in parameter P. The bytes of the allocated buffer are not set to zero. To dispose of the buffer, use FreeMem. If there isn't enough memory available to allocate the block, an EOutOfMemory exception is raised.

Note: If the memory needs to be zero-initialized, use AllocMem instead.
И все это, заметьте, в справке )
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 01.06.2009, 23:12   #3
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Код:
i : integer;
for i:=1 to 777 do inc(i);
Цитата:
assigment to FOR-loop variable 'i'
:-( Delphi 7. Как решать?

Последний раз редактировалось BaronTreep; 02.06.2009 в 00:01.
BaronTreep вне форума Ответить с цитированием
Старый 01.06.2009, 23:17   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

В цикле по i нельзя изменять саму i...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 02.06.2009, 00:03   #5
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Да, вспомнил, это в Delphi5 было ограничение на длину строки.

Последний раз редактировалось BaronTreep; 02.06.2009 в 00:25.
BaronTreep вне форума Ответить с цитированием
Старый 02.06.2009, 00:04   #6
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
В цикле по i нельзя изменять саму i...
Тоже нехилое ограничение... Всем спасибо!
BaronTreep вне форума Ответить с цитированием
Старый 02.06.2009, 01:11   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Тоже нехилое ограничение...
во-первых, это не ограничение. Это компилятор пытается помочь нерадивому программисту не сделать очевидные ошибки.
Пример.
сколько раз выполнится цикл
Код:
for i:=1 to 3 do <тут какой-то оператор>
??
а сколько раз выполнится цикл:
Код:
for i:=1 to 3 do i:=1;
??
во-вторых, это легко обходится.
в третьих, берите цикл repeat... until или while ... do и меняйте в теле цикла что хотите и как хотите!

Цитата:
Да, вспомнил, это в Delphi5 было ограничение на длину строки.
ошибаетесь! в Дельфи5 строка ( :string) по умолчанию равна AnsiString (это 2GB - т.е. 2 миллиона символов). Правда, есть и ShortString, они действительно 255 байт максимально вмещают.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.06.2009, 02:24   #8
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

У меня старый Delphi 5 Inerprise (Borland (c) 1999) под боком, определение глобальной:

s :string = <далее слишком много символов>;

не работает.

...
Я не спорю
...

Ещё вопрос по памяти: даже когда пишешь под winapi при запуске процессу выделяется 1-2 mb, как самому определять этот размер? Как уложиться в 50 кб, например.

Последний раз редактировалось BaronTreep; 02.06.2009 в 05:26.
BaronTreep вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Excel и лимит 8192 символа в ячейку Tns Microsoft Office Excel 0 07.01.2009 12:42
Лимит на Интернет? Detka Свободное общение 5 25.08.2008 07:20