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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2011, 18:21   #1
FelixXXI
Пользователь
 
Регистрация: 29.03.2010
Сообщений: 48
По умолчанию Почему не дружат динамич.массивы и switch

Надо создать массив, но до выполнения программы не известно, какого размера он будет и какой тип данных(int, float,double) там будет.
Сделал так:
Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
template <class DataType> void funMakeArray(DataType *Array, int N);

int main()
{    
	int intN;
	cout<<"Input N - quantity of the array's elements\n";
	cin>>intN;
metkaA:
	cout << "\nChoice data's type:\n\tif int - choice the letter i\n\tif float - choice the letter f\n\tif double - choice the letter d\n";
	char chDataType;
	cin>>chDataType;
	int flagA=0;

	switch (chDataType)
	{
		case 'i':
			int *intArray = new int[intN];
			funMakeArray(intArray, intN);
			cout<<"\n";
			for (int i=0; i<intN;i++)
				cout<<intArray[i]<<"\t";
			delete []intArray;
			break;
		case 'f':
			float *flArray = new float[intN];
			funMakeArray(flArray, intN);
			cout<<"\n";
			for (int i=0; i<intN;i++)
				cout<<flArray[i]<<"\t";
			delete []flArray;
			break;
		case 'd':
			double *dblArray = new double[intN];
			funMakeArray(dblArray, intN);
			cout<<"\n";
			for (int i=0; i<intN;i++)
				cout<<dblArray[i]<<"\t";
			delete []dblArray;
			break;
		case 'e':
			cout<<"good bye!";
			return 0;
		default:
			cout<<"It is a wrong letter. Try again.\n";
			flagA=1;
	}
	if(flagA==1) 
	{
		flagA=0;
		goto metkaA;
	}
	getch();
	goto metkaA;
	return 0;
}
//___________________________________________________________________
//Заполнение одномерного массива данными
template <class DataType> void funMakeArray(DataType *Array, int N)
{
	for (int i=0; i<N; i++)
	{
		cout<<"Input "<<i<<" element:  ";
		cin>>Array[i];
	}
}
Компилятор матерится на объявление массива в switch.
Вынес объявление массивов из switch:
Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
template <class DataType> void funMakeArray(DataType *Array, int N);

int main()
{    
	int intN;
	cout<<"Input N - quantity of the array's elements\n";
	cin>>intN;
metkaA:
	cout << "\nChoice data's type:\n\tif int - choice the letter i\n\tif float - choice the letter f\n\tif double - choice the letter d\n";
	char chDataType;
	cin>>chDataType;
	int flagA=0;

	int *intArray = new int[intN];
	float *flArray = new float[intN];
	double *dblArray = new double[intN];

	switch (chDataType)
	{
		case 'i':
			//int *intArray = new int[intN];
			funMakeArray(intArray, intN);
			cout<<"\n";
			for (int i=0; i<intN;i++)
				cout<<intArray[i]<<"\t";
			delete []intArray;
			break;
		case 'f':
			//float *flArray = new float[intN];
			funMakeArray(flArray, intN);
			cout<<"\n";
			for (int i=0; i<intN;i++)
				cout<<flArray[i]<<"\t";
			delete []flArray;
			break;
		case 'd':
			//double *dblArray = new double[intN];
			funMakeArray(dblArray, intN);
			cout<<"\n";
			for (int i=0; i<intN;i++)
				cout<<dblArray[i]<<"\t";
			delete []dblArray;
			break;
		case 'e':
			cout<<"good bye!";
			return 0;
		default:
			cout<<"It is a wrong letter. Try again.\n";
			flagA=1;
	}
	if(flagA==1) 
	{
		flagA=0;
		goto metkaA;
	}
	getch();
	goto metkaA;
	return 0;
}
//___________________________________________________________________
//Заполнение одномерного массива данными
template <class DataType> void funMakeArray(DataType *Array, int N)
{
	for (int i=0; i<N; i++)
	{
		cout<<"Input "<<i<<" element:  ";
		cin>>Array[i];
	}
}
Так работает, но при этом я создаю два НЕНУЖНЫХ мне массива.

Вывод напрашивается сам собой: динамические массивы , по-видимому нельзя объявлять в переключателе switch.
Так ли это?
FelixXXI вне форума Ответить с цитированием
Старый 22.10.2011, 18:31   #2
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

нельзя, потому что там используется локальная память. Вне Свитча эти массивы были бы недоступны.
SteAlzzer вне форума Ответить с цитированием
Старый 22.10.2011, 18:38   #3
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Просто возьми каждый блок свитча в фигурные скобки
Код:
		case 'i':
{
			int *intArray = new int[intN];
			funMakeArray(intArray, intN);
			cout<<"\n";
			for (int i=0; i<intN;i++)
				cout<<intArray[i]<<"\t";
			delete []intArray;
			break;
}
Son Of Pain вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2 задачи на массивы. почему не работают ??? (((( ProgFrog Microsoft Office Excel 3 21.05.2012 21:07
Ассемблер и Паскаль не дружат... Monte-Kristo Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 16.06.2009 13:03
Паскаль. Динамич массивы ProPaL Помощь студентам 6 25.03.2008 09:43