Форум: "Начинающим";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизИзменение типа указателя. Найти похожие ветки
← →
MakedoneZ © (2005-10-22 18:32) [0]Здраствуйте.
Мне надо сделать так,чтоб при определенных условиях,указатель pt,указывал не разные типы данных.
Как это осуществить?
PS.Эх С++,где-же ты... ;)
← →
Германн © (2005-10-22 18:39) [1]TMyType(pt^)
← →
MakedoneZ © (2005-10-22 19:06) [2]
> TMyType(pt^)
Вы не поняли.
Ведь если я напишу следующее...
pt:=TMyType(pt^)
То будет ошибка.
Вот фрагмент кода:procedure TfrmMain.Sort(Column: Byte);
type
TPhoneBook = record
N: Word;
Name: String[20];
Region: String[20];
Phone: String[20];
Loan: Word;
Payed: Word;
end;
var
aux: TPhoneBook;
Rec1,Rec2: TPhoneBook;
i,j: Word;
Size: Word;
p1,p2: String;
begin
case Column of
1:
begin
p1:=@Rec1.N;
p2:=@Rec2.N;
end;
2:
begin
p1:=@Rec1.Name;
p2:=@Rec2.Name;
end;
3:
begin
p1:=@Rec1.Region;
p2:=@Rec2.Region;
end;
4:
begin
p1:=@Rec1.Phone;
p2:=@Rec2.Phone;
end;
5:
begin
p1:=@Rec1.Loan;
p2:=@Rec2.Loan;
end;
6:
begin
p1:=@Rec1.Payed;
p2:=@Rec2.Payed;
end;
end;
ShowMessage(ANSIString(p1^));
Size:=FileSize(PhoneBook);
for i:=1 to Size-1 do
begin
Reset(PhoneBook);
for j:=i+1 to Size do
begin
Read(PhoneBook,Rec1);
Read(PhoneBook,Rec2);
if p1^>p2^ then
begin
aux:=Rec1;
Rec1:=Rec2;
Rec2:=aux;
Seek(PhoneBook,FilePos(PhoneBook)-2);
Write(PhoneBook,Rec1);
Write(PhoneBook,Rec2);
Seek(PhoneBook,FilePos(PhoneBook)-1);
end //if
else
Seek(PhoneBook,FilePos(PhoneBook)-1);
end; //for j
end; //for i
RefreshList;
end;
if p1>p2 вызывет ошибку.
Так как тип p1 и p2 - фиксированный.
← →
Sergey Masloff (2005-10-22 20:00) [3]>p1,p2: String;
>p1:=@Rec1.N;
В морг.
>Эх С++,где-же ты... ;)
И не надо распальцовок про це плпс плас. В простом це такое пройдет но там нет string.
← →
Sergey Masloff (2005-10-22 20:02) [4]Уж PChar тогда хотя бы
← →
MakedoneZ © (2005-10-22 20:34) [5]
> В простом це такое пройдет но там нет string.
Во первых в C++ еще сохранилась такая вещь как "#DEFINE".
Может не совсем безопасная,но все же.
И там можно обьявлять переменные в любой точке программы.
Так что смог бы тип указателя задать динамически.
Во вторых:
> В морг.
Синтаксические ошибки бывают у всех.
Я забыл написать ^String.
Хотя действительно надо бы использовать PChar.
В третьих:
Кроме как повыпендриваться,ты ничего в этой теме не сделал.
← →
Sergey Masloff (2005-10-22 20:59) [6]>Я забыл написать ^String.
И получить еще польше проблем. Потому что, похоже, просто не понимаешь что такое String в дельфе. Поэтому в морг.
>Кроме как повыпендриваться,ты ничего в этой теме не сделал
Указал на ужасные ошибки. А что я еще мог сделать?
← →
Sergey Masloff (2005-10-22 21:30) [7]И вообще это ужос ;-)
Я бы:
1) зачитал все в TList,
2) написал бы несколько функции типа
TListSortCompare = function (Item1, Item2: Pointer): Integer;
для Word и для ShortString
3) Вызывал бы TList.Sort() передавая как параметр одну из функций в зависимости от нужного типа сортировки
Работало бы это минимум на порядок быстрее чем твой вариант пузырьковой сортировки (вроде он я пристально не смотрел)
← →
MakedoneZ © (2005-10-22 21:37) [8]Удалено модератором
← →
Sergey Masloff (2005-10-22 21:51) [9]>Ну а тебе что в морг,потому что ни хрена не смыслишь в C++?Я же этого не >говорил.
Я ж не тебе имел в виду в морг а коду этому ;-)
>Если что-то знаешь,это не значит что к другим надо относится по свински.
;-) Не расстраивайся.
P.S. А почему те решил что я це (в том числе плас плас) не знаю? ;-)))
Вобщем ты зря расстраиваешься свсем не собирался критиковать тебя а только код. Впрчем, последнее время замечаю что многие как-то меня неадекватно понимают. Может возрастной барьер уже...
Кстати String это тип временем жизни которого управляет сама дельфи и работать с ним как с указателем ито игра в футбол на минном поле. С завязанными глазами.
← →
palva © (2005-10-22 23:47) [10]Попробую дать ответ на вопрос, который вы задали.
Указатели бывают типизированными и нетипизированными, что соответствует (void*) и (Type*) в си. Нетипизированные указатели допустимо присваивать любым указателям, и им можно присваивать любые указатели. А типизированные можно присваивать друг другу только одного и того же типа, либо использовать явное приведение. Пример:
{$APPTYPE CONSOLE}
type
Ts20 = String[20];
Ps20 = ^Ts20;
var
p: Pointer;
s: Ts20;
ps: Ps20;
begin
s := "qwer";
p := @s;
ps := p;
Writeln(ps^); // qwer
Writeln(Ps20(p)^); // qwer
end.
Поэтому я советую вам написать
p1,p2: Pointer;
а перед разыменованием указателя делать приведение типа.
← →
Германн © (2005-10-23 02:11) [11]2 palva © (22.10.05 23:47) [10]
Сумлеваюсь я однако, что твой ответ не удосужится реплики типа "Ламеров не спрашивали! Сами знаем!"
Имхо, автор сабжа - новичёк в программировании, сначала поимел некий опыт в Си, затем перешел в Паскаль. При этом не имея фундаментальных знаний ни о Си, ни о Паскале. :(
Увы, при всём при этом, он ещё и очень самолюбиво-нервный! Ну да. Македонцы - горячие люди! Как и все жители юга Европы. :)
← →
MakedoneZ © (2005-10-23 08:42) [12]Удалено модератором
← →
MakedoneZ © (2005-10-23 08:43) [13]Удалено модератором
Примечание: МАТ и наезды, ты перепутал форум, тебе на udaff.ru
← →
MakedoneZ © (2005-10-23 10:05) [14]Удалено модератором
← →
sniknik © (2005-10-23 12:39) [15]> Ваш ИМХО,никому не нужен.
почему же никому? а вдруг ктото черные списки ведет, стоит/не стоит отвечать конкретному нику. как раз пригодится.
форум не для вас лично, только для того чтобы вы могли получить ответ (если бы был такой то он бы был платным), он для всех, в том числе и для Sergey Masloff и для того чтобы он мог высказать свое имхо (если оно конечно не оффтопик)
> 2 palva
> Спасибо,вы единственный человек,который просто помог,невы*****ясь.
видете ли... если вы примените его помощ as is, не оращая внимание на Sergey Masloff, то вы вероятнее всего только прибавите себе проблем.
palva © (22.10.05 23:47) [10]
... А типизированные можно присваивать друг другу только одного и того же типа...
можно перекинуть любой бред просто через приведение к нетипизированному указателю (предполагается что в этом случае программист лучше знает что делает ;)
например (бред!!!!)
var
p: TForm1;
st: TStrings;
begin
st:= Pointer(p);
...
и это если подходить к вопросу буквально, только то что в вопросе (по типам), не обращая внимания на другие грубые ошибки (на которые попытался обратить внимание Sergey Masloff) которые присутствуют, и именно от незнания (ехе одно ИМХО)... ничем другим не могу обьяснить желание передать указатель с короткой строки на тип который в разные моменты может быть как короткой так и длинной строкой... да и вообще желания работать со строками через переприсвоение указателей (есть же PChar, к нему легко все приводится, впрочем это уже было).
а вот если подходить к задаче творчески то предложение по изменению подходов (Sergey Masloff (22.10.05 21:30) [7] .... Я бы: 1) зачитал все в TList, ...)
я бы еще "усугубил" ;о), этоже попытка записную книжку сделать, так? тогда прямой путь к базам. даже не используя базы а только таблицу/ы в памяти (хранить данные в ней) сразу получаеш весь нужный функционал, и чтение/сохранение данных и сортировки по полям(например по двум/трем/... сразу. в реализации в данном топике этого даже в проекте нет), и связи между различными данными (сохраняемыми в разных таблицах), списки, лукапы, и т.д.
но судя по всему автор изобретает свой собственный велосипед с квадратными колесами, и никаких других советов кроме "как правильно использовать спицы разной длинны в квадратном колесе" не признает. ;)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.045 c