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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2013, 05:23   #1
MariaD
Пользователь
 
Аватар для MariaD
 
Регистрация: 10.01.2013
Сообщений: 56
Восклицание Delphi.Программа выдает ошибку "is not a valid integer value

В программе нужно подсчитать количество смены знака на противоположный.Дан массив чисел.В институте все работало, а дома нет.

Вводила данные в Edit "3", в мемо 2,-3,0 .каждое число с новой строчки


Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, System.ComponentModel;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Memo1: TMemo;
    Label3: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Button2Click(Sender: TObject);
begin
Form2.Close;
Form1.Close;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
i,k,n:integer;
a:array[0..10] of integer;
begin
k:=0;
n:=StrToInt(Edit1.Text);
For i:=1 to n+1 do
a[i]:=StrToInt(memo1.Lines[i]);
i:=1;
While a[i]<>0 do begin
If a[i]*a[i+1]<0 then inc(k);
inc(i); end;
Label1.Caption := ('Знак меняется '+ FloatToStr(k) + ' раз');
end;

end.
MariaD вне форума Ответить с цитированием
Старый 30.03.2013, 07:35   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
Вводила данные в Edit "3", в мемо 2,-3,0
Цитата:
n=3
в мемо я так понимаю
Цитата:
2
-3
0
ошибки:
Код:
For i:=0 to n-1 do
a[i]:=StrToInt(memo1.Lines[i]);
i:=0;
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 30.03.2013, 09:24   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
в мемо я так понимаю

ошибки:
Код:
For i:=0 to n-1 do
a[i]:=StrToInt(memo1.Lines[i]);
i:=0;
Не забывай, что это Delphi, т.е. Object Pascal, а там индексация с 1, а не с 0, как в языках семейства Си(если ничего не путаю). Давно, очень давно работал с OP, но возьму на себя смелость предположить, что вся проблема в том, что после каждой строки в Memo идет символ перехода на новую строку (в Си это '\n'), вот и не работает. Хотя, конечно, очень странно, что в институте работало, а дома нет
Автору же предлагаю запустить код в режиме отладки, в Watch добавить "memo1.Lines[i]", посмотреть чему оно равно, а затем скопировать его в отдельную строковую переменную и попробовать преобразовать
Кстати, ошибка: "is not a valid integer value" означает: "не правильное целочисленное значение", т.е. "не могу преобразовать".
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 30.03.2013 в 09:27.
Mixim вне форума Ответить с цитированием
Старый 30.03.2013, 11:41   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Не забывай, что это Delphi, т.е. Object Pascal, а там индексация с 1, а не с 0, как в языках семейства Си(если ничего не путаю).
Путаете! и малого того, что сами заблуждаетесь, ещё и других пытаетесь в заблуждение ввести..

В Delphi (ну или в Object Pascal) все (ВСЕ) динамические структуры, все компоненты - обращение к первому элементу - это НУЛЕВОЙ индекс.
Единственное исключение, т.с. "наследие мрачных времён" - это обращение к символам строки.
Так исторически сложилось, что сначала строка (тип String) была типом = array[0..255] of char, где 0 символ строки нёс служебную нагрузку - там была длина строки. Поэтому первый символ строки индексировался через 1 (едииницу). Там и повелось. И позже, когда переменная типа String стала указателем на структуру, всё равно, S[1] - это первый символ строки.

НО!
Если нам нужна первая строчка из Мемо, то это, разумеется, Memo.Lines[0]
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.03.2013, 11:58   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

В дополнение к предыдущему сообщению:
тип string - вообще очень интересная штука, в частности, для него несправедливо утверждение "переменная типа String стала указателем на структуру".
Она стала не указателем, а неким псевдоуказателем, т.к. структура начинается на самом деле не там, куда показывает указатель, а на несколько байтов раньше.
Но это уже чисто специфика string в Delphi.
s-andriano вне форума Ответить с цитированием
Старый 30.03.2013, 12:01   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Еще не нужно забывать что StrToInt само по себе генерирует ошибку, так что его нужно менять на TryStrToInt() или StrToIntDef().
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2013, 15:17   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

s-andriano, хотя это к данной теме не относится, но я с вашим замечанием полностью согласен, так оно и есть.

Цитата:
Сообщение от Stilet
Еще не нужно забывать что StrToInt само по себе генерирует ошибку, так что его нужно менять на TryStrToInt() или StrToIntDef().
Ну, для начала нужно задавать правильные индексы, чтобы брать правильные строчки из Memo, потом позаботится о том, чтобы n (число указанное в Edit1) было корректным, а вот потом уже Ваш совет будет в точку!

Кстати, брать количество чисел из Edit1 - это неудобно и ненадёжно. Гораздо лучше брать числа из Memo, пока строчки не кончились и пока последнее число не равно нулю! И вот тогда, число прочитанных чисел и даст правильное n
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.03.2013, 15:46   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Гораздо лучше брать числа из Memo, пока строчки не кончились
Верно.
Код:
With Memo1 do  For i:=1 to Count-1 do  a[i]:=StrToIntDef(Lines[i],0);
И порядок.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2013, 17:02   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Виталий, и Вы туда же?!!!

Код:
With Memo1 do  For i:=0 to Count-1 do  a[i]:=StrToIntDef(Lines[i],0);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.03.2013, 17:45   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и Вы туда же?
Привычка
Бывает...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi выдает ошибку "Out of memory" Ol'ga Помощь студентам 5 30.05.2012 14:31
" is not valid integer value. Stringgrid в массив midletarket Помощь студентам 1 14.12.2010 14:34
Периодически выскакивает ошибка "not valid integer value" Dux Общие вопросы Delphi 11 07.10.2010 18:37
Ошибка(оконная а не компилятора) "is not a valid integer value" sinobithug Помощь студентам 6 14.08.2010 22:49
GetTickCount, ошибка "is not a valid integer value" Zeraim Общие вопросы Delphi 3 26.01.2010 19:11