EDITED Using template in C++ - run time error
-
I am trying hard to understand C++ templates. The following test code works as expected in class constructor. When I add SAME code to class method - which is is activated via an event - I get "index" out of range error. The error goes away when I include
QList information_main = QBluetoothLocalDevice::allDevices();
= QBluetoothLocalDevice::allDevices();
in the method. If the
QList information_main;
is "class variable" why do I have to "initialize " it again in the method?
The "index" is method variable (local) and is initialized to 0. - So why am I running out of index range ?
If you kindly answer the above and refrain from critiquing my coding style I would be grateful.
Thanks
// task retrive all locla BT devices
// changed to class variable
QList information_main = QBluetoothLocalDevice::allDevices();
qDebug() << "QDEBUG TRACE //11/23/2020 # of local BT detetced " << information_main.count();// add to display // add test text - output //on\_pushButton\_7\_clicked() ui->listWidget->addItem("MainWindow test # of local BT detetced "); ui->listWidget->addItem("# of local BT detetced "); ui->listWidget->addItem("information\_main.count())"); //TDOD add conversion ui->listWidget->addItem("TODO add conversion"); // ui->listWidget->addItem( fromStdString(information\_main.count()); //information\_main.first(); // display all adapters int index = 0; do { information\_main.at(index).address().toString(); ui->listWidget->addItem("information\_main.at(0).address()"); ui->listWidget->addItem( information\_main.at(index).address().toString()); ui->listWidget->addItem(" information\_main.at(0).name()"); ui->listWidget->addItem( information\_main.at(index).name()); index++; } while( index != information\_main.count() ); qDebug() << "file " << \_\_FILE\_\_; qDebug() << "function "<<\_\_FUNCTION\_\_; qDebug() << "@line " << \_\_LINE\_\_; qDebug()<<"TEMPORARY EXIT "; information\_main.count(); //exit(99);
#endif
EDITED
The purpose of the post is to identify WHY
the do-while loop works as coded in constructor and fails - run time error - when used in method.It is , as already posted , a test code.
The task is to read the list of devices returned byTemp
Member 14980433 wrote:
is "class variable" why do I have to "initialize " it again in the method?
You don't. What you have done is to create a second local variable inside that method with the same name as the class level one. Change the code inside the method to just:
information_main = QBluetoothLocalDevice::allDevices();
The error message is less easy to diagnose, so you need to use the debugger to check what value it is when the error occurs.
-
I am trying hard to understand C++ templates. The following test code works as expected in class constructor. When I add SAME code to class method - which is is activated via an event - I get "index" out of range error. The error goes away when I include
QList information_main = QBluetoothLocalDevice::allDevices();
= QBluetoothLocalDevice::allDevices();
in the method. If the
QList information_main;
is "class variable" why do I have to "initialize " it again in the method?
The "index" is method variable (local) and is initialized to 0. - So why am I running out of index range ?
If you kindly answer the above and refrain from critiquing my coding style I would be grateful.
Thanks
// task retrive all locla BT devices
// changed to class variable
QList information_main = QBluetoothLocalDevice::allDevices();
qDebug() << "QDEBUG TRACE //11/23/2020 # of local BT detetced " << information_main.count();// add to display // add test text - output //on\_pushButton\_7\_clicked() ui->listWidget->addItem("MainWindow test # of local BT detetced "); ui->listWidget->addItem("# of local BT detetced "); ui->listWidget->addItem("information\_main.count())"); //TDOD add conversion ui->listWidget->addItem("TODO add conversion"); // ui->listWidget->addItem( fromStdString(information\_main.count()); //information\_main.first(); // display all adapters int index = 0; do { information\_main.at(index).address().toString(); ui->listWidget->addItem("information\_main.at(0).address()"); ui->listWidget->addItem( information\_main.at(index).address().toString()); ui->listWidget->addItem(" information\_main.at(0).name()"); ui->listWidget->addItem( information\_main.at(index).name()); index++; } while( index != information\_main.count() ); qDebug() << "file " << \_\_FILE\_\_; qDebug() << "function "<<\_\_FUNCTION\_\_; qDebug() << "@line " << \_\_LINE\_\_; qDebug()<<"TEMPORARY EXIT "; information\_main.count(); //exit(99);
#endif
EDITED
The purpose of the post is to identify WHY
the do-while loop works as coded in constructor and fails - run time error - when used in method.It is , as already posted , a test code.
The task is to read the list of devices returned byTemp
Declaring a variable and initializing it are two different things. Declaring a variable
QList information_main;
is just that, a container with nothing in it. Chaning to this may give you an 'information_main' variable with something in it, maybe not.
QList information_main = QBluetoothLocalDevice::allDevices();
If nothing is in the container, your do-while will fail, as there is no index zero. How about using a for loop;
for (int i = 0; i < information_main.size(); i++)
or use iterators, see some examples here iterator Class | Qt Core 5.15.2[^]
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment "Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst "I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
-
I am trying hard to understand C++ templates. The following test code works as expected in class constructor. When I add SAME code to class method - which is is activated via an event - I get "index" out of range error. The error goes away when I include
QList information_main = QBluetoothLocalDevice::allDevices();
= QBluetoothLocalDevice::allDevices();
in the method. If the
QList information_main;
is "class variable" why do I have to "initialize " it again in the method?
The "index" is method variable (local) and is initialized to 0. - So why am I running out of index range ?
If you kindly answer the above and refrain from critiquing my coding style I would be grateful.
Thanks
// task retrive all locla BT devices
// changed to class variable
QList information_main = QBluetoothLocalDevice::allDevices();
qDebug() << "QDEBUG TRACE //11/23/2020 # of local BT detetced " << information_main.count();// add to display // add test text - output //on\_pushButton\_7\_clicked() ui->listWidget->addItem("MainWindow test # of local BT detetced "); ui->listWidget->addItem("# of local BT detetced "); ui->listWidget->addItem("information\_main.count())"); //TDOD add conversion ui->listWidget->addItem("TODO add conversion"); // ui->listWidget->addItem( fromStdString(information\_main.count()); //information\_main.first(); // display all adapters int index = 0; do { information\_main.at(index).address().toString(); ui->listWidget->addItem("information\_main.at(0).address()"); ui->listWidget->addItem( information\_main.at(index).address().toString()); ui->listWidget->addItem(" information\_main.at(0).name()"); ui->listWidget->addItem( information\_main.at(index).name()); index++; } while( index != information\_main.count() ); qDebug() << "file " << \_\_FILE\_\_; qDebug() << "function "<<\_\_FUNCTION\_\_; qDebug() << "@line " << \_\_LINE\_\_; qDebug()<<"TEMPORARY EXIT "; information\_main.count(); //exit(99);
#endif
EDITED
The purpose of the post is to identify WHY
the do-while loop works as coded in constructor and fails - run time error - when used in method.It is , as already posted , a test code.
The task is to read the list of devices returned byTemp
Is there a chance that the following call
QBluetoothLocalDevice::allDevices();
may return no devices? If so, your do-while loop will have an out of range issue.
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment "Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst "I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
-
Is there a chance that the following call
QBluetoothLocalDevice::allDevices();
may return no devices? If so, your do-while loop will have an out of range issue.
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment "Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst "I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
Thanks for the reply. Good point, but does not address the question. The do-while-loop compares the index to count of the items being processed. No count , no processing, Yes, I could check the count before entering the loop. I am sure I will find more "elegant" way to process the items and stop the loop.
-
Member 14980433 wrote:
is "class variable" why do I have to "initialize " it again in the method?
You don't. What you have done is to create a second local variable inside that method with the same name as the class level one. Change the code inside the method to just:
information_main = QBluetoothLocalDevice::allDevices();
The error message is less easy to diagnose, so you need to use the debugger to check what value it is when the error occurs.
What you have done is to create a second local variable inside that method with the same name as the class level one
So the variable in class takes precedence over the variable in method? Then why is the error saying the "index" is out of range? The "index" is local in constructor and also local in method.
-
Thanks for the reply. Good point, but does not address the question. The do-while-loop compares the index to count of the items being processed. No count , no processing, Yes, I could check the count before entering the loop. I am sure I will find more "elegant" way to process the items and stop the loop.
Member 14980433 wrote:
No count , no processing,
No, you're going to process it once before size is checked, and likely crash if the list is empty.
Member 14980433 wrote:
I am sure I will find more "elegant" way to process the items and stop the loop.
Indeed, most likely a for loop.
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment "Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst "I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
-
What you have done is to create a second local variable inside that method with the same name as the class level one
So the variable in class takes precedence over the variable in method? Then why is the error saying the "index" is out of range? The "index" is local in constructor and also local in method.
Member 14980433 wrote:
So the variable in class takes precedence over the variable in method?
No, you cannot have two variables with the same name in scope at the same time.
Asking questions is a skill CodeProject Forum Guidelines Google: C# How to debug code Seriously, go read these articles.
Dave Kreskowiak -
What you have done is to create a second local variable inside that method with the same name as the class level one
So the variable in class takes precedence over the variable in method? Then why is the error saying the "index" is out of range? The "index" is local in constructor and also local in method.
No, the other way round. The variable declared in the method will be the one that is used, as it is in the innermost scope. But you should not be declaring the same variable at two scope levels. Just change your code as I suggested to correct the problem. As to the index problem, i suggest you change the
do while
to a simplewhile
orfor
loop, to ensure you do not enter the loop ifinformation_main.count()
returns zero. -
Member 14980433 wrote:
No count , no processing,
No, you're going to process it once before size is checked, and likely crash if the list is empty.
Member 14980433 wrote:
I am sure I will find more "elegant" way to process the items and stop the loop.
Indeed, most likely a for loop.
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment "Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst "I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
No, you're going to process it once before size is checked, and likely crash if the list is empty.
My objective is to identify the reason for the "out of range "error. I am getting same when accessing another template list. Ok, let's make an assumption the do-while " list " is indeed empty. ( It is not ) Would the compiler produce the "index out of range" error then ?
-
No, the other way round. The variable declared in the method will be the one that is used, as it is in the innermost scope. But you should not be declaring the same variable at two scope levels. Just change your code as I suggested to correct the problem. As to the index problem, i suggest you change the
do while
to a simplewhile
orfor
loop, to ensure you do not enter the loop ifinformation_main.count()
returns zero.So in other words "index" in constructor and "index" in methods are independent , hence not source of the "out of range error". That should apply to any variable, including template. I understand that using same names could be buggy, but I need to verify WHAT is causing the "out of range error" and IMHO using DIFFERENT names should not be "real " solutions, unless something else is wrong with my implementation of templates. As I said - this is a test code and the "count" is used to simply verify the list content prior to doing the "do -while " loop and it is > 0. I have never used "iteration" but planning to employ it after I get the "out of range " error Solved.
-
So in other words "index" in constructor and "index" in methods are independent , hence not source of the "out of range error". That should apply to any variable, including template. I understand that using same names could be buggy, but I need to verify WHAT is causing the "out of range error" and IMHO using DIFFERENT names should not be "real " solutions, unless something else is wrong with my implementation of templates. As I said - this is a test code and the "count" is used to simply verify the list content prior to doing the "do -while " loop and it is > 0. I have never used "iteration" but planning to employ it after I get the "out of range " error Solved.
Having this;
QList information_main;
inside the method creates a new Qlist type variable called 'information_main', this variable is totally different than the class variable called 'information_main' that has been initialized in a class constructor. This new QList variable (the one just declared inside the method) is empty because you just created it and have not added anything to it. When you make an indexed access to an empty QList variable it will fail. That's why you have to initialize (add stuff to) the new QList variable (the one just declared inside the method) to get the loop to work.
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment "Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst "I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
-
So in other words "index" in constructor and "index" in methods are independent , hence not source of the "out of range error". That should apply to any variable, including template. I understand that using same names could be buggy, but I need to verify WHAT is causing the "out of range error" and IMHO using DIFFERENT names should not be "real " solutions, unless something else is wrong with my implementation of templates. As I said - this is a test code and the "count" is used to simply verify the list content prior to doing the "do -while " loop and it is > 0. I have never used "iteration" but planning to employ it after I get the "out of range " error Solved.
Yes, as I mentioned above the one in the innermost scope is the one that will be used; that is the one declared inside the method. But you really should not create variables with the same name like this, it just confuses people, particularly you. See my last sentence in the previous reply for a possible fix to the out of range error. But you should really capture the count first in a variable and test it to see if it returns a ositive value.
-
No, you're going to process it once before size is checked, and likely crash if the list is empty.
My objective is to identify the reason for the "out of range "error. I am getting same when accessing another template list. Ok, let's make an assumption the do-while " list " is indeed empty. ( It is not ) Would the compiler produce the "index out of range" error then ?
-
Yes, as I mentioned above the one in the innermost scope is the one that will be used; that is the one declared inside the method. But you really should not create variables with the same name like this, it just confuses people, particularly you. See my last sentence in the previous reply for a possible fix to the out of range error. But you should really capture the count first in a variable and test it to see if it returns a ositive value.
I am not sure who is confused. Just read the original post and subsequent comments. So far it looks as the template code fails if there are NO items in it. That makes sense, but it is not the primary issue - just nice to know. However, the list is not empty and I still do not have an answer to the original post. Maybe I should rephrase the question. The template list content was created by other process, what I want is to read it - I do not want to rebuild / reinitialize it. I can read it fine first time in constructor, now I like to read it again in method. I do not want to reinitialize it. And I am doing it wrong , and the matching names is NOT the issue. I do not want to reinitialize it.
-
I am not sure who is confused. Just read the original post and subsequent comments. So far it looks as the template code fails if there are NO items in it. That makes sense, but it is not the primary issue - just nice to know. However, the list is not empty and I still do not have an answer to the original post. Maybe I should rephrase the question. The template list content was created by other process, what I want is to read it - I do not want to rebuild / reinitialize it. I can read it fine first time in constructor, now I like to read it again in method. I do not want to reinitialize it. And I am doing it wrong , and the matching names is NOT the issue. I do not want to reinitialize it.
Member 14980433 wrote:
I am not sure who is confused.
I am, because there is still some information missing. And I cannot understand why you need to read this information inside the constructor (which is definitely wrong), as well as in the method (which is correct). But to go back to the main point, the only way to resolve the index out of range problem is to use the debugger and step through the code as it runs.
-
No, you're going to process it once before size is checked, and likely crash if the list is empty.
My objective is to identify the reason for the "out of range "error. I am getting same when accessing another template list. Ok, let's make an assumption the do-while " list " is indeed empty. ( It is not ) Would the compiler produce the "index out of range" error then ?
Member 14980433 wrote:
Ok, let's make an assumption the do-while " list " is indeed empty. ( It is not )
Why are you sure it is non-empty? How did did you check it? Using debugger? Using TRACE with the item count? Using something else?
-
I am trying hard to understand C++ templates. The following test code works as expected in class constructor. When I add SAME code to class method - which is is activated via an event - I get "index" out of range error. The error goes away when I include
QList information_main = QBluetoothLocalDevice::allDevices();
= QBluetoothLocalDevice::allDevices();
in the method. If the
QList information_main;
is "class variable" why do I have to "initialize " it again in the method?
The "index" is method variable (local) and is initialized to 0. - So why am I running out of index range ?
If you kindly answer the above and refrain from critiquing my coding style I would be grateful.
Thanks
// task retrive all locla BT devices
// changed to class variable
QList information_main = QBluetoothLocalDevice::allDevices();
qDebug() << "QDEBUG TRACE //11/23/2020 # of local BT detetced " << information_main.count();// add to display // add test text - output //on\_pushButton\_7\_clicked() ui->listWidget->addItem("MainWindow test # of local BT detetced "); ui->listWidget->addItem("# of local BT detetced "); ui->listWidget->addItem("information\_main.count())"); //TDOD add conversion ui->listWidget->addItem("TODO add conversion"); // ui->listWidget->addItem( fromStdString(information\_main.count()); //information\_main.first(); // display all adapters int index = 0; do { information\_main.at(index).address().toString(); ui->listWidget->addItem("information\_main.at(0).address()"); ui->listWidget->addItem( information\_main.at(index).address().toString()); ui->listWidget->addItem(" information\_main.at(0).name()"); ui->listWidget->addItem( information\_main.at(index).name()); index++; } while( index != information\_main.count() ); qDebug() << "file " << \_\_FILE\_\_; qDebug() << "function "<<\_\_FUNCTION\_\_; qDebug() << "@line " << \_\_LINE\_\_; qDebug()<<"TEMPORARY EXIT "; information\_main.count(); //exit(99);
#endif
EDITED
The purpose of the post is to identify WHY
the do-while loop works as coded in constructor and fails - run time error - when used in method.It is , as already posted , a test code.
The task is to read the list of devices returned byTemp
This thread is not very productive. Please do not waste your time "taking side trips" , perhaps re-read the original EDITED post to concentrate on the real issue. I am using the templates wrong and have no idea why. Thanks for understanding.
-
This thread is not very productive. Please do not waste your time "taking side trips" , perhaps re-read the original EDITED post to concentrate on the real issue. I am using the templates wrong and have no idea why. Thanks for understanding.
-
I am trying hard to understand C++ templates. The following test code works as expected in class constructor. When I add SAME code to class method - which is is activated via an event - I get "index" out of range error. The error goes away when I include
QList information_main = QBluetoothLocalDevice::allDevices();
= QBluetoothLocalDevice::allDevices();
in the method. If the
QList information_main;
is "class variable" why do I have to "initialize " it again in the method?
The "index" is method variable (local) and is initialized to 0. - So why am I running out of index range ?
If you kindly answer the above and refrain from critiquing my coding style I would be grateful.
Thanks
// task retrive all locla BT devices
// changed to class variable
QList information_main = QBluetoothLocalDevice::allDevices();
qDebug() << "QDEBUG TRACE //11/23/2020 # of local BT detetced " << information_main.count();// add to display // add test text - output //on\_pushButton\_7\_clicked() ui->listWidget->addItem("MainWindow test # of local BT detetced "); ui->listWidget->addItem("# of local BT detetced "); ui->listWidget->addItem("information\_main.count())"); //TDOD add conversion ui->listWidget->addItem("TODO add conversion"); // ui->listWidget->addItem( fromStdString(information\_main.count()); //information\_main.first(); // display all adapters int index = 0; do { information\_main.at(index).address().toString(); ui->listWidget->addItem("information\_main.at(0).address()"); ui->listWidget->addItem( information\_main.at(index).address().toString()); ui->listWidget->addItem(" information\_main.at(0).name()"); ui->listWidget->addItem( information\_main.at(index).name()); index++; } while( index != information\_main.count() ); qDebug() << "file " << \_\_FILE\_\_; qDebug() << "function "<<\_\_FUNCTION\_\_; qDebug() << "@line " << \_\_LINE\_\_; qDebug()<<"TEMPORARY EXIT "; information\_main.count(); //exit(99);
#endif
EDITED
The purpose of the post is to identify WHY
the do-while loop works as coded in constructor and fails - run time error - when used in method.It is , as already posted , a test code.
The task is to read the list of devices returned byTemp
Member 14980433 wrote:
Template "list" = QBluetoothLocalDevice::allDevices(); It would be nice if contributions lead to resolve this SPECIFIC problem. Naming variables, verifying validity of "loop index / count" , pointing out the code is repeated in class method so far does not addresses my error usage of template.
Did you use the Debugger to check what this
QBluetoothLocalDevice::allDevices();
returns?
-
I am trying hard to understand C++ templates. The following test code works as expected in class constructor. When I add SAME code to class method - which is is activated via an event - I get "index" out of range error. The error goes away when I include
QList information_main = QBluetoothLocalDevice::allDevices();
= QBluetoothLocalDevice::allDevices();
in the method. If the
QList information_main;
is "class variable" why do I have to "initialize " it again in the method?
The "index" is method variable (local) and is initialized to 0. - So why am I running out of index range ?
If you kindly answer the above and refrain from critiquing my coding style I would be grateful.
Thanks
// task retrive all locla BT devices
// changed to class variable
QList information_main = QBluetoothLocalDevice::allDevices();
qDebug() << "QDEBUG TRACE //11/23/2020 # of local BT detetced " << information_main.count();// add to display // add test text - output //on\_pushButton\_7\_clicked() ui->listWidget->addItem("MainWindow test # of local BT detetced "); ui->listWidget->addItem("# of local BT detetced "); ui->listWidget->addItem("information\_main.count())"); //TDOD add conversion ui->listWidget->addItem("TODO add conversion"); // ui->listWidget->addItem( fromStdString(information\_main.count()); //information\_main.first(); // display all adapters int index = 0; do { information\_main.at(index).address().toString(); ui->listWidget->addItem("information\_main.at(0).address()"); ui->listWidget->addItem( information\_main.at(index).address().toString()); ui->listWidget->addItem(" information\_main.at(0).name()"); ui->listWidget->addItem( information\_main.at(index).name()); index++; } while( index != information\_main.count() ); qDebug() << "file " << \_\_FILE\_\_; qDebug() << "function "<<\_\_FUNCTION\_\_; qDebug() << "@line " << \_\_LINE\_\_; qDebug()<<"TEMPORARY EXIT "; information\_main.count(); //exit(99);
#endif
EDITED
The purpose of the post is to identify WHY
the do-while loop works as coded in constructor and fails - run time error - when used in method.It is , as already posted , a test code.
The task is to read the list of devices returned byTemp
Could you post your class definition and the whole of your method?
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment "Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst "I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle