Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с массивом структур 
:(
    Опции темы
maxim_89
  Дата 5.6.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



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

Код


#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#define n 2


struct Price
{
  char *Tovar;
  char *Mag;
  long int Stoim; };

void OutPut(Price Spisok[])
{
   for (int i=0;i<n;i++)
{  cout<<Spisok[i].Tovar<<"\n";
   cout<<Spisok[i].Mag<<"\n";
   cout<<Spisok[i].Stoim<<"\n";
   cout<<"-----------------\n\n";
}
  getch();
}

void main()
{
  clrscr();
  Price Spisok[n];
  cout<<"‹ Лаба  9. Структкры.   \n\n";

  for (int i=0;i<n;i++)

{ cout<<"Товар  "<<i+1<<"  ....\n\n";
  cout<<"Что купил?\n";
  gets(Spisok[i].Tovar);
  cout<<"А магазинчик не подскажешь??\n";
  gets(Spisok[i].Mag);
  cout<<"Сколько??\n";
  cin>>Spisok[i].Stoim;
  cout<<"----------------\n";  }

  OutPut(Spisok);

  getch();
}



Дайте, плиз, ссылку на хорошую книгу по работе с указателями ....
PM MAIL   Вверх
FiMa1
Дата 5.6.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Код
gets(Spisok[i].Tovar);

Попытка поместить по неизвестному адресу (т.к. Tovar на данный момент неинициализированный указатель) строку. Следует либо строго задать размер массива char'ов, например, вида Tovar[ANY_SIZE], либо предварительно выделить память под строку.
Если нужно решение "на коленке", то, примерно, вот так:
Код
#include <iostream>
using namespace std;

#define SIZE_OF_LIST 2

struct Price
{
    char    GoodName[30];
    char    ShopName[30];
    int        Cost;
};

void OutPut( Price List[] )
{
    for (int i = 0; i < SIZE_OF_LIST; i++)
    {
        cout << List[i].GoodName << endl;
        cout << List[i].ShopName << endl;
        cout << List[i].Cost     << endl;
    }
}

void main()
{
    Price List[SIZE_OF_LIST];
  
    for (int i = 0; i < SIZE_OF_LIST; i++)
    {
        cout << "GoodName " << i + 1 << endl;
        cout << "What has you bought? ";
        gets( List[i].GoodName );
        cout << "There is it shop? ";
        gets( List[i].ShopName );
        cout << "How much? ";
        cin >> List[i].Cost;
    }
    OutPut(List);
}


Почитать про указатели можно в любой книге по программированию на Си/Си++.

Это сообщение отредактировал(а) FiMa1 - 5.6.2007, 13:01
PM   Вверх
medicdim
Дата 5.6.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 19.1.2007

Репутация: нет
Всего: нет



Я тут немного подправил: убрал указатели и явно указал длины строк.



Код

#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#define n 2


struct Price
{
  char Tovar[20];
  char Mag[20];
  long int Stoim; };

  Price Spisok[n];

void OutPut()
{
   for (int i=0;i<n;i++)
{  cout<<Spisok[i].Tovar<<"\n";
   cout<<Spisok[i].Mag<<"\n";
   cout<<Spisok[i].Stoim<<"\n";
   cout<<"-----------------\n\n";
}
  getch();
}

void main()
{
  clrscr();

  cout<<"‹ Ëàáà  9. Ñòðóêòêðû.   \n\n";

  for (int i=0;i<n;i++)

{ cout<<"Òîâàð  "<<i+1<<"  ....\n\n";
  cout<<"×òî êóïèë?\n";
  gets(Spisok[i].Tovar);
  cout<<"À ìàãàçèí÷èê íå ïîäñêàæåøü??\n";
  gets(Spisok[i].Mag);
  cout<<"Ñêîëüêî??\n";
  cin>>Spisok[i].Stoim;
  cout<<"----------------\n";  }

  OutPut();

  getch();
}

PM MAIL   Вверх
DigitSphinx
Дата 5.6.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Зачем gets(); ??
Код

#include "stdafx.h"
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
using namespace std;
#define n 2
struct Price
{
  char Tovar[20];
  char Mag[20];
  long int Stoim; 
};
Price Spisok[n];
void OutPut()
{
   for (int i=0;i<n;i++)
    {  
       cout<<Spisok[i].Tovar<<"\n";
       cout<<Spisok[i].Mag<<"\n";
       cout<<Spisok[i].Stoim<<"\n";
       cout<<"-----------------\n\n";
    }
}

void main()
{
  cout<<"‹ ??\n\n";

  for (int i=0;i<n;i++)
    { 
      cout<<"Òîâàð  "<<i+1<<"  ....\n\n";
      cout<<"TOVAR?\n";
      cin >> Spisok[i].Tovar;
      cout<<"MAG??\n";
      cin >> Spisok[i].Mag;
      cout<<"STOIM??\n";
      cin>>Spisok[i].Stoim;
      cout<<"----------------\n";  
  }

  OutPut();
  getch();
}



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
maxim_89
Дата 5.6.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Спасибо за помощь!
теперь все работает...
Цитата

Зачем gets(); ??


просто мне в этой лабе нужно еще и со строками поработать...
Кроме того, если мы в поля .Tovar или .Mag попытаемся через cin>> впихнуть что-то вроде
"Big shop", то в это поле получим только "Big", а нашего препода это не устраивает....  
 Спасибо еще раз. smile 
PM MAIL   Вверх
Nil
Дата 5.6.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



maxim_89, gets нормальному преподователю думаю тоже не понравится... cin.GetLine ну или что-то в этом роде. А раз уж собрался работать со строками, то бросайте уже этот char =) Еше...
Код

#define n 5

страшная строчка имхо =)

PM MAIL WWW ICQ   Вверх
JackYF
Дата 5.6.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Nil @  5.6.2007,  15:43 Найти цитируемый пост)
cin.GetLine ну или что-то в этом роде


маленькими буквами. STL не использует больших букв в интерфейсах:
Код

std::cin.getline


Цитата(Nil @  5.6.2007,  15:43 Найти цитируемый пост)
страшная строчка имхо =)

гм, согласен.
Используй что-то вроде:
Код

const unsigned int n = 5;




Это сообщение отредактировал(а) JackYF - 5.6.2007, 16:06


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.