Invalid pointer addition

279
10 мая 2017, 09:54

Не понимаю, в одном проекте такой кусок кода работал с БД MSSQL, а здесь выдает ошибку, что в том проекте, я объявил глобальную переменную, что в этом, рез-т ошибка в этом случае

Memo1->Text = FDConnection1->ExecSQLScalar("select Исполнитель from Исполнители where id = "+test+"");

Не берет переменную, хотя в другом проекте, вот такой же код, даже с двумя переменными работает

Memo1->Text = FDConnection1->ExecSQLScalar("select вопрос from "+ntl+" where id = "+nq+"");

К базе подключено, если вместо переменной test, поставить цифру, то все работает, но мне нужен счетчик, в чем причина?

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int test = 1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Text = FDConnection1->ExecSQLScalar("select Исполнитель from 
Исполнители where id = "+test+"");
test++ ;
}

Весь код

Код работающего примера, приведу отрывок, ибо слишком много кода, лишнее убрал

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------------------
-
#pragma package(smart_init)
#pragma resource "*.dfm"
int nq = 1, c = 0, ot = 0,t = 0;
String nt;
String tab;
String ntl;
// Пройти тест
void __fastcall TForm1::N3Click(TObject *Sender)
{
nq = 1;
Label2->Caption = nq;
ntl = InputBox("Тест", "Введите имя", "");
Button8->Visible = true;
Memo1->Text = FDConnection1->ExecSQLScalar("select вопрос from "+ntl+" where 
id = "+nq+"");
Button1->Caption = FDConnection1->ExecSQLScalar("select О1 from "+ntl+" 
where id = "+nq+"");
Button2->Caption = FDConnection1->ExecSQLScalar("select О2 from "+ntl+" 
where id = "+nq+"");
if (FDConnection1->ExecSQLScalar("select О3 from "+ntl+" where id = "+nq+"") 
!= "")
{
Button3->Visible = true;
Button3->Caption = FDConnection1->ExecSQLScalar("select О3 from "+ntl+" 
where id = "+nq+"");
}
if (FDConnection1->ExecSQLScalar("select О4 from "+ntl+" where id = "+nq+"") 
!= "")
{
Button4->Visible = true;
Button4->Caption = FDConnection1->ExecSQLScalar("select О4 from "+ntl+" 
where id = "+nq+"");
}
}

Answer 1

Если самый первый бинарный оператор + в вашем выражении содержит объект типа String в качестве одного из своих операндов, то используется перегруженный оператор + для типа String, который очевидно выполняет конкатенацию строк. Результат работы такого оператора очевидно имеет тип String, то приводит к тому, что и все остальные операторы + в выражении интерпретируются как тот же самый перегруженный оператор + для типа String. Именно поэтому работают ваши примеры с переменной ntl, которая имеет тип String.

В вашем ошибочном выражении

"select Исполнитель from Исполнители where id = "+test+""

тип String не участвует вообще. В выражении участвуют только строковые литералы и целочисленные переменные. Выражение ошибочно, что вам компилятор ясно и сказал. Первый оператор + в этом выражении еще формально корректен (хоть и делает совсем не то, что вы хотели), а вот второй уже совершенно не корректен.

Если вы хотите именно конкатенации строк (в т.ч. строковых представлений чисел), выполняемой оператором + для типа String, то позаботьтесь о том, чтобы с самого начала выражение вычислялось в рамках типа String

String("select Исполнитель from Исполнители where id = ") + test + ""
READ ALSO
Библиотека не зарегистрирована. visual studio 2015

Библиотека не зарегистрирована. visual studio 2015

Подскажите, пожалуйста, кто сталкивался, что делать? О какой библиотеке идет речь?

329
Шаблоны std::function со сложными типами

Шаблоны std::function со сложными типами

Всем приветИмеется программа моделирующая поведение системы n-тел во времени

356
Функция MPI_Bcast не передает массив

Функция MPI_Bcast не передает массив

Изучаю параллельное программирование (MPI)При попытке передать массив всем процессам с помощью функции MPI_Bcast, сталкиваюсь с тем, что его получает...

272
Объявление классов внутри функций

Объявление классов внутри функций

Можно ли объявлять классы внутри функций? А передавать созданные таким образом объекты в другие функции? Например, данный код выполняется,...

242