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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2012, 03:46   #1
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию Описание структуры в *.h

Доброй ночи! Борюсь и никак не могу победить. У меня есть функции, которые описаны в cpp файлах, вызываются из main, есть хидер файл в котором описана структура а затем прототипы функции(пусть файл называется struct.h, структуры Money, Katya). Потом в другом хидер файле я подключаю все необходимые функциям моим библотеки(iostream, fstream etc.), struct.h, создаю структуры типа Money и Katya(назовем данный хидер func.h). Так вот, мои цпп файлы в которых функции,ругаются что
Код:
Ошибка	34	error C2228: выражение слева от ".ForMounth" должно
 представлять класс, структуру или объединение	G:\Project MoneyForWork\MoneyForWork\MoneyForWork\ZeroMoney.cpp	21
Ошибка	35	error C2065: S1: необъявленный идентификатор	G:\Project MoneyForWork\MoneyForWork\MoneyForWork\ZeroMoney.cpp	21
Ошибка	36	error C2228: выражение слева от ".grafic" должно представлять класс, 
структуру или объединение	G:\Project MoneyForWork\MoneyForWork\MoneyForWork\ZeroMoney.cpp	21
	37	IntelliSense: идентификатор "DoIt" не определен	g:\project moneyforwork\moneyforwork\moneyforwork\
zeromoney.cpp	7
	38	IntelliSense: идентификатор "S" не определен	g:\project moneyforwork\moneyforwork\
moneyforwork\zeromoney.cpp	10
	39	IntelliSense: идентификатор "S1" не определен	g:\project moneyforwork\moneyforwork\
moneyforwork\zeromoney.cpp	11
func.h подключается только к main, пробывал ко всем но тоже косяк. в чем мои ошибки??
Я могу, Я хочу, Я буду!

Последний раз редактировалось ArmanPrestige; 07.07.2012 в 03:51.
ArmanPrestige вне форума Ответить с цитированием
Старый 07.07.2012, 03:58   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Нужно глазками видеть чего и как ты там прицепляешь, и как потом используешь.

Твои единицы трансляции (спп файлы) похоже не понимают что это за типы данных такие, у которых есть поля: ForMounth и тп.
_Bers вне форума Ответить с цитированием
Старый 07.07.2012, 04:19   #3
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Конечно. Я сперва написал программку так - 1 цпп файл(там просто меню и switch), и 1 хидер файл со всеми функциями, структурами.. Все работало, но все время надо дописывать кое что..и для удобности захотелось разбить каждую функцию на отдельный цпп файл. Если так же есть места где "криво"(плохо) написано, просьба ткнуть лицом туда.

Struct.h
Код:
//Struct.h
#pragma once
#define DAYS 30

struct Money
{
	unsigned long  MoneyCass[DAYS];
	unsigned long  MoneyTerm[DAYS];
	unsigned long  MoneyAll[DAYS];
	unsigned float MoneyForMounth;
};

struct Katya
{
	int grafic[DAYS];
	unsigned long ForDay[DAYS];
	unsigned long ForMounth;
};

char DoIt;
int Choise;

void WriteFile();
void PrintKatyaGrafic();
void PrintMoneyOfDay();
void AddMoneyDay();
void Space();
void NoCase();
void ZeroMoney();
void MoneyForWork();
void PrintMoneyForWork();
void LoadProgrammFiles();
void PrintMenu();
int  KatyaGrafic();


include.h
Код:
//include.h
#include <iostream>
#include <clocale>
#include <iomanip>
#include <conio.h>
#include <string>
#include <fstream>
#include <process.h>
using namespace std;
func.h(тут я одну функцию еще не убрал)
Код:
//func.h
#pragma once
#include "MoneyForWork\MoneyForWork\Struct.h"
#include "MoneyForWork\MoneyForWork\include.h"

char DoIt;
int Choise;

Money S;
Katya S1;

void AddMoneyDay()	//внести выручку по дням
{
	system("cls");
	S.MoneyForMounth=0;
	S1.ForMounth=0;
	for(int i=0;i<DAYS;i++)
	{
		cout << "Введите выручку за " << i+1 << " число:\n";
		cout << "Касса: ";
		cin  >> S.MoneyCass[i];
		cout << "Терминал: ";
		cin  >> S.MoneyTerm[i];
		S.MoneyAll[i]=S.MoneyCass[i]+S.MoneyTerm[i];
	}
	cout << "Выручка внесени и посчитана. Нажмите любую клавишу.\n";
}
ZeroMoney.Cpp
Код:
#include "include.h"

void ZeroMoney()	//обнуление итогов
{
	system("cls");
	cout << "Внимание! Все занесенные данные будут утеряны!\n Для продолжения введите +: ";
	cin  >> DoIt;
	if(DoIt=='+')
	{
		S.MoneyForMounth=0;
		S1.ForMounth=0;
		for(int i=0;i<DAYS;i++)
		{
			S.MoneyAll[i]=0;
			S.MoneyCass[i]=0;
			S.MoneyTerm[i]=0;
			S1.ForDay[i]=0;			
			S1.grafic[i]=0;
			if(S.MoneyAll[i] || S.MoneyCass[i] || 
				S.MoneyForMounth || S.MoneyTerm[i] || 
				S1.ForDay[i] || S1.ForMounth || S1.grafic[i])
			{
				cout << "При обнулении данных произошла ошибка.\n";
				break;
			}
			else 
				cout << "Данные за " << setw(2) << i+1 << " число обнулены.\n";
		}
		cout << "Press any key...";			
	}
	else cout << "Отменено пользователем. Нажмите любую клавишу для продолжения.\n";
}
and main.cpp

Код:
#include "func.h"
using namespace std;


int main()
{
	setlocale(LC_ALL,"Russian");
	while(cout << "#programm заработная плата v 1.0")
	{
		PrintMenu();
		Choise=getch();
		switch(Choise)
		{
                case 48: LoadProgrammFiles();       break;
		case 49: KatyaGrafic();			break;
		case 50: AddMoneyDay();		break;
		case 51: MoneyForWork();		break;
		case 52: PrintMoneyForWork();	break;
		case 53: WriteFile();			break;
		case 54: ZeroMoney();			break;
		case 57: return 0;			break;
		default: NoCase();			break;
		}
		getch();
		system("cls");
	}
	return 0;
}
Я могу, Я хочу, Я буду!

Последний раз редактировалось ArmanPrestige; 07.07.2012 в 04:30.
ArmanPrestige вне форума Ответить с цитированием
Старый 07.07.2012, 04:38   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

файл ZeroMoney.Cpp

Используется переменная S
Она нигде не создается, и ни откуда не подключается.

Откуда компилятор знает, что это вообще такое непонятное S?
_Bers вне форума Ответить с цитированием
Старый 07.07.2012, 04:45   #5
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

описал ее в func.h, думал будет "видна" и там. то есть, надо в zeromoney.cpp подключить header, где определены структуры? но тогда ведь к каждому файлу, которому нужен доступ к полям структуры нужен такой инклуд. но насколько я понимаю, когда делаются подключение h файла, то выполняется код который в h файле. вопрос: не возникнет проблем, что структура определена 2,3 и т.д. раз?
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 07.07.2012, 04:48   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ArmanPrestige Посмотреть сообщение
описал ее в func.h, думал будет "видна" и там. то есть, надо в zeromoney.cpp подключить header, где определены структуры? но тогда ведь к каждому файлу, которому нужен доступ к полям структуры нужен такой инклуд. но насколько я понимаю, когда делаются подключение h файла, то выполняется код который в h файле. вопрос: не возникнет проблем, что структура определена 2,3 и т.д. раз?
То есть, ты создал файл, где описал структуру. Но к единице трансляции его не подключил. И теперь думаешь, что единица трансляции - это такой телепат, сама догадается его к себе подключить?

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

Прочитай про правило "одного определения"
http://yandex.ru/yandsearch?text=%D0...1%2B%2B&lr=240
_Bers вне форума Ответить с цитированием
Старый 07.07.2012, 04:55   #7
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

_Bers,благодарен за ответы. Буду разбираться, но уже на "свежую голову" с утра. При необходимости, опять появлюсь в данной теме. Но надеюсь, что разберусь...)
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 07.07.2012, 16:48   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ArmanPrestige
когда справишься с ошибками компиляции, начнутся ошибки с линковкой. нельзя в хидерах определять переменные с внешним связыванием
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 08.07.2012, 02:20   #9
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
Вопрос

Цитата:
Сообщение от pproger Посмотреть сообщение
2ArmanPrestige
когда справишься с ошибками компиляции, начнутся ошибки с линковкой. нельзя в хидерах определять переменные с внешним связыванием
в цпп там где main запихывать их? Я так понял, вы про DoIt & Choise?

----------------------------------------------------------


Все равно разобраться не могу....(( Вот, закинул пока ту прогу. И пытаюсь на самой простой разобраться, но не выходит. в хидере описана стуктура там же и определена. в 2ух цпп используются поля структуры. листинг ниже

structt.h

Код:
#ifndef _structt_h_
#define _structt_h_

int notmain();

struct Char
{
	int x;
	int y;
}Xa;

#endif

notmain.cpp

Код:
#include <iostream>
#include "structt.h"
using namespace std;

int notmain()
{
	Xa.y=3;
        cout << Xa.y << endl;
	return Xa.x;
}

main.cpp

Код:
#include <iostream>
#include "structt.h"
using namespace std;

int main()
{
	Xa.x=2;
	cout << Xa.x << endl;
	notmain();
	return 0;
}
Объясните пожалуйста, конкретнее как использовать #ifndef,#endif. Где, как описывать стуктуры, классы, глобальные переменные если доступ к ним нужен из нескольких мест - cpp файлов, хидеров.
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 08.07.2012, 04:13   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
#ifndef _structt_h_
#define _structt_h_

int notmain();

typedef struct
{
	int x;
	int y;
} _XA;

extern _XA Xa;

#endif
соответтственно её цпп:
Код:
#include <iostream>
#include "structt.h"
using namespace std;

_XA Xa;

int notmain()
{
	Xa.y=3;
        cout << Xa.y << endl;
	return Xa.x;
}
main.cpp такой же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль.Описание лабораторной работы. Помиогите сделать описание проги .какая формула что делает. Elimay25 Паскаль, Turbo Pascal, PascalABC.NET 1 01.03.2012 16:34
описание структуры(С++) Vally Помощь студентам 2 08.01.2012 23:59
Описание структуры данных n-арного (k-ичного) дерева Gonzo Общие вопросы Delphi 10 23.09.2010 08:05
СИ. Списки. Описание структуры односвязного списка Jane-sad Помощь студентам 9 17.05.2010 14:40
[C++] Описание структуры TORT sasha20666 Помощь студентам 3 31.10.2009 17:52