2014-12-05 3 views
0

У меня есть указатель * double массив и в основном они индексируются в любом порядке.Как проверить, существует ли массив индекс

Например,

double[0][0] = 80.0 
double[3][0] = 56.8 
double[4][0] = 56.7 

Как, например, проверить, если double[1][2] существует, а затем создать один, если он не делает.

Я не собираюсь использовать vectors или что-либо еще 'fancy', просто массивы.

+4

С помощью простых массивов он не может. Вам нужно как-то следить за размером. – bzeaman

+0

Если вы планируете делать это в массиве, в котором известен размер, вы можете инициализировать все индексы со значением по умолчанию, а затем перейти к простой проверке. Если вы хотите создать изменяемый массив, который растет его размер динамически, тогда я бы использовал, используя что-то «странное». – streppel

+0

Ваш лучший выбор - инициализировать массив с некоторым количеством дозорных значений, значение, которое никогда не будет иметь реальных данных. Тогда 'if (array [3] [4] == SENTINEL) {' и так далее. – TheBigH

ответ

2

Hm. Ну, если вы действительно хотите сделать это с помощью простых массивов (почему?), Вы не можете много сделать, но полагаться на магическое значение. Я бы предложил std::numeric_limits<double>::quiet_NaN() (NaN = не число). То есть:

#include <algorithm> 
#include <limits> 

double data[10][20]; // maximum dimensions mandatory with arrays. There's 
        // no way around that, and you can't grow it later. 

std::fill(data[0], data[0] + 10 * 20, std::numeric_limits<double>::quiet_NaN()); 

Затем вы можете позже проверить, есть ли реальное значение в массиве, как так:

if(!std::isnan(data[1][2])) {   // #include <cmath> for std::isnan 
    // oh, look, there's a value here! 
} else { 
    // Nothing here yet. Better fill it 
    data[1][2] = 123.0; 
} 

Предостережения: Если ваши расчеты могут производить NaN самих значений, вы влипли сюда. Это происходит, например, если вы попытаетесь вычислить 0.0/0.0 или std::sqrt(-1) или std::log(-1) или что-то еще, что не имеет определенного значения в действиях. Если ваши вычисления производят NaN, и вы записываете их в массив, этот подход будет действовать так, как если бы значение никогда не было написано там.

+0

, когда вы объявляете массив, вы должны были дать ему размер. Например, «double myArray [20] [20]; поэтому вы знаете, что наибольшее смещение будет myArray [19] [19] (смещения начинаются с 0 в C) – user3629249

+0

Я немного смущен, почему вы мне это рассказываете. – Wintermute

+0

@ user3629249 Вы, кажется, ссылаетесь на комментарий, который я удалил тем временем? – Wolf