Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2021, 00:10   #1
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию Препроцессор и заполнение массива

Всем привет

Препроцессор и заполнение массива

Помогите разобраться, почему массив не заполняется данными или заполняется но не выводится. Но скорее всего и не заполняются и не выводятся.

Задача, сделать это именно так.

создать три файла.

в файле .h нужно:
а) описать прототипы;
б) сделать проверку определена ли константа, указывающая на тип данных ( #ifdef INTEGER )
в ) создать обобщающие имена функции, которым будет определена функция соответствующего типа в зависимости от константы , указанной в файле prog.cpp

function.h

Код:
#pragma once
#include<iostream>
#include <ctime>
#include<iomanip>
#include <Windows.h>
//#define INTEGER
using namespace std;

// макрос используется при генерации чисел для массива double
#define DOUBLEArray  1.3

#ifndef INTEGER

// создание одномерного массива int
void FillArrayInt(int a[], int);

// вывод одномерного массива int
void ShowArrayInt(int a[], int);

#define FillArray FillArrayInt;
#define ShowArray ShowArrayInt;

#elif Double

// создание одномерного массива double
void FillArrayDouble(double a[], int);

// вывод одномерного массива double
void ShowArrayDouble(double a[], int);
#define FillArray FillArrayDouble;
#define ShowArray ShowArrayDouble;
#elif Char


// создание одномерного массива char
void FillArrayChar(char a[], int);

// вывод одномерного массива char
void ShowArrayChar(char a[], int);

#define FillArray FillArrayChar;
#define ShowArray ShowArrayChar;
#endif
function.cpp
Код:
#include "function.h"


// создание одномерного массива int
void FillArrayInt(int a[], int n)
{
	srand(time(0));

	for (size_t i = 0; i < n; i++)
	{
		a[i] = rand() % 10;
	}
}

// вывод одномерного массива int
void ShowArrayInt(int a[], int n)
{
	for (size_t i = 0; i < n; i++)
	{
		cout << setw(5) << a[i];
	}
}

// создание одномерного массива double
void FillArrayDouble(double a[], int n)
{
	srand(time(0));

	for (size_t i = 0; i < n; i++)
	{
		a[i] = rand() % 10 * DOUBLEArray;
	}
}

// вывод одномерного массива double
void ShowArrayDouble(double a[], int n)
{
	for (size_t i = 0; i < n; i++)
	{
		cout << setw(5) << a[i];
	}
}

// создание одномерного массива char
void FillArrayChar(char a[], int n)
{
	for (size_t i = 0; i < n; i++)
	{
		a[i] = char('a' + rand() % ('z' - 'a'));
	}
}

// вывод одномерного массива char
void ShowArrayChar(char a[], int n)
{
	for (size_t i = 0; i < n; i++)
	{
		cout << setw(5) << a[i];
	}
}

prog.cpp

Код:
#include"function.h"
#define n 10

#define INTEGER


int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);


	int a[n];
	double b[n];
	char c[n];

	//StarLine(n * 3, '*');
	cout << endl;
	cout << "Int   ";
	FillArray(a, n);
	ShowArray(a, n);
	cout << endl;
#undef INTEGER

#define Double
#include "function.h"
	//StarLine(n * 3, '*');
	cout << endl;
	cout << "Double";

	FillArray(b, n);
	ShowArray(b, n);
	cout << endl;
#undef Double	

#define Char
#include "function.h"

	//StarLine(n * 3, '*');
	cout << endl;

	cout << "Char  ";

	FillArray(c, n);
	ShowArray(c, n);
#undef Char


	cout << endl;
	cout << endl;
	system("pause");
	return 0;

}
Farlep вне форума Ответить с цитированием
Старый 05.04.2021, 08:36   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от Farlep Посмотреть сообщение
почему массив не заполняется данными
какой массив? Где он должен заполняться?
Алексей1153 вне форума Ответить с цитированием
Старый 05.04.2021, 10:14   #3
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
какой массив? Где он должен заполняться?
Функции заполнения и вывода в файле
function.cpp

Вызываются они в prog.cpp.

Если убрать код препроцессора и вызывать их соответствующими именами функций, то все заполняется и выводится.

Но суть программы заключается в том, что бы вызывать одним именем все 3 функции, определяю нужный код через препроцессор и проверку определена ли константа, указывающая на тип данных ( #ifdef INTEGER ) например.

И эту проверку реализовать в function.h
Farlep вне форума Ответить с цитированием
Старый 05.04.2021, 10:21   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от Farlep Посмотреть сообщение
#include "function.h"
этот инклуд нельзя использовать внутри main

для данной задачи вообще дефайн не нужен, это решается шаблоном функции или лямбдой
Алексей1153 вне форума Ответить с цитированием
Старый 05.04.2021, 10:48   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Код:
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>

static constexpr double DOUBLEArray=1.3;

//заполнение массива
template<typename T,size_t SIZE>
void FillArray(T (&a)[SIZE])
{
	std::srand(std::time(nullptr));

	for (auto& i:a)
	{
	    /**/ if constexpr(std::is_same_v<T,int   >){i = std::rand() % 10;}
	    else if constexpr(std::is_same_v<T,double>){i = std::rand() % 10 * DOUBLEArray;}
	    else if constexpr(std::is_same_v<T,char  >){i = 'a' + std::rand() % ('z' - 'a' + 1);}
	}
}

//вывод массива
template<typename T,size_t SIZE>
void ShowArray(T const(&a)[SIZE])
{
	for (auto& i:a)
	{
	    std::cout << std::setw(5) << i;
	}
}

int main()
{
    constexpr size_t n=10;
    
	int    a[n]{}; FillArray(a); ShowArray(a);
	std::cout << '\n';
	
	double b[n]{}; FillArray(b); ShowArray(b);
	std::cout << '\n';
	
	char   c[n]{}; FillArray(c); ShowArray(c);
	std::cout << '\n';

	return 0;
}
Алексей1153 вне форума Ответить с цитированием
Старый 05.04.2021, 11:17   #6
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
этот инклуд нельзя использовать внутри main

для данной задачи вообще дефайн не нужен, это решается шаблоном функции или лямбдой
Подключал я заголовок, так как в function.h прописано #pragma once и больше одного раза не сработал бы #define. Может я что то не так понял.

Ваша задача решена не по поставленному условию. Возможно в этом моя вина, я не стал тут вываливать полное условие, думал названия темы достаточно и по моим наброскам можно будет понять, что я хотел сделать.

Я не вижу у вас в коде Препроцессор #define show ShowInt.... , #ifdef.

Шаблонную функцию нельзя использовать.

Должно быть 3 функции, для int, double и char. Но вызываться они должны одним именем.


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

Код:
Тема: Препроцессор

Создать проект в котором:
1. создать три файла: ( function.h , function.cpp , prog.cpp )

2. в файле function.cpp необходимо написать следующие функции для работы с массивом данных:
а) функцию для заполнения массива случайными значениями ;
б) функцию для вывода значений массива на консоль
....
 (Для каждого типа написать отдельную функцию) .

3. в файле function.h нужно:
а)описать прототипы всех функций;
б) сделать проверку определена ли константа, указывающая на тип данных ( #ifdef INTEGER )
в ) создать обобщающие имена функции , которым будет определена функция соответствующего типа 
в зависимости от константы ,указанной в файле prog.cpp . (#define show ShowInt )

4. в файле prog.cpp нужно :
а) в функции main вызвать все функции через переозначеные( обобщенные ) имена из файла function.h ( show ( ))
б) определить константу , которая указывает какой тип данных будет использоваться . 
Например INTEGER -целые данные, CHAR -символьные DOUBLE -настоящие. (# define INTEGER )
Имя функциям нужно давать так , чтобы они отвечали своей сути . 
Например функция для вывода значений массива целых чисел на консоль -ShowArrayInt (). 
А, когда переопределяем функцию с помощью # define то нужно давать общее имя. 
Например # define ShowArray ShowArrayInt

Последний раз редактировалось Farlep; 05.04.2021 в 11:19.
Farlep вне форума Ответить с цитированием
Старый 05.04.2021, 11:36   #7
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от Farlep Посмотреть сообщение
Но вызываться они должны одним именем.
это называется перегрузка - да, можно без шаблона, просто будет три дублирующиеся фунции с одинаковым именем, но разным типом аргументов (и снова дефайн не нужен )

задание, конечно, какое-то бессмысленное, но допустим.

Тогда должно быть как-то так


Код:
//тут на выбор открывается один из дефайнов
#define INTEGER
//#define DOUBLE 
//#define CHAR

//внутри заголовка лежит код, переключаемый данными дефайнами
#include"function.h"

int main()
{
       вызов функций
}
Алексей1153 вне форума Ответить с цитированием
Старый 05.04.2021, 11:41   #8
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

> и снова дефайн не нужен

Ну конечно не нужен, при выполнении всех задач, кроме случая темы препроцессор.

Код:
//тут на выбор открывается один из дефайнов
#define INTEGER
//#define DOUBLE 
//#define CHAR
Я думал про это, но тут вопрос, не получится сразу вызвать все 3 случая в main? Только по одному?
Farlep вне форума Ответить с цитированием
Старый 05.04.2021, 11:55   #9
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Farlep, одновременно - не получится по условию задачи/

Кажется, я понял, что препод хочет: (но на будущее предупреждаю - это не нужно никогда использовать в программах. И вообще стараться никогда не использовать define)

в main.cpp
Код:
//тут на выбор открывается один из дефайнов
#define INTEGER
//#define DOUBLE 
//#define CHAR

//внутри заголовка лежит код, переключаемый данными дефайнами
#include"function.h"

int main()
{
       вызов функций
    FillArray(.....); 
    ShowArray(....);
}
"function.h"

Код:
#pragma once

#ifdef INTEGER
#define FillArray FillArrayINTEGER
#define ShowArray ShowArrayINTEGER
#endif
#ifdef DOUBLE 
#define FillArray FillArrayDOUBLE
#define ShowArray ShowArrayDOUBLE
#endif
#ifdef CHAR
#define FillArray FillArrayCHAR
#define ShowArray ShowArrayCHAR
#endif

inline void FillArrayINTEGER(int a[], int n)
{
      ......
}

inline void ShowArrayINTEGER(int a[], int n)
{
      ......
}

inline void FillArrayDOUBLE(double a[], int n)
{
      ......
}

inline void ShowArrayDOUBLE(double a[], int n)
{
      ......
}

inline void FillArrayCHAR(char a[], int n)
{
      ......
}

inline void ShowArrayCHAR(char a[], int n)
{
      ......
}
Алексей1153 вне форума Ответить с цитированием
Старый 05.04.2021, 11:57   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

подправил вызовы
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерные массивы Внимание! В задаче реализовать заполнение массива, вывод на экран исходного массива и измененного (если при реш Гарри Паскаль, Turbo Pascal, PascalABC.NET 3 26.06.2015 09:45
Одномерные массивы Внимание! В задаче реализовать заполнение массива, вывод на экран исходного массива и измененного (если при ре Гарри Паскаль, Turbo Pascal, PascalABC.NET 1 25.06.2015 08:55
Заполнение listbox значениями из массива. Заполнение массива. Gnaqeaz C# (си шарп) 9 23.10.2014 07:53
Заполнение массива Hrum Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 24.11.2012 00:54
Заполнение массива Alex_Mason Общие вопросы Delphi 2 07.12.2010 22:58