Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу работать с переменными! 
:(
    Опции темы
RinOSpro
Дата 8.1.2007, 10:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Не понимаю!
Почему я не могу работать с переменными а с визуальными компонентами получается.

Код

procedure TForm1.Button1Click(Sender: TObject);
var
str1 : string[1];
str2 : string;
i : integer;
begin
for i := 1 to 3000 do
begin
str2 := str2+' '+str1;
end;
label1.Caption := str2;


Таким образом почемуто не работает хотя понятно что этот вариант быстрее чем ниже следующий

Код

procedure TForm1.Button2Click(Sender: TObject);
var
str1 : string[1];
i : integer;
begin
for i := 1 to 3000 do
begin
str1 :=chr(i);
label1.Caption :=label1.Caption+str1;
end;


Понятно что первый вариант быстрее т.к. там через переменную, а здесь через визуальный компанент. Почему не работает первый вариант? И как зделать чтобы работал?
  Вверх
RinOSpro
Дата 8.1.2007, 10:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Не понимаю!
Почему я не могу работать с переменными а с визуальными компонентами получается.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
str1 : string[1];
str2 : string;
i : integer;
begin
for i := 1 to 3000 do
begin
str2 := str2+' '+str1;
end;
label1.Caption := str2;


Таким образом почемуто не работает хотя понятно что этот вариант быстрее чем ниже следующий

Код

procedure TForm1.Button2Click(Sender: TObject);
var
str1 : string[1];
i : integer;
begin
for i := 1 to 3000 do
begin
str1 :=chr(i);
label1.Caption :=label1.Caption+str1;
end;


Понятно что первый вариант быстрее т.к. там через переменную, а здесь через визуальный компанент. Почему не работает первый вариант? И как зделать чтобы работал?
  Вверх
Guedda
Дата 8.1.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

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



Потому что компонент сам тебе выделяет память под новый символ. А чтобы переменная так могла, используй SetLength. В данном случае будет следующий код:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
str1 : string[1];
str2 : string;
i : integer;
begin
for i := 1 to 3000 do
begin
SetLength(Str2, length(str2) + length(str1));
str2 := str2+' '+str1;
end;
label1.Caption := str2;

и всё будет работать.

Это сообщение отредактировал(а) Guedda - 8.1.2007, 10:42


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Visp
Дата 8.1.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программер



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

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



а может первый вариант сделать так 
Код

var
str1 : string[1];
str2 : string;
i : integer;
begin
str2 := '';
for i := 1 to 3000 do
begin
str1 :=chr(i);
str2 := str2+' '+str1;
end;
label1.Caption := str2;

PM MAIL WWW ICQ   Вверх
marykone
Дата 8.1.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2722
Регистрация: 2.5.2006
Где: Краснодар

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



что то утебя не понятно что ты  хочешь сделать

поясни

быстрей ответ получишь
Код

str2 := str2+' '+str1;

а какие значения у тебя в str1 и str2 ты ничего не присваиваешь str1 в цикле 
если правильно понял тебя то

Код

begin
for i := 1 to 3000 do
begin
str1 :=chr(i);
str2 := str2+' '+str1;
end;
label1.Caption := str2;



и навсякий случай очищай переменные

перед работай 
str1:='';
str2:='';


Это сообщение отредактировал(а) marykone - 8.1.2007, 10:44


--------------------
получил ответ, пометь вопрос как решенный (правый верхний угол вашей темы).

PM   Вверх
pankerstein
Дата 8.1.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 16.11.2006
Где: г. Белгород

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



если хочешь в caption i выводить то используй inttostr(i) str1 тебе и не нужна тогда


str2:=str2+' '+inttostr(i)

и полюбому обнули str2:='';

И кстати если не ошибаюсь caption то у тебя бааальщой получится если ты 3000 раз к нему прибавишь его предыдущее да есчо и  i. smile

2-й пример понятно что делает, а 1-й собссно ничего помоему полезного..... прибавляет к неинициализорованной str2 такуюже str1

Код

begin
str2:=label1.caption; //или :='';
for i := 1 to 3000 do
Label1.caption:= str2+' '+intostr(i);

end;


Это сообщение отредактировал(а) pankerstein - 8.1.2007, 10:59
PM WWW   Вверх
Beltar
Дата 8.1.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кстати, а в чем смысл Chr(3000)? Я провел опыт, похоже, что символы циклически повторяются
Chr(X)=Chr(X mod 255)


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Snowy
Дата 8.1.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



А как он будет работать?
Что такое str1? Чему оно равно?
А во втором примере - что за chr(3000)?
Оба примера неправильные.
Объясни, что ты хочешь получить?

Добавлено @ 13:36 
ЗЫ. И варнинги компилятора читай - тебе же пишут - str1 may be not initialized (ну или что-то в этом роде).
PM MAIL   Вверх
Sunvas
Дата 8.1.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Guedda, 
Цитата(Guedda @  8.1.2007,  10:38 Найти цитируемый пост)
Код

str2 : string;

Цитата(Guedda @  8.1.2007,  10:38 Найти цитируемый пост)
Код

SetLength(Str2, length(str2) + length(str1));

Зачем вручную выделять память под string? насколько я помню, string - это динамически изменяемая строка длиной от 1 до 2 миллионов символов. Кажется выделять память нужно только под pchar.. Или как?
Цитата(Beltar @  8.1.2007,  11:31 Найти цитируемый пост)
Я провел опыт, похоже, что символы циклически повторяются
Chr(X)=Chr(X mod 255)

Да. Это так.
Цитата(Beltar @  8.1.2007,  11:31 Найти цитируемый пост)
Кстати, а в чем смысл Chr(3000)?

Чтобы у программистам было легче. Это связано, как мне кажется, с возможность шифрования типа a:=chr(ord(b)*10)


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
RinOSpro
Дата 8.1.2007, 23:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Извините в первом примере напутал 

вот

procedure TForm1.Button1Click(Sender: TObject);
var
str1 : string[1];
str2 : string;
i : integer;
begin
for i := 1 to 3000 do
begin
str1 :=chr(i);
str2 := str2+' '+str1;
end;
label1.Caption := str2;

теперь объясню! Просто числовое значение i использую как код символа str1 :=chr(i) и присваиваю  
str1. На самом деле делаю лабу по предмету криптография. А это кусочек кода просто ради примера. Оригинальный примерно такой же только переменные другие, и исходный текст предшествующий большой.

Вот на счет SetLength идея верная только что то пока не получается, хотя я и заранее устанавливал значение str2, ведь известно, что цикл до 3000 тогда SetLength(Str2, 3001);

Подскажите, может, как ни будь еще можно резервировать память под переменную. Хотя вроде String позволят хранить строку до 2 гб.

  Вверх
Snowy
Дата 9.1.2007, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



вообще-то chr это один байт - до 255.
Выше не бывает.
Так что объясни, что ты хочешь от этого кода.
PM MAIL   Вверх
RinOSpro
Дата 9.1.2007, 17:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Snowy,  Бывает если на пример chr(257) то выведется символ с кодом #1. А хочу я чтобы все значения str1 в цикле присваивались str2

str2:= str2+str1;
  Вверх
Sansa
Дата 9.1.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RinOSpro, Chr(1) = Chr(257)... 

Далее, в случае...
Цитата

for i := 1 to 3000 do
..
..
str2 := str2+' '+str1;
..
..
я и заранее устанавливал значение str2, ведь известно, что цикл до 3000 тогда SetLength(Str2, 3001);

Необходимо
Код

SetLength(Str2, 6000);

Т.е. от 1 до 3000 есть 3000 (3001 это если от 0) символов и столько же пробелов
--------------------
- Здравствуйте, я Ваш патологоанатом
PM MAIL ICQ   Вверх
MetalFan
Дата 9.1.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



что-то я не очень понимаю, чего хочет добиться автор кода в итоге)
но я бы написал этот кусок кода так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 str2 : string;
 i : integer;
begin
SetLength( str2, 3000);
for i := 1 to 3000 do
begin
  str2[i] := Chr(i);
end;
label1.Caption := str2;

будет работать 100% быстрее, чем просто lStr2 := lStr2 + lChr;

Это сообщение отредактировал(а) MetalFan - 9.1.2007, 19:00


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
RinOSpro
Дата 10.1.2007, 00:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну ёклмн это же просто элементарно 

str1 := chr(i)

str2 := str2+str1

получится все значения записываются подряд в одну и туже переменную

a б в г и так далее.

Вопрос в том почему str2 := str2+str1 такая запись не работает хотя такая label1.caption :=  label1.caption + str1; работает.

может память выделить надо!
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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