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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2013, 23:27   #1
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
Смущение Перемещение из case 1 в case 2(switch(), язык Си)

Привет всем, кто читает данную тему. Уже благодарен за то,что вы тратите свое время на чужие проблемы
Суть проблемы:
Значит имеется КУСОК кода(первый кейс в функции switch()), в котором объявлены 2 динамических массива. Оба созданы для какой-либо строки, то есть символьные. 1-ый я создал здоровым, что бы туда точно поместился тот текст, который введет пользователь. 2-ой же массив я создаю уже после того, как известно кол-во символов, которые взбредут в голову пользователю. Мы с помощью функции strcpy() перекидываем содержимое большого массива(1-ого) в маленький ,уже подстроенный под определенное кол-во символов. Все работает замечательно, прям сказка, но... приходит время использовать 2-ой массив во 2-ом кейсе этого свича... Но она объявлена в 1-ом, то есть локальная. Вопрос:нужно каким-либо способом засунуть данные во 2-ой кейс и что бы(желательно) все работало. Я понимаю, что легче сделать так, что бы вынести объявление за свитч и использовать во всех кейсах, НО!, узнаю сколько символов я только в момент отработки кода 1-ого кейса, то есть сначала она у меня равна 0(и если вынести создается массив с 0 символами). Причина, почему я не могу вынести этот код за границы кейса тоже простая: у меня в начале программы есть высвечивается в виде менюшки( её то я и сделал с помощью switch()).
И именно в первом кейсе у меня подразумевается ввод текста, а во 2-ом уже работа над этим текстом( то есть над моим динамич. массивом).
Вот код:
Код:
switch(vibor)

	{
	case 1: 
		{			cout<<"Vot 1:"<<endl;
					int c;
					//tut
					char *text_1 = new char[SIZE_STRT];
					while((c=getchar()) != EOF)
					{
						text_1[count_simbol++] = c;
					}
					
					text_1[count_simbol] = '\0';
					//tut
					char *text = new char[count_simbol];
					
					strcpy_1(text, text_1);
					printf("%s", text);
					getchar();
					delete []text_1;
					break;

		}
	case 2:
		{	
			//сюда бы и нужно занести массив text[count_simbol]
			break;
		}
^Вот мои 2 кейса, описанные выше.
код в первом кейсе работает нормально, поэтому меня интересует лишь заданный мною вопрос. Заранее спасибо за ответ. Буду признателен за помощь.
Павел_95 вне форума Ответить с цитированием
Старый 10.01.2013, 23:29   #2
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

Ну и в начале, как глобальные отмечены эти переменные:
Код:
long int SIZE_STRT = 100000;//страндартное кол-во символов
long int count_simbol = 0;//для счета, 2-ого массива(подстраимого под данный текст)
Павел_95 вне форума Ответить с цитированием
Старый 10.01.2013, 23:40   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Причина, почему я не могу вынести этот код за границы кейса тоже простая: у меня в начале программы есть высвечивается в виде менюшки( её то я и сделал с помощью switch()).
Вы не весь код выносите за пределы switch, а только объявление переменных.
char *text_1, text;
switch(...)
{
...
}
EUGY вне форума Ответить с цитированием
Старый 10.01.2013, 23:57   #4
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

EUGY, в этом то и проблема,что этого сделать нельзя. Если бы вы внимательно прочитали тему, вы бы поняли) Повторюсь: как видите, я узнаю, сколько будет символов во 2-ом массиве только в теле 1-ого кейса, то есть если я поставлю объявления сразу двух массивов за пределы кейса, то получу 2-ой кейс с количеством ячеек 0, ибо переменная count_simbol сперва равна 0, а лишь потом(в теле 1-ого кейса) я увеличиваю эту переменную до нужного мне размера, что бы влезли только те символы, которые вписал пользователь, без излишеств.
Павел_95 вне форума Ответить с цитированием
Старый 11.01.2013, 00:14   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Проверьте, но, имхо, это какой-то изврат, нужно как-то переписать.
Код:
char *text;
switch(vibor)
{
    case 1: 
        {
            cout<<"Vot 1:"<<endl;
            int c;
            
            char *text_1 = new char[SIZE_STRT];
            while ((c=getchar()) != EOF) {
                text_1[count_simbol++] = c;
            }
                    
            text_1[count_simbol] = '\0';
            text = new char[count_simbol];
                    
            strcpy_1(text, text_1);
            printf("%s", text);
            getchar();
            delete []text_1;
            break;

    }
    case 2:
        {    
            printf("%s", text);
            break;
        }
Да, перестаньте выравнивать табулированием Выравнивайте пробелами.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.01.2013 в 00:17.
BDA вне форума Ответить с цитированием
Старый 11.01.2013, 00:17   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Уверяю, прочитал внимательно.
Причина, по которой Вы не можете вынести объявление за пределы switch надуманна.

Что должно быть во втором кейсе?
Если пользователь сразу введет выбор case 2, то что?
Никак поверку не сделать?
Код:
case 2:
if (! count_simbol )
  break;
Или

char * text = NULL;
switch(vibor)
{
case 1:
///// text = .....
break;

case 2:
if (! text)
break;
/////
}
EUGY вне форума Ответить с цитированием
Старый 11.01.2013, 01:47   #7
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

BDA, мне так удобно, имею же я право писать, как хочу... не так ли?)
Только что попробовал как вы сказали... к сожалению не выходит.(The variable 'text' is being used without being initialized. как я понял он не видит, как я его инициализировал.) Нужна другая идея)
EUGY, ну.. проверка это не первое дело, это уже доработка... для меня пока главное - это тот вопрос, который я задал в начале...
Павел_95 вне форума Ответить с цитированием
Старый 11.01.2013, 01:53   #8
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

Цитата:
Причина, по которой Вы не можете вынести объявление за пределы switch надуманна.

Что должно быть во втором кейсе?
Теперь, когда я проверил вы видите, что не совсем надумана.
На счет 2-ого кейса... не хочу вас грузить лишним, мне главное,что бы он хотя бы видел его, то есть могу вывести весь и показать, что все в порядке(printf("Вот текст: %s", text); ). Остальные операции, которые будут над ним происходить, я думаю осилю. А если нет, то это будет уже другая тема на форуме =)
Павел_95 вне форума Ответить с цитированием
Старый 11.01.2013, 02:02   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
мне так удобно, имею же я право писать, как хочу... не так ли?)
Конечно имеете, только в серьезных фирмах серьезный code style, который предусматривает (часто) использование пробелов вместо табов, так что лучше "кодить" сразу красиво.

Попробуйте проинициализировать text, как написал EUGY:
Код:
har *text = NULL;
switch(vibor)
{
    case 1: 
        {
            cout<<"Vot 1:"<<endl;
            int c;
            
            char *text_1 = new char[SIZE_STRT];
            while ((c=getchar()) != EOF) {
                text_1[count_simbol++] = c;
            }
                    
            text_1[count_simbol] = '\0';
            text = new char[count_simbol];
                    
            strcpy_1(text, text_1);
            printf("%s", text);
            getchar();
            delete []text_1;
            break;

    }
    case 2:
        {
            if (text)
                printf("%s", text);
            break;
        }
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.01.2013, 02:09   #10
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

BDA, к сожалению и этот вариант тоже не выходит(
Оно пишет тот же <null>, то есть все, что было с ним в 1-ом кейсе он оставил в 1-ом кейсе, а общего со вторым у него только этот NULL
Я вот уже думаю... может создать еще 1 динамический массив и скопировать то, что сделал кейс 1 в этот массив, а потом его кинуть во 2-ой? Хотя, я проблемно это себе представляю, если честно.
Павел_95 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
switch и case C++ countteran Общие вопросы C/C++ 18 06.04.2013 20:52
C++ switch case frozen__11 Общие вопросы C/C++ 6 11.11.2012 23:16
switch и case symrak Общие вопросы C/C++ 2 24.01.2012 15:17
switch - case 1 to 5 boris-blade Общие вопросы .NET 1 12.03.2010 07:13