Есть ли способ изменить значения в массиве за одну операцию? - 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.
- DECLARE_FUN(type) - это макрос, который определяет функцию с именем
set_type_array, принимающую указатель на массив типаtype, количество элементовcountи переменное количество аргументов типаtype. Эта функция заполняет массив за одну операцию. - CALL_FUN(type,ptr,count,...) - это макрос, который вызывает функцию
set_type_arrayс указанными аргументами. - DECLARE_PRINT(type,flag) - это макрос, который определяет функцию
print_type, которая выводит элементы массива типаtypeс помощью функцииprintf. - 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.