Помощь - Поиск - Пользователи - Календарь
Полная версия: Команды из php в Паскаль
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
dosuglist
Доброго времени! Подскажите, как реализовать данные строчки на Паскале. На php получилось написать. С Паскалем еще несильно знаком.

Код
$new_arr = array();
$text = explode(",",$comb[$z]);
$vol = "<".$text[$i].">";
array_push($new_arr,$vol);


Данные строки создают массив и в него сохраняют все элементы строки, разделенными определенным знаком, в данном случае запятой.
Lapp
Цитата(dosuglist @ 24.04.2011 19:12) *
Доброго времени! Подскажите, как реализовать данные строчки на Паскале. На php получилось написать. С Паскалем еще несильно знаком.

Код
$new_arr = array();
$text = explode(",",$comb[$z]);
$vol = "<".$text[$i].">";
array_push($new_arr,$vol);


Данные строки создают массив и в него сохраняют все элементы строки, разделенными определенным знаком, в данном случае запятой.

Приведенный тобой кусок делает не то, что ты написал. Чему равно значение переменной $i? Полагаю, ты хотел организовать цикл по ней, но что-то тебя удержало.. ))
Еще я не понимаю, зачем столько перекладываний. Ты мог бы эксплоудить сразу в нужный тебе массив, а если тебе надо, чтобы полученные элементы были заключены в угловые скобочки, то пройдись потом в цикле по массиву и добавь их (хотя мне кажется, что их лучше добавить потом - при выводе, обработке.. но это уже неважно). А уж в перекладчвании в $vol я вообще не вижу никакого смысла (кроме как показать компу, что он должен работать, а не спать)).

$new_arr = explode(",",$comb[$z]);
for ($i=0; $i<count($new_array); i++) $new_arr = '<'.$new_arr.'>');

Вместо цикла for тут можно использовать foreach.

Короче, как я понял, тебе хочется иметь аналог функции explode..
Как ты, наверное, понимаешь, между PHP и Pascal есть существенная разница, касающаяся работы с памятью. Иначе говоря, тебе нужно:
1. либо завести заранее массив (строк) достаточного размера, чтоб в него влезли все элементы, на которые будет разбита исходная строка;
2. либо сначала выяснить, сколько элементов массива тебе потребуется (сосчитать кол-во разделителей, нарпимер);
3. либо использовать динамическую структуру (типа списка).
Я для простоты буду предполагать первый вариант. Причем, я тут буду использовать конструкцию с открытым массивом.

Вот сама функция с примером использования:
const
m= 100; // максимальное число элементов
l= 20; // максимальная длина элемента

type
tElement= string[l];

function Explode(c: char; s: string; var a: array of tElement): integer;
var
i,n: integer;
begin
n:=0;
while Pos(c,s)>0 do begin
Inc(n);
a[n-1]:= Copy(s,1,Pos(c,s)-1);
Delete(s,1,Pos(c,s))
end;
if s<>'' then begin
a[n]:= s;
Inc(n)
end;
Explode:= n
end;

var
new_arr: array [1..m] of string[l];
NumEl,i: integer;

begin
NumEl:= Explode(' ','Hello my dear World! ',new_arr);
for i:=1 to NumEl do new_arr[i]:= '<'+new_arr[i]+'>'; // добавление угловых скобок
for i:=1 to NumEl do WriteLn(i:2,' : ',new_arr[i]);
ReadLn
end.

Я не поручусь, что она работает в точности, как explode, поскольку не помню сейчас деталей. Исходя из здравого смысла, я сделал, чтобы количество элементов в результате разбора пустой строки было равно нулю, а также не вопринимаю пустоту после последнего разделителя как элемент. Пустота МЕЖДУ разделителями результирует в пустой элемент. Если тебе нужно этого избежать - кранчни строку перед разбором, например так:
while Pos(c+c,s)>0 do Delete(s,Pos(c+c,s)),1);


И еще.. Приведенный код очень неэффективен. Это, к сожалению, присуще Паскалю в данном случае ((. Оптимизация этого кода приведет к его раздуванию и все равно не даст максимальной эффективногсти. В Си, с его концепцией приписывания значения оператору присваивания, можно написать и короче, и эффективнее..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.