Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

передача строки в функцию

45K
17 декабря 2009 года
any_stuff
38 / / 16.09.2009
необходимо передать в функцию строку
так, чтобы в функции обращаться к ней типа: strIn->Length();
делаю вот так:
 
Код:
void __fastcall Tform1::gridFromString(UnicodeString *strIn, TStringGrid *gridOut)
{}

но при вызове функции пишет - несовпадение параметров
(типа хочу *)
или вылетает, если вызвать вот так:
 
Код:
UnicodeString *str;
*str = LabeledEdit1->Text;
gridFromString(str, gridIn);


так же вопрос - является ли оптимальной передача указателя на
объект TStringGrid в функцию(она только заполняет табличную часть),
или лучше в функции работать с массивом/таблицей, который затем вернуть, и как-то присвоить?
92
17 декабря 2009 года
Тень Пса
2.2K / / 19.10.2006
 
Код:
*str = LabeledEdit1->Text;


на вот этой строчке должен выругаться =) зачем тут *
247
17 декабря 2009 года
wanja
1.2K / / 03.02.2003
Цитата: any_stuff

UnicodeString *str;


А тут-то зачем * ?

45K
17 декабря 2009 года
any_stuff
38 / / 16.09.2009
ну, мне ж надо в функцию указатель на строку передать...
1
17 декабря 2009 года
kot_
7.3K / / 20.01.2000
Тем кто отписал тут выше про "зачем *?" - читать страуструпа до просветления - в следующий раз буду снижать репутацию и выдавать нарушения.
Цитата: any_stuff
необходимо передать в функцию строку
так, чтобы в функции обращаться к ней типа: strIn->Length();
делаю вот так:
 
Код:
void __fastcall Tform1::gridFromString(UnicodeString *strIn, TStringGrid *gridOut)
{}

но при вызове функции пишет - несовпадение параметров
(типа хочу *)
или вылетает, если вызвать вот так:
 
Код:
UnicodeString *str;
*str = LabeledEdit1->Text;
gridFromString(str, gridIn);


так же вопрос - является ли оптимальной передача указателя на
объект TStringGrid в функцию(она только заполняет табличную часть),
или лучше в функции работать с массивом/таблицей, который затем вернуть, и как-то присвоить?


если вам нужно дальше использовать строку - передавайте либо по ссылке, либо указателем (но тогда не забывайте о том, что надо проверять валидность указателя - в случае ссылки за вас это сделает компилятор)
Например код:

 
Код:
void __fastcall Tform1::gridFromString(UnicodeString &strIn, TStringGrid *gridOut)
{
strIn.Length();
}
UnicodeString str = LabeledEdit1->Text;
gridFromString(strIn,gridOut);

если вы передаете указатель на строку, то надо так:
Код:
void __fastcall Tform1::gridFromString(UnicodeString *strIn, TStringGrid *gridOut)
{
try{
strIn->Length();
}
catch(...){
}
}
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut);
//или - для тех кто забыл
//UnicodeString *str = new UnicodeString;
//*str = LabeledEdit1->Text;
//gridFromString(str,gridOut);

По второму вопросу - лучше передавать в функцию не указатель на грид, а указатель на TString, либо TStringList* - если задача просто добавить строку в грид.
Тогда функция будет выглядеть так:
Код:
void __fastcall Tform1::gridFromString(UnicodeString *strIn, TStrings *gridOut)
{
try{
strIn->Length();
gridOut->Strings[0] = *strIn;
//Добавит строку в первую колонку
}
catch(...){
}
}
//Вызов функции
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut->Rows[(gridOut->RowCount-1)//Берем последнюю строку]);

код приведен для примера по памяти и может содержать ошибки. Проверяйте по справке.
92
17 декабря 2009 года
Тень Пса
2.2K / / 19.10.2006
ммда... надо было выспаться :)))
45K
17 декабря 2009 года
any_stuff
38 / / 16.09.2009
Цитата: kot_

если вы передаете указатель на строку, то надо так:
Код:
void __fastcall Tform1::gridFromString(UnicodeString *strIn, TStringGrid *gridOut)
{
try{
strIn->Length();
}
catch(...){
}
}
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut);
//или - для тех кто забыл
//UnicodeString *str = new UnicodeString;
//*str = LabeledEdit1->Text;
//gridFromString(str,gridOut);


точно, похоже на правду, однако, в обоих вариантах,
уже в процессе выполнения ругается:

Цитата:
First chance exception at $7C812A6B. Exception class EVariantTypeCastError with message 'Could not convert variant of type (UnicodeString) into type (Double)'.


что, в общем-то, понятно:
&str - это, по-идее, адрес указателя на str в памяти,
который имеет тип double
если же привести заголовок функции в соответствие вызову:

 
Код:
void __fastcall Tform1::gridFromString(UnicodeString &strIn, TStringGrid *gridOut)

ругается:
Цитата:
[BCC32 Error] ip.cpp(35): E2288 Pointer to structure required on left side of -> or ->*


(то есть, обращаться можно через точку, но не через стрелку)

Цитата:
По второму вопросу - лучше передавать в функцию не указатель на грид, а указатель на TString, либо TStringList* - если задача просто добавить строку в грид.
Тогда функция будет выглядеть так:
Код:
void __fastcall Tform1::gridFromString(UnicodeString *strIn, TStrings *gridOut)
{
try{
strIn->Length();
gridOut->Strings[0] = *strIn;
//Добавит строку в первую колонку
}
catch(...){
}
}
//Вызов функции
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut->Rows[(gridOut->RowCount-1)//Берем последнюю строку]);


тут - всё ясно, однако, функция заполняет сразу таблицу, а не по строке
для этого, я так понял, надо использовать
gridOut->Cols, который как раз имеет тип *TStrings

1
17 декабря 2009 года
kot_
7.3K / / 20.01.2000
Уважаемый - вы пожалуйста свои ошибки к моему коду не привязывайте. Я вам привел пример как это делается по человечески - а то что вы там заполняете - и ваши ошибки приведения типов - это вы разбирайтесь при помощи отладчика.
Это во первых.
Во вторых - по поводу стрелки/точки - я в каждом коде привел вам, как обращаться к методам класса и в случае если передается ссылка и в случае если передается указатель. Кто вам доктор, что вы китайский копипаст?
В третьих - если заполняется вся таблица - то я хз, что вы под этим понимаете. Потому как я использовал прототип вашей же функции - и мне даже себе сложно представить, как вы данную таблицу заполнять собрались припомощи подобного кода :)
вы передаете в функцию указатель на таблицу и на строку. Что у вас в планах с этим делать - у меня даже фантазии не хватает - чем она эту таблицу будет заполнять.
Поэтому вам и написано - цифрами по вебу - читайте справку.
45K
17 декабря 2009 года
any_stuff
38 / / 16.09.2009
Цитата:
по поводу стрелки/точки - я в каждом коде привел вам, как обращаться к методам класса


про точки-то всё понятно,
а вот со стрелками ситуация по-прежнему туманная:
ваш код:

 
Код:
void __fastcall Tform1::gridFromString(UnicodeString *strIn, TStringGrid *gridOut)
{
try{
strIn->Length();
}
catch(...){
}
}
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut);

, так же как и код:
Код:
void __fastcall Tform1::gridFromString(UnicodeString *strIn, TStrings *gridOut)
{
try{
strIn->Length();
gridOut->Strings[0] = *strIn;
//Добавит строку в первую колонку
}
catch(...){
}
}
//Вызов функции
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut->Rows[(gridOut->RowCount-1)

выдаёт ошибку на строке:
 
Код:
gridFromString(&str,gridOut);
или, соответственно,
 
Код:
gridFromString(&str,gridOut->Rows[(gridOut->RowCount-1);
Цитата:
'Could not convert variant of type (UnicodeString) into type (Double)'.

, не успевая войти в мою функцию
причём, что интересно, не в процессе компилляции, а при выполнении
в чём здесь может быть моя ошибка?
в копи-пасте?
перепроверил - копи-паст работает исправно...

1
18 декабря 2009 года
kot_
7.3K / / 20.01.2000
Вы уж не обижайтесь - но обычно в таких случаях говорят о ошибках в коде генетическом. :) шутка.
На самом деле смотрите внимательно свой код - варианта два. Либо где то выше вы пытаетесь конвертировать строку в реальное число - либо операнд взятия адреса (&) в классе UnicodeString перегружен каким либо хитрым образом. Останавливается на строке вызова функции потому что, отладчик останавливается на следующей инструкции за ошибкой. Более вероятен первый вариант.
Может быть допущена ошибка в объявлении класса UnicodeString? Т.е. пропущена буква, или еще чтото? Похоже на то что есть проблемы с видимостью объявления класса.
Кстати если вы выполнили копипасту так как вы привели ее здесь - то это тоже может служить источником ошибок - потому как приводя код, я предполагаю что вы знаете правила объявления и определения функций в языке С++ - в том виде как приведено тоже работать будет - но может служить источником различных (неожиданных) приколов.
1
18 декабря 2009 года
kot_
7.3K / / 20.01.2000
в запарке написал фигню. Из вышеописанного читать надо так:
вместо:
Цитата:

варианта два. Либо где то выше вы пытаетесь конвертировать строку в реальное число - либо операнд взятия адреса (&) в классе UnicodeString перегружен каким либо хитрым образом.


читать

Цитата:

варианта два. Либо где то выше вы пытаетесь конвертировать строку в реальное число, либо есть проблемы с обявлением класса UnicodeString

55K
04 января 2010 года
RabiatoR
6 / / 04.01.2010
Лучше просто передать адрес памяти строки и не париться :)
 
Код:
void func( const void *ptr ){
    UnicodeString *str = (UnicodeString *)ptr;
}
func( &str );
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог