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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2011, 22:02   #1
kypck
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 35
По умолчанию Фейл с массивом чаров

Есть функция, которая должна брать из списка полЯ country и выдавать их без повторов. head[0] - указатель на начало списка. next[0] на следующий элемент списка. Проблема - сегмент феил. Никак не пойму почему
Код:
void perel()
{
  clear
  cout << "Перелік країн:";
  int i = 0;
  char* m[9999];
  for (int i=0; i<9999; i++)
    strcpy(m[i],"0");
  main *el;
  for (el = head[0]; el != NULL; el = el->next[0])
    {
      strcpy(m[i],el->country);
      i++;
    }
  for (int y = 0; y<N; y++)
    for (int z = y+1; z<N+1; z++)
      if (strcmp(m[z],m[y]) == 0)
	strcpy(m[z],"0");
  for (int z = 0; z<N; z++)
    if (m[z] != "0")
      cout << m[z] << "\n";
  cout << "\nЩоб перейти до головного меню натисніть 0\n";
  cin >> i;
  if (i == 0)
    men();
}
kypck вне форума Ответить с цитированием
Старый 05.11.2011, 02:07   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Можно всё-таки объявление типа main (кстати, скверное название), а заодно и значение N?
Abstraction вне форума Ответить с цитированием
Старый 05.11.2011, 23:11   #3
kypck
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 35
По умолчанию

main

Код:
struct main
{
  main *next[2];
  char *fam;
  char *country;
  int year;
  char *money;

  main ()
  {
    fam = new char[25];
    country = new char[35];
    money = new char[20];
    year = 0;
    next[0] = NULL;
    next[1] = NULL;
  }

  ~main ()
  {
    delete[]fam;
    delete[]country;
    delete[]money;
  }
};
N всегда равно количеству структур main в списке. Указатель на голову списка - head[0].

Переписал этот код вот так:

Код:
 
void perel()
{

  struct spis 
  { 
    char* country;
    spis* next;
    spis()
    {
      country = new char[35];
      next = NULL;
    }
    ~spis()
    {
      delete[]country;
    }
  };
  int menu = 0;
  int i = 0;
  spis *hd = new spis;
  spis *cur = hd;
  clear
    cout << "\tПерелік країн: \n";
  for (main* k = head[0]; k!=NULL; k = k->next[0])
    { 
      strcpy(cur->country,k->country);
      cur->next = new spis;
      cur = cur->next;
      i++;
    }
  if (N>1)
    {
      for (spis *first = hd; first != NULL; first = first->next)
	for (spis *two = first->next; two!= NULL; two = two->next)
	  if (strcmp(first->country,"codepage")!=0)
	    if(strcmp(first->country, two->country) == 0)
	      strcpy(two->country,"codepage");
      for (spis *first = hd; first != NULL; first = first->next)
	if (strcmp(first->country,"codepage")!=0)
	  cout << first->country << "\n"; 
      cout << "Щоб повернутися до головного меню натисніть 0\n";
      cin >> menu;}
  if (N==1)
    {
      cout << head[0]->country << "\n";
      cout << "Щоб повернутися до головного меню натисніть 0: \n";
      cin >> menu;
    }
}
Так работает, но занимает много больше места. И все же интересно исправить первый вариант

Не хорошее название из-за схожести main и int main() ? x)

Последний раз редактировалось kypck; 05.11.2011 в 23:13.
kypck вне форума Ответить с цитированием
Старый 06.11.2011, 00:40   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Тьфу.
Код:
strcpy(m[i],"0");
"Взять m[i], проинтерпретировать его как адрес, и записать по этому адресу "0\0"."
Конец немного предсказуем, как говорится. Ведь в m[i] в этот момент лежит любой мусор.

Цитата:
Не хорошее название из-за схожести main и int main() ? x)
Да. Если некоторая лексема в языке имеет ненулевой смысл, использование её в качестве идентификатора не очень хорошая идея, даже когда синтаксис это позволяет.
Код:
if if = then
    then then = else
    else else = if
Даже если так можно писать, идея не очень хорошая, правда?

Последний раз редактировалось Abstraction; 06.11.2011 в 00:42.
Abstraction вне форума Ответить с цитированием
Старый 06.11.2011, 00:57   #5
kypck
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Тьфу.
Код:
strcpy(m[i],"0");
"Взять m[i], проинтерпретировать его как адрес, и записать по этому адресу "0\0"."
Конец немного предсказуем, как говорится. Ведь в m[i] в этот момент лежит любой мусор.

А почему нельзя записать по этому адресу 0? Я так понял тот мусор, который там лежит при копировании удалиться? И по-моему сегмент феил не из-за этого
kypck вне форума Ответить с цитированием
Старый 06.11.2011, 01:02   #6
kypck
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Тьфу.
Код:
strcpy(m[i],"0");
"Взять m[i],
Код:
if if = then
    then then = else
    else else = if
Даже если так можно писать, идея не очень хорошая, правда?
Возможно вы не поверите, но я такой код воспринимаю вполне нормально х) И даже вспоминая времена писания на паскале, то я пробовал делать нечто подобное D:
kypck вне форума Ответить с цитированием
Старый 06.11.2011, 12:01   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
А почему нельзя записать по этому адресу 0?
По случайному адресу? Ну, это зависит от операционной системы: в DOS можно обрушить всё к такой-то матери, а в Windows операционная система блокирует попытки обращения к "не тем" адресам (либо потому что это адреса нижних 2Гб - область ядра, либо потому, что этим адресам не сопоставлена физическая память). И такая ошибка, обращения к несуществующей памяти, и называется segmentation fault.
Abstraction вне форума Ответить с цитированием
Старый 06.11.2011, 13:01   #8
kypck
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 35
По умолчанию

исправил таким образом, спасибо

Код:
void perel()        
{
  clear
  cout << "Перелік країн: \n";
  int i = 0;
  char** m;
  m = new char* [999];
  for (int i=0; i<999; i++)
    m[i] = new char[35];
  main *el;
  for (el = head[0]; el != NULL; el = el->next[0])
    {
      strcpy(m[i],el->country);
      i++;
    }
  for (int y = 0; y<N; y++)
    for (int z = y+1; z<N+1; z++)
      if (strcmp(m[z],m[y]) == 0)
	strcpy(m[z],"0");
  for (int z = 0; z<N; z++)
    if (m[z] != "0")
      cout << m[z] << "\n";
  cout << "\nЩоб перейти до головного меню натисніть 0\n";
  cin >> i;
  for (i=0; i<999; i++)
    delete[] m[i];
  delete[] m;

  if (i == 0)
    men();
}
kypck вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сколково, опять фейл! mv28jam Свободное общение 12 26.04.2011 12:28
работа с массивом Андрей.12 Помощь студентам 2 22.10.2009 00:25
работа с массивом kritik Помощь студентам 10 22.07.2009 20:00