Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.035 c
1-1104085242
гость
2004-12-26 21:20
2005.01.16
реестр


1-1104653006
speed
2005-01-02 11:03
2005.01.16
ссылки в Delphi


10-1080775305
big_bugzy
2004-04-01 03:21
2005.01.16
Подскажите, почему ком-приложение не запускается в Win98?


3-1102885906
m-a-x
2004-12-13 00:11
2005.01.16
связь многие-ко-многим


14-1104378641
Steepe Wolf
2004-12-30 06:50
2005.01.16
Посмотрите сайтик





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский