Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi]Вопросы использования AnsiString, PChar, String, Конвертация одних типов к другим 
:(
    Опции темы
malor
Дата 3.6.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Вопросы по книгам:
"Программирование в Delphi. Учебник по классическим версиям Delphi" Архангельский, 2006.
"Delphi. Программирование на языке высокого уровня" Фаронов В.В.,2006.
"Библия Delphi" Михаил Фленов, 2005.

1. Зачем в Delphi используется название типа String если есть идентичные ему типы ShortString(при включенной директиве $H-) и AnsiString(при включенной директиве $H+)?
Архангельский с.869. 

2. Зачем используются два типа, хранящих одно и то же - Char и AnsiChar? Почему не выкинут один из них. 
Архангельский с.869.

3. Архангельский с.870: "Строки с нулевым символом в конце представляет собой массивы символов с индексами, начинающимися с 0".
Фаронов на с.137 пишет: "Символы в строке нумеруются, начиная с 1". 
Под что использован элемент массива с индексом 0?

3. В чем отличие String(AnsiString) от PChar?

4. Архангельский с.870:"Переменная типа AnsiString является указателем на динамически 
выделяемую область памяти, в которой хранится строка"
Тогда в чем отличие их от PAnsiString и PString,упомянутых в разделе 14.13 на с.877?

5. Фленов с.94 в табличке:
Максимальная длина строки AnsiString - 231 символ. Почему ?

6. Фленов с.101: "C типом string в этом отношении просто: если мы не указываем его размер, то Delphi может зарезервировать максимальный размер - 255 символов. У PChar нет такого максимального размера и поэтому вся ответственность за выделения памяти под эту переменную ложится на программиста"
А как же 2 Гб?

7.  Длина у ShortString в самом первом байте хранится в виде числа?

8. Фаронов с.139:"32-разрядные версии Windows используют три сорта символов: однобайтный символ ANSI, двухбайтный символ и символ Unicode... двухбайтный символ, в котором младший байт обычно кодируется семибитным ASCII-кодом, а старший указывает, как должен трактоваться этот код(каким символом он будет отображаться на экране или в документе)". 
Где можно подробнее почитать об этом?

9. Фаронов с.138. Пример использования PChar:
Код
var 
  pcS: PChar;
begin
  pcS:='Строка символов';
  ... и т.д. ...
end;

Аналогичный пример есть у Архангельского на с.871.

Фленов с.101:
"Тип PChar нельзя использовать напрямую, потому что это указатель на память. Поэтому указателю должна быть присвоена некоторая область. Это значит, что следующий пример будет недействителен
Код
var
  s:PChar;
begin
  s:='Привет!';
end;

В примере объявлена строка s типа PChar и сделана попытка присвоить ей текст. Такая операция 
невозможна, потому что s - указатель и пока ни на что не указывает".

Где правильно?

Delphi 7, WinXP
PM MAIL   Вверх
Alexeis
Дата 3.6.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Цитата(malor @  3.6.2007,  16:48 Найти цитируемый пост)
1. Зачем в Delphi используется название типа String если есть идентичные ему типы ShortString(при включенной директиве $H-) и AnsiString(при включенной директиве $H+)?
Архангельский с.869. 

  Так для этого и существует, что тип String зависит от директив компиляции, а другие нет. Это для совместимости с кодом паскаля. 

Цитата(malor @  3.6.2007,  16:48 Найти цитируемый пост)
 Зачем используются два типа, хранящих одно и то же - Char и AnsiChar? Почему не выкинут один из них. 
Архангельский с.869.

  AnsiChar просто псевдоним типа Char. Это не 2 разных типа а один с разными именами.




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 3.6.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romkin
Дата 3.6.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: 1
Всего: 5



Выкинь Архангельского! Или используй как подставку. Только не читай.
Фленов тоже лажает smile
Фаронов - вроде ничего, но лучше читай классику, Тексейра и Пачеко, Кэнту и тд.
1. Тип string прописан в стандарте Паскаля, директива - для обратной совместимости. Наследство, так сказать. Остальные два типа - для независимости от директивы. Не забывай, что есть еще WideString smile Никто не исключает, что в будущем string будет соответствовать ему, а не ansistring. И, похоже, довольно скоро станет так...
2. Char - опять же, стандарт. И никто не гарантирует, что в будущем он останется однобайтовым. ansiChar - всегда будет 1 байт.
Если в процедуре ты опираешься на факт, что строка и символ - однобайтовые, (например, преобразуя тип) хорошим тоном считается явное указание приставки ansi. Когда это не важно - используют string.
3. Представление типов впамяти подробно описано в справке, раздел Memory Management. Кратко: Архангельский соврамши. У ShortString элемент с индексом 0 хранит длину строки, поэтому ее максимальная длина 255 байт. У ansiString нулевого элемента нет smile
4. Да. Память под строку выделяется при присвоении (если не углубляться в детали, а надо бы... см справку). Поэтому для s:ansistring сравнения s = '' и s = nil равноценны. PAnsiString - указатель на указатель, что такого? smile
5. Фигня. Максимальная длина ansistring - maxint (4 байта со знаком), shortstring - 255 байт.
6. Опять путаница shortstring и ansistring. В Delphi сейчас принято string = ansistring, и этот тип совместим с PChar (точнее, с PAnsiChar). Так сделано. То есть, если ты уверен, что в функции переменная PChar меняться не будет, смело давай туда PChar(s), где s: ansistring. Если внутри меняется - так делать нельзя.
7. Да. Известный прием byte(s[0]) дает длину. Но не рекомендуется, есть функция Length.
8. Форматов полно smile ищи поисковиками, посмотри Википедию.
9. Фленова тоже выкидывай. Достал своими ошибками smile Это соглашение компилятора: память под строковую константу выделяется еще на этапе компиляции, в s записывается ссылка на эту область памяти. Достаточно просто попробовать smile
PM ICQ   Вверх
malor
Дата 11.7.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



На строке 
 StrLCopy(PChar(simlist[i].nomer),PChar(st),10);
выдает:
Access violation at address 005890C2 in module 'MyProga.exe'. Read of address 40C14E78.


код процедуры такой:
Код
AssignFile(simF, ExtractFilePath(Application.ExeName)+'sim.txt');
  Reset(simF);
  while not Eof(simF) do
    begin
      Readln(simF,st);
      StrLCopy(PChar(simlist[i].nomer),PChar(st),10);
      ... и т.д. ...


simF объявлен как TextFile, simlist - массив структур, поле nomer объявлено как String. В него хотел закинуть первые десять символов из прочитанной строки.

Delphi 7
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1156 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.