Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.07.2011, 00:26
Hellion Hellion вне форума
Прохожий
 
Регистрация: 19.07.2011
Сообщения: 8
Репутация: 10
По умолчанию Функция преобразования строки в целочисленный массив

Пишу функцию, которая преобразует строку в целочисленный массив и возвращет его. В качестве параметров функция принимает строку и разделитель.Основная проблема-это возвращаемое значение.
1) Создавал отдельный пользовательский тип, создавал массив указанного типа и записывал в него, но возникли сложности с преобразованием строки к пользовательскому типу-Delphi7 не хочет преобразовывать строку к пользовательскому типу.
2) Создавал отдельный пользовательский тип, отдельный массив и и пробовал через переменную-посредника типа Variant запихнуть значения в массив-резуьтат тот же, что и в п.1
Подскажите пожалуйста, как можно решить проблему возвращаемого значения.
Ответить с цитированием
  #2  
Старый 20.07.2011, 00:30
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Код твой давай. Там посмотрим
Ответить с цитированием
  #3  
Старый 20.07.2011, 00:42
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Чего проще, объяви динамический массив и наращивай его по мере надобности.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #4  
Старый 20.07.2011, 00:49
Hellion Hellion вне форума
Прохожий
 
Регистрация: 19.07.2011
Сообщения: 8
Репутация: 10
По умолчанию

Код:
type
 int_arr:array of integer;
end;

function parse_string_to_array(parsing_str,splitter:string):int_arr;
   var
     i,counter,str_length:integer;
     generated_arr:int_arr;
     temp_str:string;
     v:variant;
   begin
     counter:=1;
     Setlenght(generated_arr,counter);
     str_length:=length(parsing_str);
     for i:=1 to (str_length)+1 do
     begin
       if(parsing_str[i]<>splitter) and (parsing_str[i]<>#0) then
       begin
         temp_str:=temp_str+parsing_str[i];
       end
       else
       begin
         v:=temp_str;
         generated_arr[counter]:=v;
         v:='';
         inc(counter);
         SetLenght(generated_arr,counter);
       end;
     end;
   end;
Ответить с цитированием
  #5  
Старый 20.07.2011, 00:53
Hellion Hellion вне форума
Прохожий
 
Регистрация: 19.07.2011
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Чего проще, объяви динамический массив и наращивай его по мере надобности.
Дык я так и сделал.Проблема в преобразовании типов. Т.е. когда я в цикле бегу по строке,пишу в переменную текущее значение и пытаюсь запихнуть его в массив, то у меня возникает AV
Ответить с цитированием
  #6  
Старый 20.07.2011, 00:54
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну и строку до кучи давай.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 20.07.2011, 00:56
Hellion Hellion вне форума
Прохожий
 
Регистрация: 19.07.2011
Сообщения: 8
Репутация: 10
По умолчанию

9,6,4,12,5,2,6,5,7,5,3,11,10,5,10,7
Ответить с цитированием
  #8  
Старый 20.07.2011, 01:13
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Примерно так:
Код:
type
  int_arr = array of Integer;

function TForm2.Parse_string_to_array(parsing_str, splitter : String) : int_arr;
var
  I, Count, str_length : Integer;
  generated_arr : int_arr;
  temp_str : String;
  v : variant;
begin
  SetLength(generated_arr, 0);
  Result := generated_arr;
  if parsing_str = '' then
    Exit;

  Count := 1;
  temp_str := '';
  SetLength(generated_arr, Count);
  str_length := Length(parsing_str);
  for I := 1 to str_length + 1 do
  begin
    if (parsing_str[i] <> splitter) and (parsing_str[i] <> #0) then
      temp_str := temp_str + parsing_str[i]
    else
    begin
      v := temp_str;
      generated_arr[Count - 1] := v;
      v := '';
      temp_str := '';
      inc(Count);
      SetLength(generated_arr, Count);
    end;
  end;
  Result := generated_arr;
end;

procedure TForm2.Button3Click(Sender: TObject);
var
  arr : int_arr;
begin
  arr := Parse_string_to_array('9,6,4,12,5,2,6,5,7,5,3,11,10,5,10,7', ',');
end;
Всё работает, никаких AV я не получил.
Ааа..., так там у тебя ошибочка была при обращении к массиву, выход за пределы диапазона.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 20.07.2011 в 01:15.
Ответить с цитированием
  #9  
Старый 20.07.2011, 01:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Лучше маленько изменить код:
Код:
...
      SetLength(generated_arr, Count);
      v := temp_str;
      generated_arr[Count - 1] := v;
      v := '';
      temp_str := '';
      inc(Count);
...
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 20.07.2011, 01:23
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Код:
type
  TMass = array of integer;

function parse(inputString, delimiter: string): TMass;
var
 i: integer;
 M: TMass;
begin
 SetLength(M, 0);
 inputString := Trim(inputString) + delimiter;
 i := Pos(delimiter, inputString);
 while i <> 0 do begin
   SetLength(M, Length(M) + 1);
   M[High(M)] := StrToInt(Trim(Copy(inputString, 1, i - 1)));
   Delete(inputString, 1, i);
   i := Pos(delimiter, inputString);
 end;
 Result := M;
end;
Ответить с цитированием
  #11  
Старый 20.07.2011, 05:40
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Запользуй регэкспы
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #12  
Старый 20.07.2011, 08:45
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

можно ещё memo использовать
PHP код:
function toarr(sstringform1twincontrol): tmass;
var
  
mTMemo;
  
iinteger;
begin
  m 
:= TMemo.Create(Form1);
  
m.Parent := Form1;

  
m.Lines.Delimiter := ',';
  
m.Lines.DelimitedText := s;

  
setlength(resultm.Lines.Count);
  for 
:= 0 to  m.Lines.Count-do
    
result[i] := StrToIntDef(m.Lines[i], -1);
  
m.free;
end
Ответить с цитированием
  #13  
Старый 20.07.2011, 15:39
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Pyro
можно ещё memo использовать
PHP код:
function toarr(sstringform1twincontrol): tmass;
var
  
mTMemo;
  
iinteger;
begin
  m 
:= TMemo.Create(Form1);
  
m.Parent := Form1;

  
m.Lines.Delimiter := ',';
  
m.Lines.DelimitedText := s;

  
setlength(resultm.Lines.Count);
  for 
:= 0 to  m.Lines.Count-do
    
result[i] := StrToIntDef(m.Lines[i], -1);
  
m.free;
end
Может не мемо, а СтрингЛист?

З.Ы. Уж больно код твой дикий
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #14  
Старый 20.07.2011, 15:39
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Pyro
можно ещё memo использовать
PHP код:
function toarr(sstringform1twincontrol): tmass;
var
  
mTMemo;
  
iinteger;
begin
  m 
:= TMemo.Create(Form1);
  
m.Parent := Form1;

  
m.Lines.Delimiter := ',';
  
m.Lines.DelimitedText := s;

  
setlength(resultm.Lines.Count);
  for 
:= 0 to  m.Lines.Count-do
    
result[i] := StrToIntDef(m.Lines[i], -1);
  
m.free;
end
Может не мемо, а СтрингЛист?

З.Ы. Уж больно код твой дикий
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #15  
Старый 26.07.2011, 00:49
Hellion Hellion вне форума
Прохожий
 
Регистрация: 19.07.2011
Сообщения: 8
Репутация: 10
По умолчанию

Только только добрался до Интернета.Всем ОГРОМНОЕ СПАСИБО. Заработало!!!!!!!!!!!!!!!!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter