Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизЧто-то с памятью моей стало, то, что было не со мной помню. Найти похожие ветки
← →
Pavelkq (2004-12-28 12:27) [0]В ходе выполнения фуркции ее результат вдруг заполняется абракадаброй. Задача нестандартная, но проблема уже не первый раз вылезает. Вот сама функция:
Function GetName(s:string;l:integer): MyArray;
var Temp,BeginName1,BeginName2: Array[0..10] of char;
Temp1,Lev1: Array[0..4] of char;
Txt2Item: string;
i,i1,i2,i3,d: integer;
begin
d:=0;
BeginName1:=(#0+#0+#0+"ã"+#4+#0+#0+#$1E+#0+#0+#0);
BeginName2:=(#0+#0+#0+#$1E+#$10+#0+#0+#1+#0+#0+#0);
Lev1:=(#0+#30+#0+#0+#0);
for i:=1 to L-9 do
begin
temp:="";
For i1:=i to i+10 do
temp[i1-i]:=s[i1]; // 10 символов сравниваем с типом.
if temp=BeginName1 then
begin
Txt2Item:="";
for i1:=i+15 to L do
begin
if s[i1]=#0 then Break;
Txt2Item:=Txt2Item+s[i1];
end;
//******************* Глюкавый код ********************
if d=0 then //*
begin //*
i2:=i1; //*
Temp1:=""; //*
while Temp1<>Lev1 do //*
begin //*
for i3:=i2 to i2+5 do //*
Temp1[i3-i2]:=s[i3]; //*
inc(i2); //*
if i2>(L+15) then //*
Break ; //*
end; //*
end; //*
//*****************************************************
Result.A[d]:=Txt2Item;
inc(d);
end;
end;
end;
Если заремить глюкавый код, то все работает изуметильено. Однако, если выполнить его по шагам и наблюдать Result после каждого шага, то в мемент, когда заканчивается цикл по I3 (в первй же раз) Result заполняется набором каши. Причем, его размер вопреки типу становится неизвестной длинны. Да, вот описание типа:
Type
MyArray = record
A: array[0..3] of string;
end;
Просто мне надо, чтобы функция возвращала не одно значение, а 4.
А что касается проблемы, то раньше я ее обходил вводя глобальную переменную нужного типа и превращением функции в процедуру. А как надо?
← →
GrayFace © (2004-12-28 12:38) [1]Pavelkq (28.12.04 12:27)
Просто мне надо, чтобы функция возвращала не одно значение, а 4.
Добавь 3 var строки, а лучше 4 var параметра, а result - Boolean - удалось или нет.
Pavelkq (28.12.04 12:27)
А что касается проблемы, то раньше я ее обходил вводя глобальную переменную нужного типа и превращением функции в процедуру. А как надо?
Если бы я знал, что ты хочешь сделать, мог бы что-то посоветовать или свой бы код написал - твой очень не оптимален.
← →
Pavelkq (2004-12-28 12:53) [2]Задача следующая, имею строку из абракадабры. Я ее предварительно считал из файла *.doc.
1. Затем, я ищу в этой строке последовательностьBeginName1
. Если нашел, это значит, что через 5 символов после этой последовательности идет нужный мне текст. Оканчивается он символом#0
.
2. Затем за этим текстом через несколько символов идет последовательностьLev1
. После этой последовательности идет второй нужный мне текст, который тоже завершается#0
.
3. Далее снова ищу последовательностьBeginName1
за которой идет третий нужный текст.
4. И, наконец, ищу последовательностьBeginName2
(это в данной функции я успел удалить) за которой следует дубликат первого искомого текста.
По хорошему, мне нужно будет еще написать функцию, которая может любой из текстов заменить.
Увы, мой код действительно не оптимален. Но что за клюки с результирующим массивом?
← →
BFG9k (2004-12-28 13:59) [3]Функции Pos и StringReplace помогут тебе. Если doc формируешь ты сам - используй PageProducer закладки Internet (он работает с тегами вида <#...>). Еще есть регулярные выражения.
← →
Pavelkq (2004-12-28 14:20) [4]Увы, стандартные строковые функции не понимают подобной последовательности символов. StringReplace я пробовал, результат никакой. Я как-то уже писал, что copy(s,i,1) не равно s[i].
← →
Sha © (2004-12-28 14:30) [5]Глюки у тебя начинаются гораздо раньше:
temp:="";
For i1:=i to i+10 do
temp[i1-i]:=s[i1]; // 10 символов сравниваем с типом.
У каких символов в temp ты пытаешься поменять значения этим кодом? Там нет ни одного.
Переписать все нафиг!
← →
Pavelkq (2004-12-28 14:36) [6]temp, если вы заметили - это массив из символов.
Первая строка очищает массив (это в принципе добавил уже позже, когда никак не мог избавиться от глюков, думал поможет).
Далее в цикле заполняю массив temp символами из строковой переменной s по одному. А что непонятного? Ваши предложения?
← →
Александр Иванов © (2004-12-28 14:42) [7]Я как-то уже писал, что copy(s,i,1) не равно s[i].
Это как? Или не всегда равно, только когда длина строки меньше i?
← →
Pavelkq (2004-12-28 14:47) [8]Меня ломает смотреть из чего сделана функция copy, но скорее всего так по памяти пробегается и вынимает c i-го символа. Если на пути встетится символ конца строки (#0), то функция отсылает нафиг. А вот конструкция s[i] напрямую обращается к памяти, где лежит данный символ.
← →
Sha © (2004-12-28 14:58) [9]> Pavelkq (28.12.04 14:36) [6]
Погорячился.
Не заметил, что temp - это массив, а не строка.
i1 не определено после этого куска:for i1:=i+15 to L do
begin
if s[i1]=#0 then Break;
Txt2Item:=Txt2Item+s[i1];
end;
← →
Один из местных (2004-12-28 15:17) [10]
> for i3:=i2 to i2+5 do //*
> Temp1[i3-i2]:=s[i3];
А почему с Temp1[0] начинаешь?
← →
begin...end © (2004-12-28 15:28) [11]> [10] Один из местных (28.12.04 15:17)
А почему бы ему и не начинать с Temp1[0] ?
← →
Pavelkq (2004-12-28 15:53) [12]Так приятнее... или так принято. Можно, конечно и с третьего, но мороки много.
← →
Sha © (2004-12-28 16:13) [13]> begin...end © (28.12.04 15:28) [11]
Тогда зачем кончает пятым? :)
← →
begin...end © (2004-12-28 16:42) [14]> [13] Sha © (28.12.04 16:13)
Да, кончает плохо :-)
> Pavelkq
Проблема решена?
← →
Sha © (2004-12-28 18:17) [15]> begin...end © (28.12.04 16:42) [14]
У него что-то с памятью.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.032 c