IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Команды из php в Паскаль
dosuglist
сообщение 24.04.2011 18:12
Сообщение #1





Группа: Пользователи
Сообщений: 1
Пол: Мужской
Реальное имя: Максим

Репутация: -  0  +


Доброго времени! Подскажите, как реализовать данные строчки на Паскале. На php получилось написать. С Паскалем еще несильно знаком.

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


Данные строки создают массив и в него сохраняют все элементы строки, разделенными определенным знаком, в данном случае запятой.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 25.04.2011 5:25
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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);


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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 27.04.2024 23:33
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"