Выход за границы массива в программе

124
26 июня 2019, 13:30

Задача. Дано 3 числа : a, b, c и одномерный массив. Заполнить его следующим образом: a, b, c, a, b, c, a, b, c ...

Решение

void FillArray(int cnt, double *arr, double a = 0, double b = 1, double c = 2)
{
    for (int i = 0; i < cnt; i+=3) {
        arr[i] = a;
        arr[i + 1] = b;
        arr[i + 2] = c;
    }
}

В моем решении есть выход за границы массива. Как это исправить? Заранее спасибо.

Answer 1

Вариантов масса.

От

void FillArray(int cnt, double *arr, double a = 0, double b = 1, double c = 2)
{
    for (int i = 0; i < cnt; i+=3) {
        arr[i] = a;
        if (i+1 < cnt) arr[i + 1] = b;
        if (i+2 < cnt) arr[i + 2] = c;
    }
}

до

for (int i = 0; i < cnt; ++i) 
{
    arr[i] == (i%3==0) ? a : (i%3 == 1) b : c;
}

P.S. Ага, раз пошла такая пьянка, пора достать алгебраический огурец:

void fillArray(int cnt, double *arr, double a = 0, double b = 1, double c = 2)
{
    double aa = (c+a)/2-b, bb = 2*b-(3*a+c)/2, cc = a;
    for (int i = 0; i < cnt; i++)
    {
        int j = i%3;
        arr[i] = (aa*j+bb)*j+cc;
    }
}
Answer 2

Вариантов можно несколько сделать, я бы сделал так:

void FillArray(int cnt, double *arr, double a = 0, double b = 1, double c = 2)
{
    double mas[] = {a, b, c};
    for (int i = 0; i < cnt; i++)
    {
        arr[i] = mas[i % 3];
    }
}
Answer 3

Ну как же тут не вспомнить нетленную классику? (Подразумевая cnt > 0)

void FillArray(int cnt, double *arr, double a = 0, double b = 1, double c = 2)
{
  int n = (cnt + 2) / 3;
  arr += cnt;
  switch (cnt % 3)
    do
    {
      case 0: *--arr = c;
      case 2: *--arr = b;
      case 1: *--arr = a;
    } while (--n > 0);
}
Answer 4

Рекурсию в массы!

void FillArray(int cnt, double *arr, double a = 0, double b = 1, double c = 2, int idx = 0)
{
    if (idx == cnt) return;
    arr[idx] = a;
    FillArray(cnt, arr, b, c, a, idx + 1);
}
Answer 5

В ответах на этот вопрос слишком мало STL!

Думаю std::generate_n отлично подойдет.

#include <algorithm>
void fillArray(int cnt, double *arr, double a = 0, double b = 1, double c = 2){
    std::generate_n(arr, cnt, [=]{
        static int i = 0; 
        static double values[] = {a, b, c}; 
        return values[i++ % std::size(values)];
    });
}

Или даже std::valarray:

#include <valarray>
void fillArray(int cnt, double *arr, double a = 0, double b = 1, double c = 2){
    std::valarray<double> temp(cnt);
    auto slice = [cnt](int from, int step){ 
        return std::slice(from, (cnt - from + step - 1) / step, step);
    };
    temp[slice(0, 3)] = a;
    temp[slice(1, 3)] = b;
    temp[slice(2, 3)] = c;
    std::copy(std::begin(temp), std::end(temp), arr);
}
Answer 6

Я бы вынес условия из цикла, понятно, что по факту на большинстве современных архитектур это ускорения почти наверняка не даст, да компилятор может догадаться сделать сам, но всё же...

void FillArray(int cnt, double *arr, double a = 0, double b = 1, double c = 2)
{
    int i;
    for (i = 0; i < cnt-2; i+=3) {
        arr[i] = a;
        arr[i + 1] = b;
        arr[i + 2] = c;
    }
    if (i == cnt-2) {
        arr[i] = a;
        arr[i + 1] = b;
    } else if (i == cnt-1) {
        arr[i] = a;
    }
}
READ ALSO
QProcess и ssh получить вывод

QProcess и ssh получить вывод

Можно ли через QProcess получить вывод как в консоли? Запустить процесс типа ("ssh", param) и получить с него ответ на запрос

152
Поломка ввода/вывода в коде с указателями [закрыт]

Поломка ввода/вывода в коде с указателями [закрыт]

Дана задача:ввести 3 вещественные переменные, на них навести указатели, с их помощью в 1 и 3 поменять значения, 2 увеличить в 3 разаМой код:

113
Ошибка CLion (Cmake, SFML)

Ошибка CLion (Cmake, SFML)

Ошибка: CMake Error at cmake_modules/FindSFMLcmake:355 (message): Could NOT find SFML (missing: SFML_AUDIO_LIBRARY SFML_NETWORK_LIBRARY SFML_GRAPHICS_LIBRARY SFML_WINDOW_LIBRARY SFML_SYSTEM_LIBRARY) Call Stack (most recent call first):...

106
Как сделать замену спомощью регулярки в Qt5 не все выражение, а лишь часть?

Как сделать замену спомощью регулярки в Qt5 не все выражение, а лишь часть?

Есть LaTeX документ, его считываю текстом и ищу по входным заранее определенным данным key_names вхождения типа: \newcommand{\ValueAxA}[1][-]{#1} ValueAxA - это key а значение...

165