Форум программистов, компьютерный форум CyberForum.ru

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

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

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

10.11.2008, 01:26. Просмотров 1849. Ответов 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++ Для каждой строки матрицы найти последний четный элемент и записать данные в новый массив
C++ Считать данные из текстового файла и записать их в массив float-ов
Считать из файла данные определенного типа и записать в массив C++
C++ Как записать данные из файла в двумерный массив?
C++ Для каждого столбца матрицы N*N подсчитать сумму отрицательных элементов и записать данные в новый массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
10.11.2008, 01:29     Не выходит записать данные в массив #2
Ну дык, делаем поиск по нашему char[256], когда находим то, что нужно делаем strncpy его, а потом atoi или еще что-нибудь в таком роде.
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 01:42     Не выходит записать данные в массив #3
Проблема в том, что у меня не работает ваще никак Вобщем для ясности прикрепляю весь проект. Для запуска проги сначала компилим, потом в папке Debug открываем окно консоли, вводим "scan ex res", ex - исходный код проги на моём языке, res - результирующая таблица лексем. Но после ввода этого в консоли по идее должно вывести значение того, о чём я писал, присвоенное другой переменной - а в итоге ничего подобного, и вылазит ошибка винды. В чём может быть проблема? Ковыряюсь в модуле TESTOUT.cpp Если не сложно, то покажите просто, как записать в массив с указателя всю эту лабуду
Вложения
Тип файла: 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';
Lord_Voodoo
Супер-модератор
8510 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,855
Завершенные тесты: 1
10.11.2008, 16:45     Не выходит записать данные в массив #5
объявить переменные это хорошо, но им и памяти выделить неплохо бы:
Код
char* lvs = new char(256);
char* lts = new char(256);
Вадимиус
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, которому присваиваю уже втупую значение лвс - выводит пустоту, тоесть туда записывается нолик видимо. В чём же теперь проблема? Переменные объявил с выделением памяти под них..
Lord_Voodoo
Супер-модератор
8510 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,855
Завершенные тесты: 1
10.11.2008, 16:51     Не выходит записать данные в массив #7
а что ты делаешь? если копируешь строки, то тебе поможет функция strcpy
Вадимиус
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 получается пустым
Lord_Voodoo
Супер-модератор
8510 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,855
Завершенные тесты: 1
10.11.2008, 17:03     Не выходит записать данные в массив #9
так погоди, ты теперь толком разъясни, что куда надо копировать, а то много букаф, ты по порядку давай
Вадимиус
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);
Ну оно всё равно не работает, но по смыслу вроде катит?
Lord_Voodoo
Супер-модератор
8510 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,855
Завершенные тесты: 1
10.11.2008, 17:21     Не выходит записать данные в массив #11
погоди, а ты читал справку по strspy? там первый аргумент - куда копировать, а второй - что копировать...
Код
char *strcpy (char *dst, const char *src);
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 17:45     Не выходит записать данные в массив #12
не катит, пробовал и так, и так
Lord_Voodoo
Супер-модератор
8510 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,855
Завершенные тесты: 1
10.11.2008, 17:52     Не выходит записать данные в массив #13
Вадимиус, покажи код, так гадать на кофейной гуще мы можем долго...
а скобки действительно квадтраные...
Вадимиус
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
Lord_Voodoo
Супер-модератор
8510 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,855
Завершенные тесты: 1
10.11.2008, 18:13     Не выходит записать данные в массив #15
так тебе не помогает такой код:
Код
strcpy(lvs,lv);
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
10.11.2008, 19:41     Не выходит записать данные в массив #16
Неа. В lvs и так записывается lv:
Код
case lexId:         lcs="lexId";        lvs=lv;   break;
И мне надо записать значение lv (или lvs, не в том суть) в lts..

Добавлено через 1 час 21 минуту 53 секунды
Я пошёл немного другим путём и теперь возникла вместо старой проблемы новая...
Код
char* lts[10];
объявляю массив вот так, при выполнении программа вылетает, я так думаю из за того, что не выделена память под массив. В таком случае успешным является только вызов первого значения lts[1], а вот lts[2] уже не работает. Вопрос - как объявить массив с выделением памяти под него (в массив будут записываться лексемы - тоесть 'lab01', 'begin' и им подобные данные)
Lord_Voodoo
Супер-модератор
8510 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,855
Завершенные тесты: 1
11.11.2008, 09:35     Не выходит записать данные в массив #17
массив строк можно объявить и инициализировать так:
Код
 char** lts;
 lts = (char**)malloc(255);
 for(int i = 0; i < 255; i++){
   lts[i] = (char*)malloc(10);
   memset(lts[i], ' ', 10);
   cout<<i<<" "<<lts[i];
    }
проще через string...
Вадимиус
0 / 0 / 0
Регистрация: 10.11.2008
Сообщений: 13
11.11.2008, 19:34     Не выходит записать данные в массив #18
Пасиб, щас буду пробовать

Добавлено через 2 часа 20 минут 40 секунд
Не работает.. Снова вылетает так, как будто массиву не выделена память.
Может мне в церковь сходить? А то злой препод видимо проклял моё задание
Lord_Voodoo
Супер-модератор
8510 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,855
Завершенные тесты: 1
12.11.2008, 09:26     Не выходит записать данные в массив #19
оно вылетать может в вдух случаях - либо памяти не выделено, либо просто ты вылез за пределы инициализированной памяти, может 10 байт маловато будет, писани туда 256, чтобы уж наверняка
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2008, 10:05     Не выходит записать данные в массив
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
igor_nf
118 / 12 / 1
Регистрация: 21.08.2007
Сообщений: 222
12.11.2008, 10:05     Не выходит записать данные в массив #20
Цитата Сообщение от Вадимиус Посмотреть сообщение
Пасиб, щас буду пробовать

Добавлено через 2 часа 20 минут 40 секунд
Не работает.. Снова вылетает так, как будто массиву не выделена память.
Может мне в церковь сходить? А то злой препод видимо проклял моё задание
Давай сюда свою прогу. Мы избавим тебя от страданий =)
Yandex
Объявления
12.11.2008, 10:05     Не выходит записать данные в массив
Ответ Создать тему
Опции темы

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