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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2015, 08:55   #1
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию С++, проблема с подсчетом в строке

Код:
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
	int n = 0, i, nst;
	nst = ComboBox1->ItemIndex;
	String st = ComboBox1->Items->Strings[nst];
	for (i = 0; i < st.Length(); i++)
	{
		if (( st[i] == ']') || (st[i] == '[') || (st[i] == '{') ||
		(st[i] == '}') || (st[i] == '(') || (st[i] == ')'))
		{
			n++;
		}
	}
	Edit1->Text = IntToStr(n);
}
Все компилируется, при нажатии на строку выдает ошибку "Range check error". Подскажите, что не так сделал.
В задании необходимо найти количество различных скобок в строке.
Dima-91 вне форума Ответить с цитированием
Старый 24.12.2015, 09:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
nst = ComboBox1->ItemIndex;
Проверки на nst==-1 почему не ставишь?
Вообще трассировал код? На каком моменте ошибка?
Ты уверен что она именно в этой функции?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.12.2015, 09:48   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Я ставлю на nst
waleri вне форума Ответить с цитированием
Старый 24.12.2015, 10:19   #4
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

делал вывод в Memo какое значение получает nst после, все нормально.
Код:
nst = ComboBox1->ItemIndex;
Memo1->Lines->Add(IntToStr(nst));
так же в отладчике посмотрел пошагово, какое значение принимает nst.

попробовал еще такую наработку
Код:
	int n = 0, i, nst;
	nst = ComboBox1->ItemIndex;
	if (nst != -1)
	{
	String st = ComboBox1->Items->Strings[nst];
	for (i = 0; i < st.Length(); i++)
	{
		if (( st[i] == ']') || (st[i] == '[') || (st[i] == '{') ||
		(st[i] == '}') || (st[i] == '(') || (st[i] == ')'))
		{
			n++;
		}
	}
	}
	else ShowMessage ("nst = -1");
	Edit1->Text = IntToStr(n);

Последний раз редактировалось Stilet; 24.12.2015 в 10:41.
Dima-91 вне форума Ответить с цитированием
Старый 24.12.2015, 10:42   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну тады не скажу... Криминала в коде не видно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.12.2015, 10:58   #6
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну тады не скажу... Криминала в коде не видно.
Может библиотек не хватает?
Код:
#include <vcl.h>
#pragma hdrstop
#include <string>

#include "zad7.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{
	if(Key==13)
	{
		 ComboBox1->Items->Add(ComboBox1->Text);
		 ComboBox1->Text="";
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
	Form1->ComboBox1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
	int n, i, nst;
	nst = ComboBox1->ItemIndex;
	if (nst != -1)
	{
	String st = ComboBox1->Items->Strings[nst];
	for (i = 0; i < st.Length(); i++)
	{
		if (( st[i] == ']') || (st[i] == '[') || (st[i] == '{') ||
		(st[i] == '}') || (st[i] == '(') || (st[i] == ')'))
		{
			n++;
		}
	}
	}
	else ShowMessage ("nst = -1");
	Edit1->Text = IntToStr(n);
}
это весь код

Последний раз редактировалось Dima-91; 24.12.2015 в 11:00.
Dima-91 вне форума Ответить с цитированием
Старый 24.12.2015, 11:16   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Какая версия Билдера? До ХЕ5 в билдеровских строках вроде с 1 индекс. (не путать с std::string, std::wstring, речь про AnsiString, WideString, UnicodeString, ..., String = AnsiString в версиях до 2009 и вроде UnicodeString после)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.12.2015, 11:17   #8
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

C++ Builder XE8.
Код:
#include <vcl.h>
#pragma hdrstop
#include <string>

#include "zad7.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{
	if(Key==13)
	{
		 ComboBox1->Items->Add(ComboBox1->Text);
		 ComboBox1->Text="";
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
	Form1->ComboBox1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
	int n, i, nst;
	nst = ComboBox1->ItemIndex;
	if (nst != -1)
	{
	String st = ComboBox1->Items->Strings[nst];
	for (i = 1; i < st.Length(); i++)
	{
		if (( st[i] == ']') || (st[i] == '[') || (st[i] == '{') ||
		(st[i] == '}') || (st[i] == '(') || (st[i] == ')'))
		{
			n++;
		}
	}
	}
	else ShowMessage ("nst = -1");
	Edit1->Text = IntToStr(n);
}
Решило проблему, но не пойму почему. Ведь как учат string с 0 начинается...
Dima-91 вне форума Ответить с цитированием
Старый 24.12.2015, 11:29   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

хм, мне казалось с ХЕ5 по умолчанию с 0 индексы строк. Ну раз нет, то еще в цикле < на <= поменять надо.

Цитата:
Ведь как учат string с 0
Читать до просветления
Цитата:
не путать с std::string, std::wstring, речь про AnsiString, WideString, UnicodeString, ..., String = AnsiString в версиях до 2009 и вроде UnicodeString после
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 24.12.2015 в 11:32.
Alex11223 вне форума Ответить с цитированием
Старый 24.12.2015, 11:37   #10
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

В консоли, с 0 хорошо работает. В оконном с 1. Может в оконном у меня Unicode а в консоли ansistring используется)
Dima-91 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# вопрос с подсчетом.. plutonyi Помощь студентам 1 04.05.2012 13:56
сортировка подсчетом С++ Guzal Помощь студентам 2 02.03.2011 08:40
Проблема с кодировкой в строке. Ghost of Night Работа с сетью в Delphi 2 03.12.2010 16:38
Проблема с подсчетом SerG1ON Microsoft Office Excel 0 04.02.2010 14:55
OpenGL проблема с подсчетом FPS AS10 Мультимедиа в Delphi 4 15.09.2009 21:17