forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Проблемы с созданием типа данных (http://forum.boolean.name/showthread.php?t=4609)

MotoMustanger 30.09.2007 00:39

Проблемы с созданием типа данных
 
Пишу словарь itap на мобильник, но есть проблема - массивы из строк жрут много хипа. Поэтому решил создать сой тип - массив из 30 символов. Т.к. строка занимает 256 это должно увеличить количество записей почти в 10 раз. Вот код:
type
ch=array[1..30] of char;
var
sl: array[1..1000] of ch;

При компиляции вылетает ошибка:
Fatal error: Internal error #024

каким способом можно её устранить?

ViNT 30.09.2007 01:30

Re: Проблемы с созданием типа данных
 
Как я понял, ошибка не в коде, а в самом MP. Как вариант - слишком объёмный тип - попробуй сделать массив поменьше.

ARV 30.09.2007 12:24

Re: Проблемы с созданием типа данных
 
для словаря хранение строк в массиве - имхо, неудачный вариант, т.к. все равно рано или поздно наступит ограничение... вариант: хранение строк в текстовом файле в ресурсах и извлечение оттуда по мере надобности... для ускорения можно сделать много ресурсных файлов по первой букве слова, например... или даже по первым двум - тогда объем словаря будет практически безграничен, т.к. ограничений на размер файлов в ресурсах по-моему нет... а строки извлекаются оттуда поочереди, т.е. с минимумом требуемой памяти (правда с максимумом затрат времени).

MotoMustanger 30.09.2007 20:31

Re: Проблемы с созданием типа данных
 
Пробовал меньше массив 30 символов и 90 слов та же ошибка.
Цитата:

для словаря хранение строк в массиве - имхо, неудачный вариант
Хранятся они как раз в ресурсе а при запуске загружаются в массив. Если при нажатии первой буквы загружать соответствующие словари из ресурса - это займет много времени, а зачем тогда iTap если Таром можно набрать быстрее.

Видимо прийдётся загружать по несколько слов в одну строку массива(пока не закончаться символы в строке).

odd 01.10.2007 07:56

Re: Проблемы с созданием типа данных
 
Двухмерный массив объявлять не пробовал?
Var s: array[1..1000, 1..30] of char;
Всё пашет.

MotoMustanger 20.10.2007 19:41

Re: Проблемы с созданием типа данных
 
работает. но всеравно берет много хипа(на моем теле 30х3000 уже зависает как и при таком же массиве из строк) вобщем буду искать другие способы

odd 21.10.2007 09:44

Re: Проблемы с созданием типа данных
 
Лучше все слова хранить не в массиве, а в файле ресурсов (причем лучше этих файлов сделать побольше, например, для каждой первой буквы слова - отдельный файл, чтобы у каждого был маленький размер - быстрее грузиться будет). Слова хранить и обрабатывать не в UTF-8 формате, а например в Win-1251 так они меньше места занимают, а перекодировать в UTF непосредственно перед самым выводом на экран. Я так делал и в DreamExpert и в E666 и в ExtInfo. Короче, лучше метода я пока не придумал. Ещё как вариант - скинуть всё в один большой файл и загружать кадрами из него, но тут уж функции ReadLine и ReadByte не спасут, придется подключать библиотеку работы с файлами.

odd 21.10.2007 09:53

Re: Проблемы с созданием типа данных
 
А Char и есть строка из 1 буквы. Она может занимать 1 байт, а может и 2. Это ещё без учета всяких там байтов, указывающих на конец строки, типа 0x00.

Dr_midon 27.10.2007 10:56

Re: Проблемы с созданием типа данных
 
2 odd: Обьясни почему тип Char может занимать 2 байта?

Если это действиетльно Паскаль, то никаких 0x00 символов в конце строки встречаться не может. Это же не Си.
String в Паскале организован двумя типами:
- 1 байт(длинна строки): LENGTH
- 1-256 байт(собственно строка): DATA

А вот когда используется массив...ммм... сложно сказать сколько используется байт для DATA секции. ИМХО, раз тип изначально придуман как динамический массив, значит используется столько, сколько надо. А с другой стороны фрагментация памяти после использования такого типа просто ужасная будет! А как посмотреть сколько памяти потребляет мидлет не знаю.

Когда я скопировал к себе:
Цитата:

type
ch=array[1..30] of char;
var
sl: array[1..1000] of ch;
У меня все заработало, тока как юзать эту конструкцию не пойму???

jimon 27.10.2007 11:08

Re: Проблемы с созданием типа данных
 
Char в юникоде ето 2 байта

sl[23][23] из логики имхо :)

Dr_midon 27.10.2007 11:17

Re: Проблемы с созданием типа данных
 
Это точно... толькочто посчитал сколько символов в строке 'Любая кнопка - выключение'
Общая длинна 25 символов, а занимает 46 байт. Это видимо из-за юникод8 и символов типа пробела и тире.

ViNT 27.10.2007 14:00

Re: Проблемы с созданием типа данных
 
В файле в кодировке юникод 1 символ занимает 2 байта, а в памяти помоему только 1 байт, а если и 2, то всеравно нужно читать его не как два байта, а как значение типа char.

Вообще в паскале делается так:
Код:

program xxxxxx;
type
ch=array[1..30] of char;
var
sl: array[1..1000] of ch;
c:char;
begin
c:=sl[1,1];

end.

Но у меня при компиляции MP просто вылетает.

jimon 27.10.2007 14:40

Re: Проблемы с созданием типа данных
 
ViNT
блин ... масив масивов ето не масив в два измерения !
bla[1][1] и (bla[1])[1] тоже самое по идее, если лексемы нормально разбираются

ViNT 27.10.2007 15:51

Re: Проблемы с созданием типа данных
 
Цитата:

Сообщение от jimon
ViNT
блин ... масив масивов ето не масив в два измерения !
bla[1][1] и (bla[1])[1] тоже самое по идее, если лексемы нормально разбираются

Уверен?

По моему,
Код:

a:array[1..3,1..10]of char;
и
Код:

a:array[1..3]of array[1..10]of char;
и
Код:

type arr=array[1..10]of char;
var a:array[1..3]of arr;

это одно и то же, и доступ к элементам производится так:
Код:

ch:=a[1,3];
Во всяком случае, так в нормальном паскале(я проверял в Delphi)

odd 29.10.2007 09:06

Re: Проблемы с созданием типа данных
 
Как показали дампы памяти, строки хранятся в формате UTF-8 т.е. к примеру, английская буква "a" имеет код 61 (1 байт), а русская буква "a" имеет код D0 B0 (2 байта). Перед каждой строкой пишется её длина (4 байта). Байтов-указателей на конец строки нет.

ViNT 29.10.2007 09:38

Re: Проблемы с созданием типа данных
 
А какая вам разница, как выглядят данные в памяти? Вы же не собираетесь работать напоямую с дампом? Просто читаете значение типа Char, а JVM сама разберется, что и как читать.

MotoMustanger 30.10.2007 18:47

Re: Проблемы с созданием типа данных
 
Цитата:

Сообщение от odd
Лучше все слова хранить не в массиве, а в файле ресурсов (причем лучше этих файлов сделать побольше, например, для каждой первой буквы слова - отдельный файл, чтобы у каждого был маленький размер - быстрее грузиться будет). Слова хранить и обрабатывать не в UTF-8 формате, а например в Win-1251 так они меньше места занимают, а перекодировать в UTF непосредственно перед самым выводом на экран.

Дело в том, что у меня на одну цыфру припадает до 5 букв и на каждую букву по 1000 слов(это пока, потом будет еще больше). Тоесть на одну цыфру загружается 5000 слов, у меня телефон тянет 2000-3000. Если я буду записывать по несколько слов в строку (в среднем влезет слов 30) то это существенно уменьшит количество элементов в масиве. С этим надо будет повозиться.

odd 31.10.2007 08:37

Re: Проблемы с созданием типа данных
 
Ты чё там, T9 что-ли пишешь? :mda:
Ещё раз подробнее объясню как хранить слова. Допустим, у тебя англо-русский словарь. Все слова (с переводом) на букву a хранятся в файле под названием a.txt, все слова на букву b - b.txt. Пользователь пишет слово, ты от него отрезаешь первую букву (например, так: fname:='/'+GetChar(str,0)+'.txt') и уже потом открываешь нужный файл и ищеш строку уже там причем для экономии памяти можно искать без первой буквы (и слова там хранятся без первой буквы). Если слов в файле 5000(поиск идёт где-то 1 сек - у меня. я это считаю тормозами) и больше, то дроби файлы дальше. Т.е. все слова на ab хранятся в файле ab.txt и т.д. Файлов будет конечно дофига и больше, но зато поиск потом будет летать. Кстати, обрати особое внимание на символ перехода на новую строку(ставится в конце каждой строки). В Windows это 0D0A (2 байта), для нормальной же работы программы хватит и просто 0D (1 байт). Кажется, подумаешь - один байт, а если строк 100.000, то и набегает 100 Кб лишних.

IDOL 1234 28.11.2009 19:27

Ответ: Проблемы с созданием типа данных
 
MP вылетает при попытке обращения к двумерному массиву
a[1,1]:=9;

ViNT 28.11.2009 20:50

Ответ: Проблемы с созданием типа данных
 
Массив неквадратный?
MP неквадратные массивы не поддерживает.
Для этого есть библиотека Lib_array2d.


Часовой пояс GMT +4, время: 05:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot