У меня есть float**
и я хорошо знаю, что это особый тип указателя
Не совсем. Двойной указатель - это особый случай единственного указателя. Он по-прежнему является указателем на T
, а T
- float*
.
, потому что это массив элементов
Нет! Это is не массив. Он может указывать на первый элемент массива.
которые имеют поплавок *, который указывает на другую зону памяти.
Точнее, float**
может указывать на первый элемент массива, полный float*
. Там, где эти индивидуумы указывают на другую историю.
Итак, я пишу простой код для определения длины этой матрицы,
Вы не можете. Когда все, что у вас есть, является указателем на начало массива, тогда информация о размере уже потеряна.
То есть, если у вас есть конвенции для последнего элемента, как строки в стиле С или строковых литералов с их '\0'
терминатора. Это подводит нас к следующему пункту ...
int Loader:: Length(float** length)
{
int count=0;
while(*length[count]!='\0'){
Вот преступник. Не все массивы завершаются '\0'
. На самом деле, это не типично для произвольных массивов, содержащих разделитель нуля.
Так что если массив, чей первый элемент length
указывает на фактический элемент, который сравнивается с '\0'
, то ваш цикл пройдет один элемент за конец массива и попытается прочитать оттуда. В этот самый момент вызывается неопределенное поведение, и ваша программа может делать что угодно, включая случайные сбои.
Лучшее решение для вашей проблемы заключается в использовании std::vector
, потому что std::vector
всегда знает свой собственный размер. Так что сделайте это std::vector<float*>
. Или еще лучше, std::vector<std::vector<float>>
.
Фактически, если это действительно матрица, то сделайте это std::vector<float>
, сохраните все содержимое смежно, дополнительно сохраните ширину матрицы где-нибудь и всегда вычисляйте смещение для X/Y.
Примечание: '**' не является «двойным указателем», а «указателем на указатель». «Двойной указатель» обычно понимается как «double *». –