Есть ли способ изменить значения в массиве за одну операцию? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, недавно начал осваивать Си. Изучил K&R, полистал несколько разных мануалов. Нигде не увидел ответа на простой вопрос: есть ли способ, как в других языках программирования, изменить значения в массиве за одну операцию? Ведь при инициализации такая функциональность имеется:
#define K 8
int ar1[3] = { 1, 6, 3 }; // инициализация - корректно
 
/** можно изменить значения только в три строки
    но это же неудобно и длинно **/
ar1[0] = K+2;
ar1[1] = 5;
ar1[2] = 4;
 
/** может есть какой-то способ присвоения инициализирванному массиву значений?? **/
ar1 = { 2+K, 5, 4};  // ошибка
ar1[] = { 2+K, 5, 4}; // ошибка

Решение задачи: «Есть ли способ изменить значения в массиве за одну операцию?»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <locale.h>
 
#define DECLARE_FUN(type)\
    void set_##type##_array(type* ptr,unsigned count,...)\
    {\
        va_list v;\
        va_start(v,count);\
        for(unsigned i = 0; i < count;++i)\
            ptr[i] = va_arg(v,type);\
        va_end(v);\
    }
#define CALL_FUN(type,ptr,count,...)\
    set_##type##_array(ptr,count,__VA_ARGS__);
 
#define DECLARE_PRINT(type,flag)\
void print_##type(type* ptr,unsigned size)\
{\
    for(unsigned i = 0; i < size; ++i)\
        printf("array[%u]:"flag"\n",i,ptr[i]);\
    printf("\n");\
}
#define CALL_PRINT(type,ptr,size)\
    print_##type(ptr,size);
 
DECLARE_FUN(int);
DECLARE_PRINT(int,"%d");
DECLARE_FUN(double);
DECLARE_PRINT(double,"%f");
 
int main()
{
    setlocale(LC_ALL,".1251");
    int array[10] = {1,2,3,4,5,6,7,8,9,10};//инициализируем как обычно
    double array2[10] = {1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.0};//инициализируем double
    printf("Начальный массив int\n");
    CALL_PRINT(int,array,10);
    CALL_FUN(int,array,5,10,9,8,7,6);
    CALL_FUN(int,array+5,5,5,4,3,2,1);//остальные 5 меняем смещением указателя
    printf("Измененный массив int\n");
    CALL_PRINT(int,array,10);
    printf("Начальный массив double\n");
    CALL_PRINT(double,array2,10);
    CALL_FUN(double,array2,5,10.0,9.9,8.8,7.7,6.6);//тоже самое для double
    CALL_FUN(double,array2+5,5,5.5,4.4,3.3,2.2,1.1);
    printf("Измененный массив double\n");
    CALL_PRINT(double,array2,10);
    return 0;
}

Объяснение кода листинга программы

Этот код использует функции и макросы для работы с массивами в языке C.

  1. DECLARE_FUN(type) - это макрос, который определяет функцию с именем set_type_array, принимающую указатель на массив типа type, количество элементов count и переменное количество аргументов типа type. Эта функция заполняет массив за одну операцию.
  2. CALL_FUN(type,ptr,count,...) - это макрос, который вызывает функцию set_type_array с указанными аргументами.
  3. DECLARE_PRINT(type,flag) - это макрос, который определяет функцию print_type, которая выводит элементы массива типа type с помощью функции printf.
  4. CALL_PRINT(type,ptr,size) - это макрос, который вызывает функцию print_type с указанными аргументами. В функции main создаются два массива: array типа int и array2 типа double. Затем эти массивы инициализируются и выводятся на экран с помощью функций printf и print_int, print_double. Затем с помощью функций set_int_array и set_double_array значения в обоих массивах изменяются за одну операцию. Наконец, измененные массивы снова выводятся на экран с помощью функций print_int и print_double.

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы