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

Вниз

Ещё раз про перевод из Си на Паскаль   Найти похожие ветки 

 
Германн ©   (2007-08-26 01:46) [0]

Прошу прощения за вопрос по Си, но...
Добавляю в DLL"ку, про которую я раньше тут говорил, новые функции в соответствии с дополнениями к ТЗ, которые получил недавно. И столкнулся в ТЗ с таким вот описанием структуры на Си.
event_s struct
{
event_type type;
char datetime[18];  //строка, заканчивающаяся нулевым символом, содержащая
 //время и дату в формате "dd/mm/yy hh:mm:ss".
...


Вот и не пойму. Я думал что "char datetime[18]" аналогичен Паскалевскому типу "datetime = array 0..17 of char". Но причём тут тогда комментарий о "нулевом символе в конце"?


 
Riply ©   (2007-08-26 01:59) [1]

> [0] Германн ©   (26.08.07 01:46)
Что-то отдаленно напоминающее это встречала.
Там, признаком "незаполненности" структуры был #0 первым символом.
Может и здесь что-то похожее ?


 
ferr ©   (2007-08-26 02:03) [2]

> Вот и не пойму. Я думал что "char datetime[18]" аналогичен
> Паскалевскому типу "datetime = array 0..17 of char". Но
> причём тут тогда комментарий о "нулевом символе в конце"?

это просто массив из 18 символов. Комментарий говорит о том что в каком-то месте массива стоит нулевой символ.


 
fisher   (2007-08-26 02:04) [3]

"dd/mm/yy hh:mm:ss".
тут 17 символов плюс нулевой и того 18
чё непонятно?


 
fisher   (2007-08-26 02:05) [4]

ferr ©   (26.08.07 02:03) [2]
не в каком-то месте, а  чёрным по белому написано что в конце


 
J_f_S   (2007-08-26 02:08) [5]


> Германн ©   (26.08.07 01:46) 
> Прошу прощения за вопрос по Си, но...Добавляю в DLL"ку,
> про которую я раньше тут говорил, новые функции в соответствии
> с дополнениями к ТЗ, которые получил недавно. И столкнулся
> в ТЗ с таким вот описанием структуры на Си.event_s struct{ event_type
> type;char datetime[18];  //строка, заканчивающаяся нулевым
> символом, содержащая  //время и дату в формате "dd/mm/yy
> hh:mm:ss"....Вот и не пойму. Я думал что "char datetime[18]"
> аналогичен Паскалевскому типу "datetime = array 0..17 of
> char". Но причём тут тогда комментарий о "нулевом символе
> в конце"?


Любая ANSI строка должна завершатся символом с нулевым кодом, дабы иметь возможность определить длину строки. Этот как бы аксиома. Почему тут добавлен "лишний" байт под этот самый нуль, хотя длина строки нам заранее известна? А потому что она известна нам, а не функциям, которые могут обрабатывать эту строку.


 
Германн ©   (2007-08-26 02:09) [6]


> Riply ©   (26.08.07 01:59) [1]

Извини, но я не про "похожесть". Вопрос про разницу между PChar и "char имя[18]" в описании поля структуры на Си.
Имхо, лучшим вариантом было бы обратиться на какой-нибудь форум сишников, но я не знаю ни одного. :(


 
fisher   (2007-08-26 02:11) [7]

Германн ©   (26.08.07 02:09) [6]
что тебе непонятно-то, программист?


 
J_f_S   (2007-08-26 02:11) [8]


> Германн ©   (26.08.07 02:09) [6]
> > Riply ©   (26.08.07 01:59) [1]Извини, но я не про "похожесть".
>  Вопрос про разницу между PChar и "char имя[18]" в описании
> поля структуры на Си.Имхо, лучшим вариантом было бы обратиться
> на какой-нибудь форум сишников, но я не знаю ни одного.
> :(


Блин. Нет никакой разницы. Просто последний символ массива установи в ноль. имя[17]=0.


 
Riply ©   (2007-08-26 02:12) [9]

> [6] Германн ©   (26.08.07 02:09)
>Извини, но я не про "похожесть". Вопрос про разницу между PChar и "char имя[18]"
>в описании поля структуры на Си.
Imho разница в том, что поле "char имя[18]" занимает 18 байт.


 
fisher   (2007-08-26 02:14) [10]

функции работы со строками в сишных библиотеках работаю со строками PChar
вот массив char и приводится добавлением нуля в конец к таким строкам чтобы сишные строковые функции можно было задействовать


 
Германн ©   (2007-08-26 02:14) [11]


> ferr ©   (26.08.07 02:03) [2]


> fisher   (26.08.07 02:04) [3]


> J_f_S   (26.08.07 02:08) [5]

Суть понятна. "Не первый день замужем" :)
Смысл не понятен. Поскольку на
> А потому что она известна нам, а не функциям, которые могут
> обрабатывать эту строку.

есть ответ моментальный - эта строка задана тем, кто её обрабатывает! И задана вполне однозначно!


 
fisher   (2007-08-26 02:15) [12]

кошмарр какой-то
совершенно дилетантский вопрос


 
fisher   (2007-08-26 02:17) [13]

Германн ©   (26.08.07 02:14) [11]
ну, вероятно, тот кто её обрабатывает захотел юзать дату как строку чтобы задейстовать сишные функции работы со строками, для убобства, читабельности,....или чего-то ещё


 
J_f_S   (2007-08-26 02:20) [14]


> есть ответ моментальный - эта строка задана тем, кто её
> обрабатывает! И задана вполне однозначно!

Ага. Классическая программистская засада. "Код потенциально небезопасен. Но же знаю, как его нужно использовать, и всегда буду использовать правильно". Счас. Вот решишь ты тестовый вывод через fprintf сделать - опа! Или  захочешь передать строку в винапишную функцию - превед!


 
Riply ©   (2007-08-26 02:20) [15]

> [12] fisher   (26.08.07 02:15)
>кошмарр какой-то
>совершенно дилетантский вопрос
>функции работы со строками в сишных библиотеках работаю со строками PChar
Меня тоже удивляет: какое отношение имеют "функции работы со строками",
к определению поля в структуре ?


 
Германн ©   (2007-08-26 02:22) [16]


> fisher   (26.08.07 02:15) [12]
>
> кошмарр какой-то
> совершенно дилетантский вопрос
>

Ес-сно дилетантский. А ты какой ожидал в сией крнференции?


 
fisher   (2007-08-26 02:22) [17]

вот ты сам мозгой раскинь
захотел я соединить строку "current date and time : " со строкой даты и времени
чё я должен возить с галимым массивом char?
если же дата и время строка тогда я могу просто вызвать функция конкатенации строк
типа Concat("current date and time : ", dateAndTimeString)


 
Германн ©   (2007-08-26 02:25) [18]


> J_f_S   (26.08.07 02:20) [14]
>
>
> > есть ответ моментальный - эта строка задана тем, кто её
> > обрабатывает! И задана вполне однозначно!
>
> Ага. Классическая программистская засада. "Код потенциально
> небезопасен. Но же знаю, как его нужно использовать, и всегда
> буду использовать правильно". Счас. Вот решишь ты тестовый
> вывод через fprintf сделать - опа! Или  захочешь передать
> строку в винапишную функцию - превед!
>

Эээ. Ну ты вопрос-то читал или "пробегал глазами":
:)


 
fisher   (2007-08-26 02:25) [19]

вот ты сам мозгой раскинь
например, захотел я соединить строку "current date and time : " с массивом char представляющим дату и время
чё я должен возиться с галимым массивом char вручную?
достаточно сделать массив char типом PChar добавление 0 в конец и тогда можно будет вызвать библиотечную функция конкатенации строк
p.s. попонятней


 
Riply ©   (2007-08-26 02:26) [20]

> [17] fisher   (26.08.07 02:22)
А может всетаки "размер имеет значение" ? :)
Это же поле структуры и влияет на нее и "смещение" следующего поля.


 
fisher   (2007-08-26 02:26) [21]

есть такая штука как сопровождение
и тот кто ноль пихнул в массив char очень верно поступил


 
J_f_S   (2007-08-26 02:28) [22]


> fisher   (26.08.07 02:26) [21]
> есть такая штука как сопровождениеи тот кто ноль пихнул
> в массив char очень верно поступил

Именно так.


 
fisher   (2007-08-26 02:28) [23]

Riply ©   (26.08.07 02:26) [20]
не понял Ваше глубокомысленно изречение


 
Германн ©   (2007-08-26 02:28) [24]


> fisher   (26.08.07 02:22) [17]
>
> вот ты сам мозгой раскинь
> захотел я соединить строку "current date and time : " со
> строкой даты и времени
> чё я должен возить с галимым массивом char?
> если же дата и время строка тогда я могу просто вызвать
> функция конкатенации строк
> типа Concat("current date and time : ", dateAndTimeString)
>

Сам то я "мозгой раскинул" ещё до того как задать сей вопрос.
Токмо не в этом суть. :(


 
fisher   (2007-08-26 02:32) [25]

Германн ©   (26.08.07 02:28) [24]
если в данный момент времени в программе то что массив char можно рассматривать как PChar -строку не имеет смысла не значит что этого не потребуется в будущемда даже если не самой программе
а внешней, кто будет с этими структурами работать, внешнему коду тоже будет удобней если массив char будет строкой


 
fisher   (2007-08-26 02:33) [26]

а вообще это не Ваша юрисдикция, Вам дали так - рабойте с тем что есть и пользуйте всё то удобство которое даёт вам то что массив char это строка


 
J_f_S   (2007-08-26 02:35) [27]


> fisher

Эк тебя тема зацепила ;)


 
Германн ©   (2007-08-26 02:52) [28]


> fisher   (26.08.07 02:32) [25]
>
> внешнему
> коду тоже будет удобней если массив char будет строкой
>

Ты это так думаешь или есть опыт работы в Си с подобными структурами?


> J_f_S   (26.08.07 02:35) [27]
>
>
> > fisher
>
> Эк тебя тема зацепила ;)
>

Да вот и я это заметил :)


 
_uw_ ©   (2007-08-26 08:23) [29]

В С

char datetime[18];

вовсе не обязано быть строкой, а может быть просто массивом байт. В приведенном фрагменте программист сообщает читающему (и себе тоже), что в datetime[18] хранится именно строка.


 
foo   (2007-08-26 08:43) [30]

Two strings walk into a bar. The bartender says "What would you like?"
The first string says "I think I"ll have a beer quag fulk boorg jdk^CjfdLk jk3s d#f67howe%^U r89nvy~~owmc63^Dz x.xvcu"
The second string says "please pardon my friend, he"s not null-terminated"


 
Zeqfreed ©   (2007-08-26 11:28) [31]

> Я думал что "char datetime[18]" аналогичен Паскалевскому
> типу "datetime = array 0..17 of char"

Аналогичен datetime = array[0..17] of Byte;
См. что _uw_ пишет в [29].


 
isasa ©   (2007-08-26 12:07) [32]

_uw_ ©   (26.08.07 08:23) [29]
:)
+ "заточенная" под сишный способ хранения строки(null-terminated), т.к. существует еще второй, классический, в виде информационного вектора.
Угадаем в каком языке используется?


 
isasa ©   (2007-08-26 12:09) [33]

Сорри, масив байт - "заточенный".


 
Kerk ©   (2007-08-26 12:09) [34]

PChar - это тоже строка заканчивающаяся нулем.. если что


 
isasa ©   (2007-08-26 12:12) [35]

Kerk ©   (26.08.07 12:09) [34]

PChar - это тоже строка заканчивающаяся нулем.. если что

Это указатель на место в памяти, которое должно заканчиваться нулем.
Нуль ставят обработчики этого места, которые работают по правилам null-terminated.


 
Anatoly Podgoretsky ©   (2007-08-26 13:20) [36]

> Германн  (26.08.2007 01:46:00)  [0]

Все просто, это напоминание разработчику, что бы для совместимости с PChar не забыл добавить NULL
В СИ нет байтов, только символы, а программист хочет эту структуру использовать как массив байтов и одновременно сохранить совместимость с PChar. И эта структура должна быть фиксированой длины.

Такое у меня толкование.


 
Германн ©   (2007-08-26 21:18) [37]


> Anatoly Podgoretsky ©   (26.08.07 13:20) [36]
>
> > Германн  (26.08.2007 01:46:00)  [0]
>
> Все просто, это напоминание разработчику, что бы для совместимости
> с PChar не забыл добавить NULL


Да это я ступил. Какое-то реле наверно замкнуло в мозгах :)
Сам ведь часто пользовался "zero-based arrays" как PChar"ом.


 
Kobik.   (2007-08-27 09:51) [38]

>Zeqfreed ©   (26.08.07 11:28) [31]
>> Я думал что "char datetime[18]" аналогичен Паскалевскому
>> типу "datetime = array 0..17 of char"

>Аналогичен datetime = array[0..17] of Byte;
>См. что _uw_ пишет в [29].
а помоему сдесь логичнее использовать string[17].
0 на конце будет автоматически. Конечно, все завист от того, насколько глубоко проводится перевод. Ведь в си есть функции для работы со строками (т.е. с char[...]), а их аналоги в паскале работают с string-ами.

Ну а вообще, не все ли равно как обозвать? Надо знать, что дальше с этим datetime будет делаться.


 
Германн ©   (2007-08-29 02:33) [39]

Не ну.
Почти закончил работу. Дошёл до последних строк ТЗ. И читаю:
Возможные ошибки:
Ошибки:  1 – невозможно открыть порт.
 2 – порт уже открыт.
 3 – порт занят.
 4 – ни один порт не открыт.
 5 – таймаут ожидания ответа от контроллера.
 6 – недопустимый номер ...
 7 – недопустимый номер ...
 8 – недопустимый статус ...
 9 – недопустимый код ...
 10 –
 ...
Список ошибок дополняется при реализации.

Не ну первые четыре (в принципе) есть куда помещать.
bool OpenPort(unsigned int port, unsigned int * errorCode, char * errorTxt)
А ни в одной другой функции в ТЗ нет параметра типа "errorCode"! А результат везде BOOL. :(

Похоже, что моим надеждам на появление "программистов" в моей конторе нанесён ещё один удар. Опять ЖЗЧ? :(((


 
J_f_S   (2007-08-29 03:02) [40]

Германн,  а в чем вопрос?
errorCode - указатель. Если порт открыт, то результат функции, полагаю, - тру, и значение errorCode можно не смотреть. Если порт открыть не удалось - то функция возвращает фальш и если надо, то причину ошибки можно узнать в *errorCode.


 
Германн ©   (2007-08-29 03:19) [41]


> J_f_S   (29.08.07 03:02) [40]
>
> Германн,  а в чем вопрос?
>

Это не вопрос. Это жалобный вопль :)


> А ни в одной другой функции в ТЗ нет параметра типа "errorCode"!
>  А результат везде BOOL. :(

Так как я могу возвратить тип ошибки???


 
J_f_S   (2007-08-29 03:25) [42]


> Так как я могу возвратить тип ошибки???

Ааа... Ну тогда можно поругать аффтаров десигн-спецификейшн :)
Можно завести статик переменную вроде _last error, ну и ошибку передавать с помошью своих самописных аналогов GetError/SetError.


 
J_f_S   (2007-08-29 03:28) [43]


> GetError/SetError.

GetLastError/SetLastError конечно.


 
Германн ©   (2007-08-29 03:43) [44]


> J_f_S   (29.08.07 03:25) [42]
>
>
> > Так как я могу возвратить тип ошибки???
>
> Ааа... Ну тогда можно поругать аффтаров десигн-спецификейшн
> :)
> Можно завести статик переменную вроде _last error, ну и
> ошибку передавать с помошью своих самописных аналогов GetError/SetError.
>
> <Цитата>
>
> J_f_S   (29.08.07 03:28) [43]
>
>
> > GetError/SetError.
>
> GetLastError/SetLastError конечно.
>

Ей богу! Хотел ради шутки озвучить здесь этот вариант!
Но решил, что это не достаточно смешно! :)


 
J_f_S   (2007-08-29 04:08) [45]


> Германн ©   (29.08.07 03:43) [44]

Ну, если спеки поправить нельзя, а нужда есть,- то вай нот?
В конце концов, это же чистый Си, где нет механизма исключений, - остается только передавать код ошибки наверх при нехороших ситуациях во время вызова функций. Если интерфейс функции не предусматривает явной передачи кода ошибки, и поменять его нельзя, то вариант с GetLastError - единственный, и причем вполне приличный.


 
J_f_S   (2007-08-29 04:11) [46]

По крайней мере механизм получения кода ошибки будет единым для всего фреймворка. Такой подход используется во многих сишных либах.


 
Anatoly Podgoretsky ©   (2007-08-29 10:20) [47]


> Так как я могу возвратить тип ошибки???

Запросто если знать, что такое BOOL
Программисты на СИ часто его используют как не BOOL, а шире
BOOL может принимать множество значений, если 0 нет ошибки, а если не 0, то или как BOOL или как Cardinal и значение код ошибки.
На Паскале можешь попробовать сделать приведение или описать функцию, как возвращающую Cardinal

Подобными трюка не брезговали и в Микрософт, а уж рядовые программисты те вообще ничего не боятся, но бога, ни дьявола.


 
Германн ©   (2007-08-29 16:17) [48]


> Anatoly Podgoretsky ©   (29.08.07 10:20) [47]
>
>
> > Так как я могу возвратить тип ошибки???
>
> Запросто если знать, что такое BOOL
> Программисты на СИ часто его используют как не BOOL, а шире
> BOOL может принимать множество значений, если 0 нет ошибки,
>  а если не 0, то или как BOOL или как Cardinal и значение
> код ошибки.
> На Паскале можешь попробовать сделать приведение или описать
> функцию, как возвращающую Cardinal
>
> Подобными трюка не брезговали и в Микрософт, а уж рядовые
> программисты те вообще ничего не боятся, но бога, ни дьявола.
>

Хех. Нашел сейчас этого СИ-шника и задал этот вопрос ему.
Ответ не угадает никто.
Код ошибки я должен записывать в ту переменную, ссылку на которую я получил в параметрах функции
> bool OpenPort(unsigned int port, unsigned int * errorCode,
>  char * errorTxt)

Как вам такой вариант?


 
Anatoly Podgoretsky ©   (2007-08-29 16:22) [49]

> Германн  (29.08.2007 16:17:48)  [48]

Ну этот ответ напрашивался из прототипа функции.
Я отвечал не на него, а по поводу трюков с BOOL


 
Германн ©   (2007-08-29 16:26) [50]


> Anatoly Podgoretsky ©   (29.08.07 16:22) [49]
>
> > Германн  (29.08.2007 16:17:48)  [48]
>
> Ну этот ответ напрашивался из прототипа функции.
>

Наверно я не донёс в полной мере суть такого типа передачи кода ошибок. Сыылка на переменную errorCode мне передается вышеуказанным способом при открытии порта. Я должен эту ссылку запомнить и при возникновении ошибок при вызовах любых других функций той же dll"ки записывать код ошибки в эту переменную.


 
J_f_S   (2007-08-29 16:29) [51]


> Германн ©   (29.08.07 16:26) [50]

Чтож... Клевый десигн. Развлекайся ;)


 
Anatoly Podgoretsky ©   (2007-08-29 16:31) [52]

Ты обрати еще внимание на errorTxt
Если его должен заполнять ты, то тогда Ой


 
Anatoly Podgoretsky ©   (2007-08-29 16:31) [53]

А вообще бардак


 
Германн ©   (2007-08-29 16:35) [54]


> Anatoly Podgoretsky ©   (29.08.07 16:31) [52]
>
> Ты обрати еще внимание на errorTxt
> Если его должен заполнять ты, то тогда Ой
> <Цитата>
>
> Anatoly Podgoretsky ©   (29.08.07 16:31) [53]
>
> А вообще бардак
>

Обратил уже :(((


 
wicked ©   (2007-08-29 23:23) [55]

> Германн
хе-хе.... весело вам
1) бардак в прототипе
bool OpenPort(unsigned int port, unsigned int * errorCode, char * errorTxt)
делая так, программер клиентского приложения заведомо обречен на геморрой - ты должен писать в errorTxt не адрес строки с ошибкой (как было бы в случае с char * * errorTxt), а текст самой ошибки в буффер, контроля над которым ты не имеешь... поменяется текст ошибки, станет длинее - вуаля, згавствуйте глюки, большие и малые
а глюки из-за переписанной памяти очень неприятные и трудные для уловления

2) а шо будет, если сей барин захочет открыть 2 порта? куда писать ошибки?
или делать внутренний static хеш-список с ключом "номер порта" и значениями "адрес кода ошибки" и "адрес сообщения про ошибку"?
2.а) а номер порта далее в функциях фигурирует? можно отследить, к какому порту обращается клиентское приложение?

3) шо будет, если клиентское приложение захочет открывать порты в разных потоках?

можешь смело задать эти вопросы вашему "сишнику"


 
Anatoly Podgoretsky ©   (2007-08-29 23:25) [56]

> wicked  (29.08.2007 23:23:55)  [55]

> можешь смело задать эти вопросы вашему "сишнику"

А не отделу кадров?


 
isasa ©   (2007-08-29 23:50) [57]

А мне вот просто стало интересно, какова цель передачи "сообщений" об ошибке, вместе с ее кодом.


 
wicked ©   (2007-08-30 00:33) [58]

> isasa ©   (29.08.07 23:50) [57]

> А мне вот просто стало интересно, какова цель передачи "сообщений"
> об ошибке, вместе с ее кодом.

а шоб в клиентской программе не париться - шо дали, то и вывел


 
Германн ©   (2007-08-30 01:55) [59]


> wicked ©   (29.08.07 23:23) [55]
>
> > Германн
> хе-хе.... весело вам
>

Да уж. Веселее некуда :(((
Ну по поводу errorTxt тут несколько понятнее. В ТЗ черным по белому написано, что errorTxt – указатель на строку, в которую записывается текстовое описание ошибки. Строка должна оканчиваться нулевым символом. Размер памяти под строку: 2048 байт.
Длиннее текст ошибки врядли станет. Хотя тут бабушка надвое сказала. В основном тексты ошибок должен сформировать я сам, но ведь и система может мне подкинуть какую-нибудь подлянку. Хотя бы на этапе отладки всей системы.

>
> 2) а шо будет, если сей барин захочет открыть 2 порта? куда
> писать ошибки?
> или делать внутренний static хеш-список с ключом "номер
> порта" и значениями "адрес кода ошибки" и "адрес сообщения
> про ошибку"?
> 2.а) а номер порта далее в функциях фигурирует? можно отследить,
>  к какому порту обращается клиентское приложение?
>

Автор ТЗ предполагает только один порт. "Это однозначно" (с) Жириновский
Другим людям эту библиотеку отдавать никто не планирует. (Пока)
Но ведь возможен случай, когда функция OpenPort не будет вызвана! Хотя бы из-за ошибок на этапе отладки. Будет ещё хуже вплоть до AV. Ну до AV я не допущу, положим, но и он не получит никакой информации.

> 3) шо будет, если клиентское приложение захочет открывать
> порты в разных потоках?

Вот этого точно не будет. ТОЛЬКО ЧЕРЕЗ МОЙ ТРУП!!!
Или я, или СОМ-порты в доппотоках!

Так что обязательно "утрясу" эти проблемы с СИ-шником. Отдел кадров пока подождет :)

P.S. Создалось впечатление, что у СИ-шников есть свой Фленов. И у него есть ученики :)


 
Германн ©   (2007-08-30 02:00) [60]

P.P.S
Этот СИ-шник будет теперь руководить нашими программистами.
Розыч, понял теперь,  кто у нас работает программистами?
:)


 
J_f_S   (2007-08-30 02:06) [61]

А причем тут наезды на С? Нет, честно?


 
Германн ©   (2007-08-30 02:18) [62]


> J_f_S   (30.08.07 02:06) [61]
>
> А причем тут наезды на С? Нет, честно?
>

А где тут наезды на С?
Нигде я ничего не говорил о СИ как о языке. Просто так сложилось, что новый наш сотрудник работает на мелкософтомском СИ. И вышеописанное ТЗ составил именно он. И речь шла о нём и о ТЗ, а не о языке.
Если ты о фразе
> Создалось впечатление, что у СИ-шников есть свой Фленов.
>  И у него есть ученики :)

то это не наезд на СИ. Это гораздо более - наезд на Дельфи (Паскаль) Уж поверь :)



Страницы: 1 2 вся ветка

Текущий архив: 2007.09.30;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.025 c
2-1189019937
malyar
2007-09-05 23:18
2007.09.30
масивы


15-1188541103
Шмелъ
2007-08-31 10:18
2007.09.30
Mail Observer Application


2-1188901427
Adventure
2007-09-04 14:23
2007.09.30
Опять про кодовые страницы в Paradox через DBE


2-1188589307
к2в2
2007-08-31 23:41
2007.09.30
Время простоя + службы


15-1188909994
Denis_
2007-09-04 16:46
2007.09.30
Палец заменит кредитку?