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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2012, 13:43   #1
OliverVood
Пользователь
 
Регистрация: 06.05.2010
Сообщений: 32
Восклицание Массив объектов!!!

Здравствуйте, господа! Имеется код программы работающий с объектом СТРАНА который имеет 3 свойства: ИМЯ, ФОРМА ПРАВЛЕНИЯ, ПЛОЩАДЬ. Все работает на отлично при создании объектов как переменных, а вот при создании массива объектов происходит падение программы.
Код:
#include "stdafx.h"
#include <iostream>						
#include <stdlib.h>						
#include <windows.h>					
#include <fstream>
#include <iostream>
#include <string>

using namespace std;
class Country						// класс страна
{
	char* Name;					// имя
	char* Form_of_government;			// форма правления
	unsigned long Area;			       // площадь
public:
	Country();	// конструктор без параметров
	void SetName(char*);				// задать имя
	void SetForm_of_government(char*);	// задать форму правления
	void SetArea(unsigned long);		       // задать площадь
	void Show();				       // показать данные по стране	
};

/* конструктор без параметров */
Country::Country()						
{
	cout <<"Конструктор без парамеров!" <<endl;
	Name = "Не задано.";                       // задаем свойство ИМЯ
	Form_of_government = "Не задано.";  // задаем свойство ФОРМА ПРАВЛЕНИЯ
	Area = 0;                                      // задаем свойство ПЛОЩАДЬ
}

/* задать имя */
void Country::SetName(char* ch)
{
	Name = ch;
}

/* задать форму правления */
void Country::SetForm_of_government(char* ch)
{
	Form_of_government = ch;
}

/* задать площадь */
void Country::SetArea(unsigned long area)
{
	Area = area;
}

/* главный модуль */
void main(void)
{
	unsigned long area;                                          // переменная отвечает за площадь
	char* ch;                                                      // указатель на строковую переменную
	SetConsoleCP(1251); 
	SetConsoleOutputCP(1251);
	cout <<"*** Начало программы ***" <<endl;
	Country EvroTop10[10];                                  // создаем массив объектов
	ifstream GetFile;                                            // файл на чтение
	GetFile.open("EvroTop10.txt");                        // открываем файл
	for(int i = 0; i < 10; i++)                                // цикл по записям в файле
	{	
		ch = new char[];                                 // выделение памяти
		GetFile.getline(ch, 80);                         // читаем строку с файла
		EvroTop10[i].SetName(ch);                   // запись в св-во объекта
		ch = new char[];                                // выделение памяти
		GetFile.getline(ch, 80);                       // читаем строку с файла
		EvroTop10[i].SetForm_of_government(ch); // запись в св-во объекта
	}
	GetFile.close();                                        // закрываем файл
	for(int i = 0; i < 10; i++)                            // цикл по массиву объектов
	{
		EvroTop10[i].Show();                      // вывод инфы
	}
	cout <<"*** Конец программы ***" <<endl;
	system("Pause");				
}
Не могу понять в чем дело? Помогите разобраться пожалуйста!
Пишу на Microsoft Visual Studio C++ 2010 Express.
OliverVood вне форума Ответить с цитированием
Старый 23.08.2012, 14:12   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
ch = new char[];                                 // выделение памяти
И сколько вы здесь выделили памяти?

Код:
Name = ch;
Чаровские строки так не копируют.
p51x на форуме Ответить с цитированием
Старый 23.08.2012, 18:55   #3
OliverVood
Пользователь
 
Регистрация: 06.05.2010
Сообщений: 32
По умолчанию

Цитата:
И сколько вы здесь выделили памяти?
Безразмерный массив, это не влияет, я пробовал и
Код:
new char[80];
Цитата:
Чаровские строки так не копируют.
Вы, имеете в виду strcopy() или что-то на подобии?

Я изменил тело цикла на:
Код:
	
for(int i = 0; i < 10; i++)
	{	
		ch = new char[80];
		GetFile >> ch;
		EvroTop10[i].SetName(ch);
		ch = new char[80];
	        GetFile >> ch;
                EvroTop10[i].SetForm_of_government(ch);						
	}
Все работает, но название стран и форма правления может состоять из нескольких слов. Как прочитать строку используя GetFile?

Последний раз редактировалось Stilet; 24.08.2012 в 20:32.
OliverVood вне форума Ответить с цитированием
Старый 23.08.2012, 23:31   #4
OliverVood
Пользователь
 
Регистрация: 06.05.2010
Сообщений: 32
По умолчанию

Проблема решена! Применил конструкцию GetFile.getline(ch, 80, '\n'); Видно без ограничения конца строки он может читать с файла дополнительные абракадабры. А после, запись таких в char и вызывало падение программы.
OliverVood вне форума Ответить с цитированием
Старый 24.08.2012, 07:25   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Видно без ограничения конца строки он может читать с файла дополнительные абракадабры.
Нет. Дело втом, что фактически вы памяти не выделяли и писали фик знает куда.
p51x на форуме Ответить с цитированием
Старый 24.08.2012, 16:03   #6
OliverVood
Пользователь
 
Регистрация: 06.05.2010
Сообщений: 32
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Нет. Дело втом, что фактически вы памяти не выделяли и писали фик знает куда.
Да и это в том числе.
OliverVood вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив объектов класса. zipwind Общие вопросы C/C++ 8 01.05.2011 20:56
Событие на массив объектов. dezmond06 C# (си шарп) 0 26.03.2011 13:13
массив объектов Freddi Krjuger Общие вопросы по Java, Java SE, Kotlin 3 18.02.2011 19:55
Массив объектов _bAd_ Помощь студентам 10 20.01.2010 08:33
массив объектов balamut JavaScript, Ajax 4 29.05.2009 14:49