#c
#c
Вопрос:
Я пытаюсь создать конструктор для разреженного массива, который принимал бы N аргументов. Если перед аргументом стоят пробелы, то это сдвигает его индекс на одну позицию. По крайней мере, я так себе это представляю
Я вижу это впервые и понятия не имею, как его освободить. Это задача, поэтому я не могу изменить входные данные для конструктора.
SparseArray<float, 3 > array0(1.0f, 2.0f);
SparseArray<double, 10> array1( 4.0, 7.0);
Массивы после инициализации должны быть такими
array0[0] == 1.0f
, array0[1] == 2.0f
.
И array1[1] == 4.0
array1[3] == 7.0
получается, как если бы пробелы занимали позиции 0
и 2
в array1
.
Комментарии:
1. Пробелы в основном игнорируются синтаксическим анализатором C . Вы не можете изменить синтаксис языка, если не напишете свой собственный препроцессор, который редактирует исходный код до того, как его увидит компилятор.
2. Также 1) это крайне сбивает с толку. Никто, кто читает код, не поймет этого поведения. Большинство программ форматирования кода удаляют эти пробелы. 2) почему вы сдвигаетесь на единицу? Что делать, если вы хотите пропустить 5 пунктов?
3. Пробелы игнорируются лексическим анализатором C , за исключением случаев, когда они помогают разграничивать токены. Одно пространство имеет точно такое же значение, как и миллион из них. Вы абсолютно ничего не можете с этим поделать.
4. спасибо за ответы.
5. Другие способы решения подобных проблем включают использование контрольного «значения» (объекта, который вы передаете), что означает «пустой элемент здесь». Или вариант или тот, в котором вы передаете объект с информацией о позиции (которая затем может быть произвольно большой) и значением для добавления в эту позицию.
Ответ №1:
То, что вы пытаетесь сделать, невозможно, поскольку у вас нет никакого контроля над синтаксическим анализатором C , и, честно говоря, не имеет смысла для тех, кто будет использовать ваш код.
Если вы не напишете какой-то препроцессор (просто не делайте этого), лучший вариант здесь — просто добавлять нули везде, где это необходимо:
SparseArray<double, 10> array1( 0, 4.0, 0, 7.0);
Если вы все еще хотите использовать пробелы, альтернативой является использование string в качестве аргумента, а затем его самостоятельный анализ, извлечение чисел и поиск пробелов:
SparseArray<double, 10> array1(" 4.0, 7.0");
Я бы выбрал первый вариант.