Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.042 c
9-1119733128
Green_Templar
2005-06-26 00:58
2005.11.13
текст в ддроу


4-1125062207
Barvetal
2005-08-26 17:16
2005.11.13
При выходе из скринсейвера Винда закрывает запущенные им процессы


14-1130049230
SergP.
2005-10-23 10:33
2005.11.13
Посоветуйте стабильный ICQ-клиент


10-1107425579
Dixi
2005-02-03 13:12
2005.11.13
Создание ActiveX...


2-1129658185
Darkwing
2005-10-18 21:56
2005.11.13
Можно ли создать БД не имея готовых файлов (исп. TTable и BDE)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский