Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Изменение типа указателя.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.06 c
1-1129901816
Андрей Жук
2005-10-21 17:36
2005.11.13
Ошибка объявления класса


2-1129791899
kyn66
2005-10-20 11:04
2005.11.13
Как присвоить значения одной переменной другой (TStringList)


6-1122897901
Dr.Nemo
2005-08-01 16:05
2005.11.13
Чат на DELPHI при помощи арены на php


3-1128438439
yanker
2005-10-04 19:07
2005.11.13
доступ к базе из сервиса


2-1129910821
Spinu Oleg
2005-10-21 20:07
2005.11.13
Указатели