Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Вадимиус
#1

Не выходит записать данные в массив - C++

10.11.2008, 01:26. Просмотров 1922. Ответов 20
Метки нет (Все метки)

Добрый вечер! Привожу облегчённый фрагмент программы - лексического анализатор. Вобщем не могу понять, как мне записать значение переменной lv в массив символов. lv - тип char[256], содержит значение лексемы (тоесть символ - операторы, переменные, числа и т.п.), которое после записи в файл изменяется по ходу поиска лексем в моей программе. Пробовал даже не в массив,а просто в символьную переменную, или что то ей подобное - либо ругается, либо вообще ошибка при исполнении программы (ну тоесть с предложением отправить отчёт мс для исправления..) Помогите пожалуйста объявить этот массив и записать в него значение lv, чтоб потом можно было к нему обратиться..

Код
#include <fstream.h>
#include <stdio.h>
#include "scaner_ext.h"
#include <string>
using namespace std;

void fprintlex2(FILE* f) 
{
  char* lcs;
  char* lvs;
//здесь нужно объявить массив
  
  switch(lc) 
   {
//прочие варианты..
    case lexId:         lcs="lexId";        lvs=lv;   break;
  
  default:      lcs="nonprinted lex class"; lvs=lv;
  }



  if ((column==0)&&(lc==lexId)) { if (lv=="lab01") { //вот здесь нужно организовать запись в массив
	  };
	
	};

}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2008, 01:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не выходит записать данные в массив (C++):

Ввести данные в файл, и записать данные с файла в массив структур - C++
Ввести все данные в файл, и записать данные с файла в структуру. Помогите ввести и вывести структуру из файла. Допускается - и желательно...

Выделить данные из строчки и записать в массив - C++
Вообщем есть массив mas_chastot И есть файл, в нем имеется столбец или (строка) вида (начинается с # и ей же заканчивается. с...

Как записать данные из файла в массив структур? - C++
В коде я ввожу данные и их записывает в файл, помогите пожалуйста записать данные из файла в массив структур #include &lt;conio.h&gt; ...

Как записать данные из файла в двумерный массив? - C++
Дан файл координат вершин ломаной линии на плоскости. Определить, имеет ли ломаная линия самопересечения, если да, то записать в файл G...

Как считать данные с файла и записать в массив? - C++
В файле данные расположены следующим образом : Radius: 1 Coord point: (5;10) Radius: 5 Coord point: (1;7) Radius: 6 Coord...

Считать из файла данные определенного типа и записать в массив - C++
Подскажите, пожалуйста. Допустим, у меня есть файл text.txt, в котором есть цифры/буквы/символы. Задача сводится к следующему: мне нужно...

20
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
10.11.2008, 01:29 #2
Ну дык, делаем поиск по нашему char[256], когда находим то, что нужно делаем strncpy его, а потом atoi или еще что-нибудь в таком роде.
0
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 01:42 #3
Проблема в том, что у меня не работает ваще никак Вобщем для ясности прикрепляю весь проект. Для запуска проги сначала компилим, потом в папке Debug открываем окно консоли, вводим "scan ex res", ex - исходный код проги на моём языке, res - результирующая таблица лексем. Но после ввода этого в консоли по идее должно вывести значение того, о чём я писал, присвоенное другой переменной - а в итоге ничего подобного, и вылазит ошибка винды. В чём может быть проблема? Ковыряюсь в модуле TESTOUT.cpp Если не сложно, то покажите просто, как записать в массив с указателя всю эту лабуду
0
Вложения
Тип файла: zip prog.zip (308.8 Кб, 21 просмотров)
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 16:40 #4
Почему может не работать такой код? При компиляции всё окей, а когда пытаюсь запустить программу - всё вылетает. В lvs у меня по проге записываются символьные фрагменты лексем, а я пытаюсь их скопировать в lts - переменная того же типа ведь. Может ли быть дело в 64х винде? Код то вроде правильный..
Код
//объявление лок. переменных..
char* lvs;
char* lts;
//операторы и прочий код...
while((*lts=*lvs)!='\0')
{
lts++;lvs++;
}
cout<<"value:"<<lts<<'/n';
0
Lord_Voodoo
Супер-модератор
8594 / 2210 / 61
Регистрация: 07.03.2007
Сообщений: 10,970
Завершенные тесты: 1
10.11.2008, 16:45 #5
объявить переменные это хорошо, но им и памяти выделить неплохо бы:
Код
char* lvs = new char(256);
char* lts = new char(256);
0
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 16:50 #6
Тааакс.. спасибо огромное, но теперь вообще не копирует строки, хотя и не вылетает

if ((column==0)&&(lc==lexId)){ if (lv=="lab01") {lts=lvs;} cout<<"||"<<lvs<<"||"<<'/n'; - вот в этом случае выводит значение лвс, всё как надо

if ((column==0)&&(lc==lexId)){ if (lv=="lab01") {lts=lvs;} cout<<"||"<<lts<<"||"<<'/n'; - меняю на lts, которому присваиваю уже втупую значение лвс - выводит пустоту, тоесть туда записывается нолик видимо. В чём же теперь проблема? Переменные объявил с выделением памяти под них..
0
Lord_Voodoo
Супер-модератор
8594 / 2210 / 61
Регистрация: 07.03.2007
Сообщений: 10,970
Завершенные тесты: 1
10.11.2008, 16:51 #7
а что ты делаешь? если копируешь строки, то тебе поможет функция strcpy
0
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 16:55 #8
Код
if ((column==0)&&(lc==lexId)){ 
  if (lv=="lab01") {
    strcpy(lvs,lts);
} 
сout<<"||"<<lts<<"||"<<'/n';
вот так? тот же результат, содержимое lts получается пустым
0
Lord_Voodoo
Супер-модератор
8594 / 2210 / 61
Регистрация: 07.03.2007
Сообщений: 10,970
Завершенные тесты: 1
10.11.2008, 17:03 #9
так погоди, ты теперь толком разъясни, что куда надо копировать, а то много букаф, ты по порядку давай
0
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 17:21 #10
у меня есть (и работает) переменная lvs, которая в момент выполнения того кода равна строке символов "lab01", я хочу это содержимое записать в другую переменную lts, которая соответственно после успешного выполнения проги должна вывести ту же строку "lab01", но в итоге её не выводит вообще, тоесть у меня вместо этого даже не пробел, а просто ничего нет.
Зачем я хочу создавать аналогичную существующей переменную? ПРосто для тестирования, по тз мне надо записать полученные в разные моменты времени значения lvs в массив, но не выходит даже просто записать её в аналогичную ей переменную(

Добавлено через 11 минут 42 секунды
Меня вдруг осенило - а тут не квадратные скобки надо?
Код
char* lvs = new char(256);
char* lts = new char(256);
Ну оно всё равно не работает, но по смыслу вроде катит?
0
Lord_Voodoo
Супер-модератор
8594 / 2210 / 61
Регистрация: 07.03.2007
Сообщений: 10,970
Завершенные тесты: 1
10.11.2008, 17:21 #11
погоди, а ты читал справку по strspy? там первый аргумент - куда копировать, а второй - что копировать...
Код
char *strcpy (char *dst, const char *src);
0
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 17:45 #12
не катит, пробовал и так, и так
0
Lord_Voodoo
Супер-модератор
8594 / 2210 / 61
Регистрация: 07.03.2007
Сообщений: 10,970
Завершенные тесты: 1
10.11.2008, 17:52 #13
Вадимиус, покажи код, так гадать на кофейной гуще мы можем долго...
а скобки действительно квадтраные...
0
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 17:58 #14
Чтобы не усложнять и так непростой код я привожу только те модули, которые тут свящаны напрямую, без дополнительного модуля сканера, по идее ошиька в этих где-то...
Код
// tesout.cpp - тестовый вывод информации о лексемах

#include <fstream.h>
#include <stdio.h>
#include "scaner_ext.h"
#include <cstring>

void fprintlex(FILE* f) 
{

  char* lcs;
  char* lvs;
  char* lts;

  switch(lc) 
   {
    case lexPlus:       lcs="lexPlus";      lvs="+";  break;
    case lexAssign:     lcs="lexAssign";    lvs="=="; break; // :=
    case lexComma:      lcs="lexComma";     lvs=",";  break;
    case lexSlash:      lcs="lexSlash";     lvs="/";  break;
    case lexColon:      lcs="lexColon";     lvs=":";  break;
    case lexEQ:         lcs="lexEQ";        lvs="=";  break;
    case lexEof:        lcs="lexEof";       lvs="End_Of_File"; break;
    case lexFloat:      lcs="lexFloat";     lvs=lv;   break;
    case lexGE:         lcs="lexGE";        lvs=">="; break;
    case lexGT:         lcs="lexGT";        lvs=">";  break;
    case lexId:         lcs="lexId";        lvs=lv;   break;
    case lexInt:        lcs="lexInt";       lvs=lv;   break;
    case lexLE:         lcs="lexLE";        lvs="<="; break;
    case lexLftRndBr:   lcs="lexLftRndBr";  lvs="(";  break;
    case lexLftSqBr:    lcs="lexLftSqBr";   lvs="[";  break;
    case lexLT:         lcs="lexLT";        lvs="<";  break;
    case lexStar:       lcs="lexStar";      lvs="*";  break;
    case lexString:     lcs="lexString";    lvs=lv;   break;
    case lexSemicolon:  lcs="lexSemicolon"; lvs=";";  break;
    case lexRghRndBr:   lcs="lexRghRndBr";  lvs=")";  break;
    case lexRghSqBr:    lcs="lexRghSqBr";   lvs="]";  break;
    case lexSkip:       lcs="lexSkip";      lvs=" ";  break;
    case lexMinus:      lcs="lexMinus";     lvs="-";  break;
	case lexMark:      lcs="lexMark";     lvs=lv;	  break;
 
	case kwProgram:	lcs="KWPROGRAM";  lvs=lv;   break;
	case kwBegin:	lcs="KWBEGIN";  lvs=lv;   break;
    case kwEnd:		lcs="KWEND";    lvs=lv;   break;
    case kwGoto:	lcs="KWGOTO";   lvs=lv;   break;
    case kwOr:		lcs="KWOR";     lvs=lv;   break;
    case kwIf:		lcs="KWIF";     lvs=lv;   break;
	case kwInput:	lcs="KWINPUT";	lvs=lv;   break;
	case kwOutput:	lcs="KWOUTPUT";	lvs=lv;   break;
	case kwDo:		lcs="KWDO";		lvs=lv;   break;
	case kwTo:		lcs="KWTO";		lvs=lv;   break;
	case kwNext:	lcs="KWNEXT";	lvs=lv;   break;
	case kwThen:	lcs="KWTHEN";	lvs=lv;   break;
	case kwAnd:		lcs="KWAND";	lvs=lv;   break;
	case kwNot:		lcs="KWNOT";	lvs=lv;   break;
  
  default:      lcs="nonprinted lex class"; lvs=lv;
  }
  
//header
  if (line==1){
    fprintf(f, "Строка\t Подстрока \t Код лексемы \n");
	fprintf(f, "\n");
  };
   
//для индексации констант
  if ((column==0)&&((lc==lexFloat)||(lc==lexInt))){ 
  fprintf(f, " %-3d \t %-10s \t %-7s %-3d\n", tmpline, lvs, lcs, con_ind);  
  }
  else if ((lc==lexFloat)||(lc==lexInt)){
	  fprintf(f, " %-3d \t %-10s \t %-7s %-3d\n", line, lvs, lcs, con_ind); }; 
  
//для индексации идентификаторов
	  if ((column==0)&&(lc==lexId)){ if (lv=="lab01") {lts=lv;} cout<<"VAL:"<<lts<<'/n';   //ВОТ ЗДЕСЬ НУЖНО ПРИСВОИТЬ LTS ЗНАЧЕНИЕ LVS!!!!!!!!!!!!!!!!!!!!!!!!!
  fprintf(f, " %-3d \t %-10s \t %-7s %-3d\n", tmpline, lvs, lcs, id_ind);  
  }
  else if (lc==lexId){
	  fprintf(f, " %-3d \t %-10s \t %-7s %-3d\n", line, lvs, lcs, id_ind); };

//обычный вывод
  if ((column==0)&&(lc!=lexId)&&(lc!=lexFloat)&&(lc!=lexInt)){
  fprintf(f, " %-3d \t %-10s \t %-7s \n", tmpline, lvs, lcs);  
  }
	else if ((lc!=lexId)&&(lc!=lexFloat)&&(lc!=lexInt)){
		fprintf(f, " %-3d \t %-10s \t %-7s \n", line, lvs, lcs); };

		
		
//footer		
	if (lc == lexEof) {fprintf(f, "\n");
		fprintf(f, "Строка\t Подстрока \t Код лексемы \n");
		con_ind=0;
		fprintf(f, "Array! ! : %c \n", lts);
	};


}
Код
#ifndef __scaner_ext__
#define __scaner_ext__

// scaner_ext.h - экспортируемые объекты сканера
#include "scaner_type.h"

void nxl(void);				// используемая всеми функция взятия следующей лексемы
extern lc_type     lc;		// класс лексемы (scaner_data)
extern char  lv[];			// значение лексемы (scaner_data)
extern int line,			// номер текущей строки
           column,			// номер текущего столбца
		   tmpline,			// номер временной строки (-1 ошибка)
		   con_ind,
		   id_ind;

extern FILE  *infil;
#endif
Код
#ifndef __scaner_data__
#define __scaner_data__

// scaner_ext.h - описания общих данных, используемых сканером

#include "scaner_type.h"

int const buf_size = 256;	// размер буфера под значение лексемы
static int   si;			// читаемый символ
lc_type     lc;				// класс лексемы
char  lv[buf_size];			// значение лексемы
static int i_lv;			// текущая позиция при наборе лексемы
int line,					// номер текущей строки
    column,					// позиция в текущей строке
	tmpline,				// номер текущей строки в начале позиционирования
	con_ind,				// индекс в таблице констант
	id_ind;				// индекс в таблице идентификаторов
FILE    *infil;
#endif
0
Lord_Voodoo
Супер-модератор
8594 / 2210 / 61
Регистрация: 07.03.2007
Сообщений: 10,970
Завершенные тесты: 1
10.11.2008, 18:13 #15
так тебе не помогает такой код:
Код
strcpy(lvs,lv);
0
10.11.2008, 18:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2008, 18:13
Привет! Вот еще темы с ответами:

Считать данные из текстового файла и записать их в массив float-ов - C++
Помогите пожалуйста!!!Очень нужно! как считать данные из txt файла и записать их в массив float на языке с++.

Для каждого столбца найти первый положительный элемент и записать данные в новый массив - C++
Дан массив размером nxn, элементы которого целые числа Для каждого столбца найти первый положительный элемент и записать данные в новый...

В каждом столбце матрицы найти первый положительный элемент и записать данные в новый массив - C++
Помогите пожалуйста составить программу!!! дан массив размером nхn, элементы которого целые числа.для каждого столбца найти первый...

Для каждого столбца подсчитать сумму четных положительных элементов и записать данные в новый массив - C++
2)для каждого столбца подсчитать сумму четных положительных элементов и записать данные в новый массив Замечание:при решении обеих задач...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru