на картинку видно что передан только первый элемент массива, но почему.
#include <iostream>
using namespace std;
template <class T>
T arr_size(T arr[]) {
return sizeof(arr)/sizeof(T);
}
int main()
{
int nums[]{9, 23, 54, 23};
cout << arr_size<int>(new int[4]{7,34,54,14});
return 0;
}
Да потому что несмотря на вашу инициализацию
new int[4]{7,34,54,14}
вы получаете и передаете в шаблон указатель int*
. Поскольку в шаблон вы передаете массив по значению, тип низводится до указателя, и может принять ваш int*
без проблем. Именно по этой причине (из-за низведения) даже если вы передадите в шаблонную функцию ваш nums
- результат будет тем же.
У вас может сработать - для массива nums
, не для new int...
- вот такой шаблон:
template <class T, int N>
T arr_size(T (&arr)[N]) {
return sizeof(arr)/sizeof(T); // А еще лучше - return N;
}
Не надо судить о поведении языка программирования по поведению GUI в среде разработки.
В функцию передается указатель на начало массива. Через этот указатель вы спокойно увидите все элементы массива. Среда разработки на вашем скриншоте показала вам только тот элемент, на который непосредственно указывает ваш указатель, т.е. самый первый. Это совсем не означает, что остальные куда-то пропали.
В отладчике Visual Studio, чтобы увидеть несколько элементов массива через указатель, следует указывать, сколько именно элементов массива вы хотите увидеть. Это делается через синтаксис arr, 4
или arr, [4]
в окнах Watch, Quick Watch и т.п.
Отдельно стоит заметить, что попытка использовать трюк с делением sizeof
внутри вашей функции обречена на провал. Этот трюк работает только с массивами. У вас же внутри функции есть только указатель.
Из файла нужно считать массив в таблицу, а затем производить манипуляции с этой таблицей:
Вот код для подключения Sql Lite файла но не может открыть Db файл в правильном директории