передача строки в функцию
так, чтобы в функции обращаться к ней типа: strIn->Length();
делаю вот так:
{}
но при вызове функции пишет - несовпадение параметров
(типа хочу *)
или вылетает, если вызвать вот так:
*str = LabeledEdit1->Text;
gridFromString(str, gridIn);
так же вопрос - является ли оптимальной передача указателя на
объект TStringGrid в функцию(она только заполняет табличную часть),
или лучше в функции работать с массивом/таблицей, который затем вернуть, и как-то присвоить?
на вот этой строчке должен выругаться =) зачем тут *
UnicodeString *str;
А тут-то зачем * ?
так, чтобы в функции обращаться к ней типа: strIn->Length();
делаю вот так:
{}
но при вызове функции пишет - несовпадение параметров
(типа хочу *)
или вылетает, если вызвать вот так:
*str = LabeledEdit1->Text;
gridFromString(str, gridIn);
так же вопрос - является ли оптимальной передача указателя на
объект TStringGrid в функцию(она только заполняет табличную часть),
или лучше в функции работать с массивом/таблицей, который затем вернуть, и как-то присвоить?
если вам нужно дальше использовать строку - передавайте либо по ссылке, либо указателем (но тогда не забывайте о том, что надо проверять валидность указателя - в случае ссылки за вас это сделает компилятор)
Например код:
{
strIn.Length();
}
UnicodeString str = LabeledEdit1->Text;
gridFromString(strIn,gridOut);
если вы передаете указатель на строку, то надо так:
{
try{
strIn->Length();
}
catch(...){
}
}
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut);
//или - для тех кто забыл
//UnicodeString *str = new UnicodeString;
//*str = LabeledEdit1->Text;
//gridFromString(str,gridOut);
По второму вопросу - лучше передавать в функцию не указатель на грид, а указатель на TString, либо TStringList* - если задача просто добавить строку в грид.
Тогда функция будет выглядеть так:
{
try{
strIn->Length();
gridOut->Strings[0] = *strIn;
//Добавит строку в первую колонку
}
catch(...){
}
}
//Вызов функции
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut->Rows[(gridOut->RowCount-1)//Берем последнюю строку]);
код приведен для примера по памяти и может содержать ошибки. Проверяйте по справке.
если вы передаете указатель на строку, то надо так:
{
try{
strIn->Length();
}
catch(...){
}
}
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut);
//или - для тех кто забыл
//UnicodeString *str = new UnicodeString;
//*str = LabeledEdit1->Text;
//gridFromString(str,gridOut);
точно, похоже на правду, однако, в обоих вариантах,
уже в процессе выполнения ругается:
что, в общем-то, понятно:
&str - это, по-идее, адрес указателя на str в памяти,
который имеет тип double
если же привести заголовок функции в соответствие вызову:
ругается:
(то есть, обращаться можно через точку, но не через стрелку)
Тогда функция будет выглядеть так:
{
try{
strIn->Length();
gridOut->Strings[0] = *strIn;
//Добавит строку в первую колонку
}
catch(...){
}
}
//Вызов функции
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut->Rows[(gridOut->RowCount-1)//Берем последнюю строку]);
тут - всё ясно, однако, функция заполняет сразу таблицу, а не по строке
для этого, я так понял, надо использовать
gridOut->Cols, который как раз имеет тип *TStrings
Это во первых.
Во вторых - по поводу стрелки/точки - я в каждом коде привел вам, как обращаться к методам класса и в случае если передается ссылка и в случае если передается указатель. Кто вам доктор, что вы китайский копипаст?
В третьих - если заполняется вся таблица - то я хз, что вы под этим понимаете. Потому как я использовал прототип вашей же функции - и мне даже себе сложно представить, как вы данную таблицу заполнять собрались припомощи подобного кода :)
вы передаете в функцию указатель на таблицу и на строку. Что у вас в планах с этим делать - у меня даже фантазии не хватает - чем она эту таблицу будет заполнять.
Поэтому вам и написано - цифрами по вебу - читайте справку.
про точки-то всё понятно,
а вот со стрелками ситуация по-прежнему туманная:
ваш код:
{
try{
strIn->Length();
}
catch(...){
}
}
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut);
, так же как и код:
{
try{
strIn->Length();
gridOut->Strings[0] = *strIn;
//Добавит строку в первую колонку
}
catch(...){
}
}
//Вызов функции
UnicodeString str = LabeledEdit1->Text;
gridFromString(&str,gridOut->Rows[(gridOut->RowCount-1)
выдаёт ошибку на строке:
, не успевая войти в мою функцию
причём, что интересно, не в процессе компилляции, а при выполнении
в чём здесь может быть моя ошибка?
в копи-пасте?
перепроверил - копи-паст работает исправно...
На самом деле смотрите внимательно свой код - варианта два. Либо где то выше вы пытаетесь конвертировать строку в реальное число - либо операнд взятия адреса (&) в классе UnicodeString перегружен каким либо хитрым образом. Останавливается на строке вызова функции потому что, отладчик останавливается на следующей инструкции за ошибкой. Более вероятен первый вариант.
Может быть допущена ошибка в объявлении класса UnicodeString? Т.е. пропущена буква, или еще чтото? Похоже на то что есть проблемы с видимостью объявления класса.
Кстати если вы выполнили копипасту так как вы привели ее здесь - то это тоже может служить источником ошибок - потому как приводя код, я предполагаю что вы знаете правила объявления и определения функций в языке С++ - в том виде как приведено тоже работать будет - но может служить источником различных (неожиданных) приколов.
вместо:
варианта два. Либо где то выше вы пытаетесь конвертировать строку в реальное число - либо операнд взятия адреса (&) в классе UnicodeString перегружен каким либо хитрым образом.
читать
варианта два. Либо где то выше вы пытаетесь конвертировать строку в реальное число, либо есть проблемы с обявлением класса UnicodeString
UnicodeString *str = (UnicodeString *)ptr;
}
func( &str );