Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизКак удалить из строки типа PChar 2 символа Найти похожие ветки
← →
Sanl (2003-10-31 14:29) [0]Вообщем нужно удалить подстроку
← →
Narayan (2003-10-31 15:18) [1]
...
var c: PChar;
...
PChar(c)^:=Delete(PChar(c)^,8,2);
...
удалит восьмой и девятый символ
← →
VMcL (2003-10-31 15:20) [2]Удалено модератором
← →
Anatoly Podgoretsky (2003-10-31 15:23) [3]Надо делать смещение символов
← →
Narayan (2003-10-31 15:25) [4]Удалено модератором
← →
VMcL (2003-10-31 15:27) [5]2 Anatoly Podgoretsky
Или можно так:
var
S: String;
begin
// C: PChar (allocated)
S := AnsiString(C);
Delete(S, x, y);
StrPCopy(C, S);
end;
← →
Anatoly Podgoretsky (2003-10-31 15:34) [6]Так оно здесь и делается, через промкжуточные функции, а зачем когда есть прямая MOVE
← →
Narayan (2003-10-31 15:35) [7]2 Sanl
Промахнулся я.
элементарно решается вводом переменной
t: String;
t:=c;
Delete(t,8,2);
c:=PChar(t);
← →
Serginio666 (2003-10-31 15:43) [8]Move(s[x+1],s[x],Length(s)-x-1);
← →
Serginio666 (2003-10-31 15:47) [9]n символов с позиции х
Move(s[x+n],s[x],Length(s)-x-n);
SetLength(s,Length(s)-n);
← →
Anatoly Podgoretsky (2003-10-31 15:47) [10]Narayan © (31.10.03 15:35) [7]
Теперь делаем S:="1"; и идем пить водку.
← →
Narayan (2003-10-31 21:56) [11]2 [10] Anatoly Podgoretsky ©
это например было ;|
Думаю простой пример полезнее длительных разглогольствований.
В вопросе сказано два символа => Length(s)>1.
И вообще. Off Toppic.
← →
Narayan (2003-10-31 22:00) [12]2 Anatoly Podgoretsky
Лучше напишите как бы вы сделали ?
← →
Anatoly Podgoretsky (2003-10-31 22:19) [13]Narayan © (31.10.03 21:56) [11]
Ты опять не понял, что же ты посоветовал, после каких либо действий с s (имеется в виду Т в твоем примере), C будет указывать в никуда.
Я уже написал, что сделал бы с MOVE, примеры от других тоже рабочие, просто не эффективные. Повторять пример с MOVE нет смысла.
← →
Narayan (2003-10-31 23:11) [14]2 Anatoly Podgoretsky
может я и сейчас что-то не понял, но вот эта строчка (после действий)
c:=PChar(t);
не играет никакой роли ?
← →
Anatoly Podgoretsky (2003-11-01 01:06) [15]Играет, ты должен сохранять T неизменным на все время жизни C
← →
Ломброзо (2003-11-01 01:14) [16]> Narayan ©
А вы просто попробуйте месяц делфи не открывать, а токмо С или ассемблер (предпочтительнее)... или в CBOSS побаллотироваться... там такие задачи предлагать любят, но за string сразу выгонят.
← →
Ihor Osov'yak (2003-11-01 01:16) [17]2 [14] Narayan © (31.10.03 23:11)
o [10] Anatoly Podgoretsky © (31.10.03 15:47)
Анатолий делал намек, что
t:=c;
Delete(t,8,2);
c:=PChar(t);
очень провоцирует проблемы. И пример такой проблемы привел:
t: String;
t:=c;
Delete(t,8,2);
c:=PChar(t);
t:="1";
После t:="1"; область памяти, куда смотрит c "освобождается" со всямя вытекающими последствиями..
← →
Narayan (2003-11-01 01:27) [18]2 [15] Anatoly Podgoretsky © (01.11.03 01:06)
Ну и в чем же я ошибся?
c:=PChar(t) - начинает (в ваших терминах) новую жизнь для с
← →
Narayan (2003-11-01 01:34) [19]Пора закрыть эту ветку. ;|
← →
Ihor Osov'yak (2003-11-01 01:46) [20]2 [18] Narayan © (01.11.03 01:27)
Ты огибаешся в том, что считаешь, что c:=PChar(t) - "начинает (в ваших терминах) новую жизнь для с"
Delete(t,8,2); распределяет память под новое значение t (естественно, может освободить память, занимаемую старым значением t, если счетчк использований сбросится в 0)..
c:=PChar(t); нацеливает указатель c на t[1] без никакого распределения памяти и изменения счетчика использовний для текущего значения t
t:="1"; "нацеливает" указатель, который ассоциирован с t на область памяти, занимаемой "1", сбрасывает в 0 счетчик использований той строки, которая обоазовалась вследствие выполнения Delete, и освобождает соотв. память. Но с ghjljk;ftn cvjnhtnm yf "ne jcdj,j;ltyye. j,kfcnm gfvznb//
← →
Ihor Osov'yak (2003-11-01 01:48) [21]Но с ghjljk;ftn cvjnhtnm yf "ne jcdj,j;ltyye. j,kfcnm gfvznb// ->
Но с продолжает то смотреть на освобожденую область памяти.
Сорри..
PS. Вывод о необходимости закрытии ветки преждевременный...
← →
Narayan (2003-11-01 03:22) [22]2 Ihor Osov"yak
повторно... ( [14] )
...., но вот эта строчка (после действий)
c:=PChar(t);
...
Для тех кто на бронепоезде: t:="1" - тоже действие.
Не надо меня уговаривать на то,
что я и так против ничего не имею. )
Теперь дружно посмотрели сабж ветки.
И поняли что о задаче в целом ничего не известно.
Так что хватит выдумавать какие-то действия, которые могут вызвать какие-то ошибки...
← →
Ihor Osov'yak (2003-11-01 10:47) [23]2 [22] Narayan © (01.11.03 03:22)
Тебе указали на потенциальные проблемы твоего варианта решения [7]. Это во первых.
Во вторых, вполне опримальный вариант решения сабжевой проблемы уже предложен - см. [3], [6]..
В третьих, есть подозрение, что кому-то так и не стало понятно, в чем же потенциальная опасность его варианта решения.
2 [1] Narayan © (31.10.03 15:18)
Ты то хоть на компиляцию пытался запустить то, что написал, знаток пассажиров бронепоезда?
2 [9] Serginio666 (31.10.03 15:47)
SetLength для PChar не идет.. Во вторых, в сабжевом вопросе не указано, куда нужно разместить результат.. Так что и к первой стороче некоторые претензии остаются (даже после указания того, что s:PChar) :-)
← →
Anatoly Podgoretsky (2003-11-01 11:06) [24]Это еще не все проблемы данного кода
t:=c;
Delete(t,8,2);
c:=PChar(t);
Мы имеем PChar это С, теперь после выполнения c:=PChar(t); вероятность утечки памяти очень велика, если память выделена динамически, то теперь она потеряна. Если это бы статический массив то теперь мы имеем два массива символов, старый неизмененый, в котором просили удалить два символа и новый нестабилный. Часть программы продолжит пользоваться старым массивом, часть новым, ссылка на который возможно булет утеряна или сам массив будет деаллокирован, со всеми вытекающими из этого последствиями.
Какая из неприятностей произойдет, точно сказать нельзя, поскольку для этого должно быть приведено больше кода, например определение, присвоение значения, вылеление памяти, время существования объектов. Но как бы это не было сделано, во всех случаях есть проблема, от легких до порушения всей системы и такие ошибки очень тяжело отлавливаются, поскольку могут долго жить не заметно.
Вместо того, что бы признать очевидное, ведется неухлюжая попытка скрыть промах, очень частый у начинающих при работе с PChar, после того как указали на причины промаха и последствия. Короче это не украшает и приводит к противоположному результату, не надо бояться признаваться в ошибках, это только повысит твой авторитет и пойдет на пользу в виде не повторения подобных грубых ошибок. Но если ты хочешь, то можешь продолжать упорствовать, никто тебе не обязан, как и ты.
← →
Narayan (2003-11-01 12:08) [25]2 [24] Anatoly Podgoretsky © (01.11.03 11:06)
Да не имею я ничего против.
Кроме одного.
Следить за осводождением динамически выделенной памяти, обращением к ней, и ежи с ними дело Sanl.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c