Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2010, 15:59   #1
Aleksey1989
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 127
По умолчанию Символьный массив

Помогите разобраться со следующеё ошибкой при выполнении программы:

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
 i:integer;
 c:array [1..10] of char;
 begin

 for i:=1 to 10 do
  c[i]:='0';

 i:=file1.Seek(0,soFromBeginning);
 Label1.Caption:='file size = '+IntToStr(i);

 file1.Read(c,16);                             //????????????????

 for i:=1 to 16 do                             //????????????????
  Label2.Caption:=Label2.Caption+c[i];
end;
Мой вопрос заключается в следующем: если в
Код:
file1.Read(c,16);
16 заменить на 10, т.е. количество элементов, объявленных изначально, то ошибки при выполнении программы не будет. В результате в лэйбл будет введенно 10 символов из файла+какие-то закарючки.

1)Если он выводит закарючки, почему не может вывести 11-16 символы?
2)Почему так получается, что если в var я описываю массив, состоящим из 10 символов, с помощью цикла for можно вывести хоть 1000 символов (почему объём превышает указанный в var)?
Aleksey1989 вне форума Ответить с цитированием
Старый 20.09.2010, 16:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
почему не может вывести 11-16 символы?
Потому что у тебя массив может вмещать всего лишь 10 символов:
Цитата:
c:array [1..10] of char;
Цитата:
почему объём превышает указанный в var
Просто Делфи не всегда в отличие от паскаля проверяет на выход за пределы массива. Это скажем так глупость, принятая из Сишных компиляторов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.09.2010, 16:33   #3
Aleksey1989
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 127
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Потому что у тебя массив может вмещать всего лишь 10 символов
Тогда от куда берутся закарючки?
Aleksey1989 вне форума Ответить с цитированием
Старый 20.09.2010, 16:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что у тебя в файле? Какие символы? Может там юникод? Или по крайней мере на ANSI кодировка?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.09.2010, 17:14   #5
Aleksey1989
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 127
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А что у тебя в файле? Какие символы? Может там юникод? Или по крайней мере на ANSI кодировка?
Они выводятся не из файла:
Код:
file1.Read(c,10);                             //????????????????

 for i:=1 to 16 do                             //????????????????
  Label2.Caption:=Label2.Caption+c[i];
end;
Т.е. с 1 по 10 из файла, остальные - закарючки. Т.е. фактически получается, что массив с имеет не 10 членов, а 16, что противоречит тому, что написано при его объявлении.
Код:
 c:array [1..10] of char;
Aleksey1989 вне форума Ответить с цитированием
Старый 20.09.2010, 17:43   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

просто потому что вы обращаетесь в левую ячейку памяти и все.

обьяснять подробнее?могу но боюсь что не поймете.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.09.2010, 17:49   #7
Aleksey1989
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 127
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
просто потому что вы обращаетесь в левую ячейку памяти и все.

обьяснять подробнее?
Если не сложно, то буду рад!
Aleksey1989 вне форума Ответить с цитированием
Старый 20.09.2010, 17:57   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вот допустим кусочек памяти(одна буква означает один байт)
С - это байт массива(вы их потом заполняете, слева первый символ массива)
Д - другие данные(что кгодно(хоть теже закарюки)
тогда у нас получается так(показал те самые 16 байт):
ССССССССССДДДДДД
тогда при вашем цикле вы выводите сначало свои 10 символов, а потом еще 6 символов ахинеи.

в общем, лезите куда попало(а записывать данные вне С вообще не советую)
надеюсь понятно(иначе будет хуже и куда менее понятно)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.09.2010, 18:10   #9
Aleksey1989
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 127
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вот допустим кусочек памяти(одна буква означает один байт)
С - это байт массива(вы их потом заполняете, слева первый символ массива)
Д - другие данные(что кгодно(хоть теже закарюки)
тогда у нас получается так(показал те самые 16 байт):
ССССССССССДДДДДД
тогда при вашем цикле вы выводите сначало свои 10 символов, а потом еще 6 символов ахинеи.

в общем, лезите куда попало(а записывать данные вне С вообще не советую)
надеюсь понятно(иначе будет хуже и куда менее понятно)
Если я правильно понял, то, инициализируя массив, мы тем самым выделяем ему место в памяти. Допустим объём этого места составляет 20 байт. Поэтому, 1-е 10 символов нормальные, т.к. мы прописывали их в var, остальные - просто какие-то данные, хранящиеся в памяти после 10-ти элементов массива.
Я правильно понял?
Aleksey1989 вне форума Ответить с цитированием
Старый 20.09.2010, 18:55   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

почти, вы обьявляли массив на 10 символов(я учитываю что char=ANSIchar), то есть на 10 байт.
а остальное верно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Символьный массив g00d_game Общие вопросы C/C++ 1 12.06.2010 13:38
Символьный массив Злой пёс Общие вопросы C/C++ 6 03.11.2009 18:41
Задача на символьный массив Archiserafim Паскаль, Turbo Pascal, PascalABC.NET 3 12.05.2009 21:52
Символьный массив Nanny Общие вопросы C/C++ 5 20.04.2008 22:44
Символьный массив и double dima Общие вопросы C/C++ 5 15.12.2006 03:52