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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2009, 20:27   #1
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию (C++) списки

Пишу программу со списками.

На строчках кода:
Код:
cin.getline((*element)->title);
Код:
cin.getline((*element)->FIO);
Вылезает ошибка [C++ Error] Unit1.cpp(57): E2285 Could not find a match for 'istream::getline(char *)'

В чём может быть проблема?
Troi666 вне форума Ответить с цитированием
Старый 10.05.2009, 21:13   #2
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Сорри....нашёл ошибку...не указал, сколько символов нужно считать. Вот так:
Код:
cin.getline((*element)->title, MAX_TITLE);
Работает
Troi666 вне форума Ответить с цитированием
Старый 11.05.2009, 00:15   #3
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Теперь возникла такая проблема...
Мне нужно производить поиск по одному 5-ти полей структуры. Алгоритмы одинаковы. Мне нужно писать 5 одинаковых по алгоритму функций или можно как-то написать одну функцию, но в которую передаётся имя того поля, по которому ищем?
Troi666 вне форума Ответить с цитированием
Старый 11.05.2009, 10:18   #4
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Можно и так, и так. Смотря, что не лень написать Во втором случае можно использовать перечислимый тип или map. Но если использовать map, то и структура-то становится не нужна...
В стандартной библиотеке это вроде организовано передачей предиката в функцию. Если писать так, то надо написать одну функцию поиска и 5 маленьких функций проверяющих нужное поле на равенство нужному значению.
megachuhancer вне форума Ответить с цитированием
Старый 12.05.2009, 19:13   #5
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

megachuhancer Хмм...смотри как я это понял: Мы создаём 5 функций поиска (функция на поле). Каждая из них принимает сравниваемое значение и адрес просматриваемой структуры и возвращает 1 или 0. Функция поиска принимает адрес одной из этих 5-ти функций и указатель на первую структуру. Просматривает структуры, обращаясь по указателю к переданной ей функции (передавая адрес структуры и то, что нам надо проверить на равенство). После этого если функция вернёт 1, мы сделаем одни действия, а если 0, то ничего. Я тебя правильно понял? И ещё вопрос...причём здесь перечислимый тип?

И ещё подойдёт ли для неё такой прототип? Рабочий ли он?

Код:
template <class T>
krttka * poisk(bool (*pole)(krttka *, T), krttka *, T);
тогда функция

Код:
template <class T>
krttka * poisk(bool (*pole)(krttka * element, T key), krttka * nashalo, T key)
{
   krttka * element = nashalo;
   while (element)
   {
      if ((*pole)(element,key)) break;
      element = element -> sled;
   }
   return element;
}

Последний раз редактировалось Troi666; 12.05.2009 в 20:13.
Troi666 вне форума Ответить с цитированием
Старый 12.05.2009, 22:41   #6
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Поиск работает, но при возвращении нулевого указателя из функции, указанной выше, прога вылетает с ошибкой распределения памяти..почему так может быть? При вылете значение element = NULL. Добавлю: Вылетает при строковом запросе поиска...любом....

Вылетаем в _ios_base.h на
Код:
public:                         // Flag-manipulation functions.
  fmtflags flags() const { return _M_fmtflags; }
  fmtflags flags(fmtflags __flags) {
    fmtflags __tmp = _M_fmtflags;
    _M_fmtflags = __flags;
    return __tmp;
  }
Текущий код проги. К сожалению кроме вылета при возвращении нулевого указателя имеет место ещё и зацикливание...Но пока не вижу где.
Код:
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;

const int MAX_FIO=20, MAX_TITLE=20;

struct krttka
{
   unsigned UDK;
   char FIO[MAX_FIO];
   char title[MAX_TITLE];
   unsigned god;
   unsigned kol_vo;
   krttka * sled;
   krttka * pred;
};

krttka * first();
krttka * showvvod();
void dobavlenie(krttka **);
void poisk_vibor(krttka *);
unsigned ukey();
char * ckey();
template <class A>
void vivod (bool (*pole)(krttka *, A), krttka *, A);
template <class T>
krttka * poisk(bool (*pole)(krttka *, T), krttka *, T);
bool pole_UDK(krttka *,unsigned);
bool pole_FIO(krttka *,char *);
bool pole_title(krttka *,char *);
bool pole_god(krttka *,unsigned);
bool pole_kol_vo(krttka *,unsigned);

void main()
{
   krttka * nashalo = first();
   krttka * konets = nashalo;
   int vibor;
   do
   {
      cout<<"\n======Viberite punkt menu======"
      <<"\n1-Zaregistrirovat` partiyu\n2-Vidacha\n3-Vozvrat\n4-Poisk\n5-EXIT\a\n";
      (cin>>vibor).get();
      switch (vibor)
      {
         case 1: dobavlenie(&konets); break;
         case 2: break;
         case 3: break;
         case 4: poisk_vibor(nashalo);break;
         case 5: break;
         default: cout<<"\nVvedeno nevernoe znachenie!\n\n";break;
      }
   }
   while(vibor!=5);
}

krttka * first()
{
   krttka * element = showvvod();
   element -> pred=NULL;
   return element;
}

krttka * showvvod()
{
   krttka * element = new krttka;
   cout<<"Registriruyu novuyu partiyu knig...\nVvedite nomer UDK: ______\b\b\b\b\b\b";
   (cin>>element->UDK).get();
   cout<<"Vvedite Familiyu i initciali avtora: ______\b\b\b\b\b\b";
   cin.getline(element->FIO,MAX_FIO);
   cout<<"Vvedite nazvanie: ______\b\b\b\b\b\b";
   cin.getline(element->title,MAX_TITLE);
   cout<<"Vvedite god izdaniya: ______\b\b\b\b\b\b";
   (cin>>element->god).get();
   cout<<"Vvedite kolichestvo ekzemplyarov: ______\b\b\b\b\b\b";
   (cin>>element->kol_vo).get();
   element -> sled=NULL;
   return element;
}

void dobavlenie(krttka ** konets)
{
   krttka * element = showvvod();
   element->pred=*konets;
   (*konets)->sled = element;
   *konets=element;
}

void poisk_vibor(krttka * nashalo)
{
   cout<<"\nChto vi znaete o knige?"
   <<"\n1-Nomer UDK\n2-Familiyu avtora\n3-Nazvanie\n4-God izdaniya\n";
   int vibor;
   (cin>>vibor).get();
   switch (vibor)
   {
      case 1: vivod(pole_UDK, nashalo, ukey());break;
      case 2: vivod(pole_FIO, nashalo, ckey());break;
      case 3: vivod(pole_title, nashalo, ckey());break;
      case 4: vivod(pole_god, nashalo, ukey());break;
      default: cout<<"\nVvedeno nevernoe znachenie!\n\n";break;
   }
}

unsigned ukey()
{
   cout<<"Vvedite: ";
   unsigned key;
   (cin>>key).get();
   return key;
}

char * ckey()
{
   cout<<"Vvedite: ";
   char * key;
   cin.getline(key,MAX_FIO);
   return key;
}

template <class A>
void vivod (bool (*pole)(krttka *element, A key), krttka * nashalo, A key)
{
   krttka * element = nashalo;
   while (element=poisk(pole, element, key))
   {
      cout<<setw(6)<<setfill('.')<<element->UDK
      <<setw(2)<<setfill(' ')<<" "<<setw(20)<<setfill('.')<<element->FIO
      <<setw(2)<<setfill(' ')<<" "<<setw(20)<<setfill('.')<<element->title
      <<setw(2)<<setfill(' ')<<" "<<setw(4)<<setfill('.')<<element->god
      <<setw(2)<<setfill(' ')<<" "<<setw(3)<<setfill('.')<<element->kol_vo<<"\n";
      element=element->sled;
   }
}

template <class T>
krttka * poisk(bool (*pole)(krttka * element, T key), krttka * nashalo, T key)
{
   krttka * element = nashalo;
   while (element)
   {
      if ((*pole)(element,key)) break;
      element = element -> sled;
   }
   return element;
}

bool pole_UDK(krttka * element,unsigned key)
{
   return element->UDK==key?1:0;
}

bool pole_FIO(krttka * element,char * key)
{
   return strstr(element->FIO,key)?1:0;
}

bool pole_title(krttka * element,char * key)
{
   return strstr(element->title,key)?1:0;
}

bool pole_god(krttka * element,unsigned key)
{
   return element->god==key?1:0;
}

bool pole_kol_vo(krttka * element,unsigned key)
{
   return element->kol_vo==key?1:0;
}

Последний раз редактировалось Troi666; 12.05.2009 в 23:06.
Troi666 вне форума Ответить с цитированием
Старый 13.05.2009, 00:47   #7
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Долго думали, но проблему нашли. Ей был ввод в указатель на символьную константу. Непонятно, как компилятор это пропустил, ну да ладно.
Код:
 char * key;
   cin.getline(key,MAX_FIO);
Нормализовалось после
Код:
 char key[MAX_FIO];
   cin.getline(key,MAX_FIO);
Теперь ещё странная ситуация, из-за которой иногда происходит зацикливание программы. При передаче ключа из функции ckey() в функцию vivod() на строчке
Код:
krttka * element = nashalo;
Ключ меняется на иероглифы. В чём может быть проблема?
Troi666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки C++ Katya Melody Помощь студентам 0 07.05.2009 23:32
Списки? Chainic Microsoft Office Excel 13 06.05.2009 22:53
На списки... Neznau Паскаль, Turbo Pascal, PascalABC.NET 1 02.07.2008 19:49
Списки... Arkuz Компоненты Delphi 2 19.04.2008 22:58