Не могу найти как узнать размер двумерного указателя. Я передаю указатель arrKeyRate
...
int row_arr_KeyRate = listRate.count();
QString **arrKeyRate = new QString* [row_arr_KeyRate];
int column_arr_KeyRate = 3;
for (int i=0; i<row_arr_KeyRate;i++) {
arrKeyRate[i] = new QString[column_arr_KeyRate];
}
for(int j=0; j<row_arr_KeyRate;j++) {
arrKeyRate[j][0]=listDataFrom.at(j);
arrKeyRate[j][1]=listDataTo.at(j);
arrKeyRate[j][2]=listRate.at(j);
}
emit(dataReadyRead(arrKeyRate));
...
Тут пытаюсь узнать его размер так sizeof(arrKeyRate)/sizeof(*arrKeyRate)
и так arrKeyRate[j]->count()
и так arrKeyRate[j]->size()
...
void MainWindow::dataUploader(QString **arrKeyRate)
{
for(int j=0; j<=sizeof(arrKeyRate)/sizeof(*arrKeyRate);j++){
qDebug()<<"MainWindow"<<arrKeyRate[j][0]<<arrKeyRate[j][1]<<arrKeyRate[j][2]<<sizeof(arrKeyRate)/sizeof(*arrKeyRate)<<sizeof(arrKeyRate)<<sizeof(*arrKeyRate);
}
}
...
Но он выводиться не весь так как размер не правильный.
Размер указателя вы и получаете:
sizeof(arrKeyRate) // должно вернуть 8 для 64-битного компилятора
(это размер QString**
указателя).
sizeof(*arrKeyRate)
(а это размер QString*
указателя). Кстати, их размер одинаковый.
Размер массива по указателю вы в c++
никак не получите. И логично же. Даже если взглянуть на "популярную" функцию в c
- точку входа в программу - можно обнаружить такую сигнатуру:
int main(int argc, char* argv[])
Первым параметром идет "длина" массива (длина не в байтах, а в "штуках"), вторым - сам массив (кстати, можно вместо char* argv[]
писать char** argv
, смысл практически не меняется).
Если вам нужно передавать куда-то двухмерный массив, вам необходимо также явно передать и длины его измерений, к примеру:
void MainWindow::dataUploader(int lengthX, int lengthY, QString **arrKeyRate) { ... }
Вы можете заметить, что хранить длину массива отдельно от самого массива - не особо-то удобно. И на помощь приходят вектора:
std::vector<std::vector<QString>> arrKeyRate(row_arr_KeyRate);
Ну и так далее - смысл понятен. Тогда для вектора вы сможете получать длину так:
int lengthX = arrKeyRate.size();
int lengthY = arrKeyRate[0].size();
Кстати, вторая строчка выполнится безопасно лишь в том случае, если в векторе 1 и больше подвекторов, так как мы берем длину первого подвектора. Ну с этим тоже разберетесь, думаю.
Вообше то у вас есть размер массива(вы сначала правильно писали, а размер любого указателья фиксированный)
arrKeyRate
содержит адрес первого элемента массива из row_arr_KeyRate
указателей, которые указывают на массив из int column_arr_KeyRate = 3;
элементов. Так что ваш массив имеет размер
row_arr_KeyRate` * column_arr_KeyRate
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Напишите код для консольного приложения, обрабатывающего исключение при переполнении разрядной сетки
Необходимо решить ABA - проблему, используя младшие биты в качестве счетчика
Короче, проблема в том, что не получается попадать в другие диски и папки(выше чем лежит исполняемый файл)И вообще сильное ощущение, что написана...