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

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

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2013, 08:28   #1
syrga
Пользователь
 
Регистрация: 05.12.2010
Сообщений: 14
Счастье рекурсивный спуск(вопросы в коде)

Задание:
1. Реализовать при помощи рекурсивного спуска нахождение:
o имен переменных
o целых чисел
o операций '+', '-', '*', '/'
o скобок
2. Обработку комментариев (тип комментария Pascal комментарий (* ... *) с поддержкой многострочности.)
3. Всё прочее должно вызывать ошибку разбора строки (строка это весь входной файл)
4. После разбора каждой строки выдавать надпись 'OK' или 'FAILED' в зависимости от результата разбора

Где освобождается память под mainstring?
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

extern int add (void);       
extern int mult (void);
extern int prim (void);
extern int number(double *a);
extern int match(char *S);

char* mainstring;
char* temp;
char* current;
FILE * _file;
char * _fileName;
int error = 0;


//функция var  которая нигде не вызвана а может её вообще удалить?
int var (char *S)
{
	int i = 0;
	while ((((current[i]>='a') && (current[i]<='z')) ||  ((current[i]>='A') && (current[i]<='Z'))) || (current[i] == '_') || (((current[i] <= '9') && (current[i] >= '0'))))
	{
		if ((current[i] <= '9') && (current[i] >= '0') && (i == 0))
		{
			return 0;
		}
		S[i] = current[i];
		i++;
	}
	if (i==0)
	{
		return 0;
	}
	
	current += i;
	return 1;
}



int main(int argc, char **argv) 
{
	if (argv[1] !=0) 
	{
		_fileName = malloc(strlen(argv[1])*sizeof(char)); // динамическео выделение памяти под переменную _fileName препод сказал что эта строка не нужна
		_fileName = argv[1]; // запись в _fileName значение первого элемента массива аргументов
	} else 
	{
		_fileName = malloc(strlen("in.txt")*sizeof(char)); // в случае если argv[1] = 0 дин. выделение памяти другой длины и вот эта
		_fileName = "in.txt";  // запись в переменную _fileName значения  "in.txt"
	}
	
	mainstring = malloc(1000*sizeof(char));  // дин.выделение памяти для переменной mainstring
	temp = malloc(1000*sizeof(char)); //дин.выделение памяти для переменной temp
	
	
	_file = fopen(_fileName, "r"); // _file  - указатель на файл _fileName, который открывается для чтения
	if(_file == 0)  // если файл пуст
	{
		printf("fail pustoi\%s\"\n",_fileName); //выводим в терминал сообщение "fail pustoi\%s\"\n" + имя файла
		return 0;
	}
	//--udalenie probelov --
	int c = getc(_file);  //записывает в C  символ на который указывает _file 
	int z = 0;  // 0
	int i = 0;  // 0 
	int c0 = (int)(' ');  
	int c2 = getc(_file);
	while (c != EOF) 
	{
		if ( (c != (int)(' ')) &&  (c != (int)('\t')))  // если символ  который хранится с С не равен пробелу или табуляции, то выполняется следующий блок  
		{
			z = 0; // 0
			temp[i] = c; // в i-й элемент массива temp записываем символ на который указывает c
 			i++;  // инкремент i
			if ((c == (int)('+')) || (c == (int)('-')) || (c == (int)('*')) || (c == (int)('/'))) // если с = -, +, * ,/ то
			    z = 1;  // z = 1
		}
		else if (((c0 >= (int)('0')) && (c0 <= (int)('9'))) || (c0 == (int)(' ')) || (c0 == (int)('\t')) || (c0 == (int)('\n'))) /* в противном случае, если С равно пробелу,
		 проверяем истинность того. что С>= 0, <=9  или =" " или символу табуляции, или символу перевода каретки.*/
		{
				if ((c2 >= '0') && (c2 <= '9')) // проверка на то, что c2 >= 0 и с2 <= 9
					if (z == 0) // если z = 0 (С не равно - + * / ) то  тоесть в массив попадут все символы которые не равны - + * /  
					{
						temp[i] = c; // в  массив temp записываем значение С
						i++; // инкремент i
						error = 1; 					}
		}
		c0 = c;
		c = c2;
		c2 = getc(_file);
	}
	fclose(_file); // Закрываем файл
	i = 0; // Обнуляем i
	int j =0; // 0
	int flag = 0; // 0 
//	printf("TEMP:%s\n",temp);
	while (temp[i] !=0 ) // проход по символьному массиву
 	{
		if ((temp[i] == '(') && (temp[i + 1] == '*'))  // в случае если i-й элемент массива является ( и следующий за ним *
		{
			i+=2; // увеличить переменную i  на 2  (пропустить эти 2 символа)
			flag = 1; // установить флаг
			while ((!((temp[i] == '*') && (temp[i+1] == ')'))) && (temp[i]!=0)){ // выполнять цикл пока не будет достигнуто сочетание *) и конец символьного массива.
				i++;
			}
			i+=2; // 
		}
		mainstring[j] = temp[i]; // в  mainstring[j]  записываем значение temp[i] (кроме (**))
		j++; 
		i++;
	}
	free(temp);  тут под temp освобождается память, а под mainstring нет почему?
	printf("MAINSTRING:%s\n",mainstring); // вывести в терминал  MAINSTRING
	
	current = mainstring; 
	
	if (add()) // в случае если add вернёт TRUE переходим к след. условию
	{
		if (error == 0){  // если флаг ошибок опущен
		printf("\nRESULT: OK\n"); // вывести в терминал OK
			return 1;
		}
		else
		{
			printf("\nRESULT: FAILED\n"); // в противном случае FAILED
			return 0;
		}
	} else {
		printf("\nRESULT: FAILED\n"); // если add вернул FALSE  вывести в терминал FAILED
			return 0;
	}
}
syrga вне форума Ответить с цитированием
Старый 23.03.2013, 17:04   #2
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Цитата:
Сообщение от syrga Посмотреть сообщение
Где освобождается память под mainstring?
В приведённом коде нигде.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивный спуск и подъем Vesteros Помощь студентам 0 10.05.2011 15:23
| Вопросы о создании сайта / Не о коде | MeTeOpA HTML и CSS 2 08.02.2011 18:24
Градиентный спуск Ciberal Помощь студентам 0 26.12.2010 19:23
Градиентный спуск nieaCry Общие вопросы C/C++ 0 04.12.2008 00:26