Страница: 1 | 2 |
Вопрос: Снова CPP :)
Добавлено: 22.03.06 02:19
Автор вопроса: HACKER
На этот раз классы и структуры :) Я немогу их связать :)
2 файла, главный (cpp) и класс (h)
cpp:
#include <iostream.h>
#include "struct.h"
typedef struct MyStructura{
char NameGoods [128];
char NameShop [128];
long Money;
}MyStructura, *pMyStructura;
MyStructura* array;
void main(int argc, char* argv[]){
cin.get();
int count = 2;
int i=0;
char tmp[128];
array = new MyStructura[count];
//Далее наверное шопопало...
EnterData(array, count);
}
struct.h
#include <windows.h>
#include <iostream.h>
//И тут наверное тоже шо попало
class MyStruct{
public:
EnterData (struct ms, int count);
};
//Хотел бы чтобы сюда передать структуру (array в главном) и если нужно кол-во эл.
//а ещё лучше чтоб само узнало :) и основная задача состоит в том, чтобы ввести в структуру
//все элементы! т.е. и NameGoods и NameShop Money... только не самому ручками, а надо
//чтобы незивисимо от того чё-там у меня в структуре описано, вообщем всё что поисанно спросить
//с клавы по порядку... Читал про Enum как элементы структуры перечислить непонял...
void EnterData (struct ms, int count){
for (int i=0;i<count;i++){
cin.getline (ms[i].NameGoods, 128);
}
}
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #1
Добавлено: 22.03.06 04:27
Если класс выполняет одну задачу, почему бы не ввести структкру в класс и сделать примерно так.
cpp:
#include "struct.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[]
{
MyStruct *p_MyStruct= new MyStruct;
p_MyStruct->EnterData (p_MyStruct,128);
delete [] p_MyStruct;
return 0;
}
struct.h
#include <iostream>
using namespace std;
class MyStruct{
public:
struct MyStructura{
char NameGoods [128];
char NameShop [128];
long Money;
}*pMyStructura;
void EnterData ( MyStruct* , int);
};
void MyStruct::EnterData (MyStruct* pMyStruct , int count){
pMyStruct->pMyStructura = new MyStruct::MyStructura ;
for (int i=0;i<count;i++){
cin.getline (pMyStruct->pMyStructura ->NameGoods , 128);
}
delete []pMyStruct->pMyStructura;
}
Номер ответа: 2
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #2
Добавлено: 22.03.06 21:54
HACKER, почему оффтоп?
vito, оно то работает, только почему не работает первый вариант?
Номер ответа: 3
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #3
Добавлено: 22.03.06 22:08
ок... я сделал так...
есть файл в котором описаны все структуры
есть файл в котором написаны все функции для работы с структурами
есть гланвный файл которой то создаёт массив структур то вызывает
ф-ции нужные итп...
Теперь подскажите плиз, как перечислить и/или обратится к элементу
структуры по индексу!
т.е. есть массивы структуры
stcuct MyStruct{
char FIO[128];
char school[128];
int group;
...
}
И где-то в другом файле есть ф-ции для обработки структуры (ЛЮБОЙ! не
обязательно MyStruct)
как в цикле (грубо говоря в цикле...) перечислить все поля FIO,
school, group... т.е. записать и получить значение...
т.е. нужен пример ф-ции которой передаётся... ну наверное указатель на
структуру и кол-во записей и нужно перечислить все доступные поля...
ещё лучше определить их тип итп итд...
Номер ответа: 4
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #4
Добавлено: 22.03.06 22:26
Эээ. Честно говоря понял не многое.
структуры по индексу
Это как? FIO-1, school-2, и.т.д.?
Ну как я понял нужно из массива типов достать одно поле? Тогда нужен указатель начала массива+сдвиг. Просто парой функций тут не обойтись. Здесь нужно как-то получить эти значения...
Номер ответа: 5
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #5
Добавлено: 22.03.06 23:37
Fever
Первый премер не работает потому что ошибок очень много.
HACKER
Вообще говоря к элементам структур по индексам обращаться нельзя. Прийдется поковыряться с памятью и указателями.
Вот небольшая пределка моего первого примера, может поможет.
pMyStruct->pMyStructura = new MyStruct::MyStructura ;
DWORD *pTr =(DWORD*) pMyStruct->pMyStructura->NameGoods;// приводим указатель на структуру (точнее на ее элемент)
int size = sizeof (MyStruct::MyStructura );// определяем размер структуры
int size1 = sizeof (pMyStruct->pMyStructura->NameGoods );// определяем размер элемента NameGoods
int size2 = sizeof (pMyStruct->pMyStructura->NameShop );// определяем размер элемента NameShop
int size3 = sizeof (pMyStruct->pMyStructura->Money );// определяем размер элемента Money
if (size==( size1+size2+size3))// проверяем
cin.getline ( (char*) pTr, 128);// заполняем NameGoods
pTr+= size1;// смещаемся на размер NameGoods
cin.getline ( (char*) pTr, 128); //заполняем NameShop
pTr+= size2;// смещаемся на размер NameShop
cin.getline ( (char*) pTr, 128); //заполняем Money
delete []pMyStruct->pMyStructura;
}
Номер ответа: 6
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #6
Добавлено: 23.03.06 04:04
HACKER
Еще немного.
Твои проблемы с освоением С, вызваны "наследием" VB. Ты хочешь найти что- то похожее, опираясь на прежний опыт.
Здесь лучше всего сказать - забудь все что знал раньше и начинай с нуля.
На С нельзя программировать не зная ASM, принципов работы ЭВМ, архитектуры. Причем не в общем, а нужно пощупать ручками. Итог - начинай с ASM и все сразу станет понятным(только никаких 32 разрядных самодельных MASM'ои, FASM'ов с их придурошными макросами - лучше начни с ДОС, а дальше видно будет...MASM 16 или TASM 16-32 ) .
Вдогонку.
С - уникальный язык, и хотя его причислят к языкам высокого уровня, он вобрал в себя очень много от ассемблера.
Недаром его часто называт выскоуровневым ассемблером.
З.Ы. Кстати незнание ASM отрезает очень многих прграммистов от С.
Номер ответа: 7
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #7
Добавлено: 23.03.06 16:44
Я ASM понимаю хорошо, пишу и не жужжу, а С -это превыше моих сил
Номер ответа: 8
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #8
Добавлено: 23.03.06 18:17
Fever
Пока у тебя просто не было особой нужды использовать С.
Если ты пишешь на ASM, уверен, что писать на С не будет выше твоих сил.
Номер ответа: 9
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #9
Добавлено: 23.03.06 18:39
Я тут ошибся.
Вместо строки.
Нужно.
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 23.03.06 22:32
Vito, безспорно согласен, ассемблер я тоже слегка долбаю, дальше он у
нас по программе... но начали мы именно Си. Так что асм будеь дальше
Я понимаю что архитектуру я досконально не знаю, но это не освобождает
меня от сдачи лабораторных работ.
Кроме того, сдавать лабы на примитивном уровне, просто ради
удовлетворительной оценки тоже нехочется, я учу Си не для оценки в
универе, для себя... поэтому хочу больше, делаю сложнее, пишу лабы
дольше, за то потом толку больше...
Теперь о самой задачи...
DWORD *pTr =(DWORD*) pMyStruct->pMyStructura->NameGoods;// приводим указатель на структуру (точнее на ее элемент)
int size = sizeof (MyStruct::MyStructura );// определяем размер структуры
int size1 = sizeof (pMyStruct->pMyStructura->NameGoods );// определяем размер элемента NameGoods
int size2 = sizeof (pMyStruct->pMyStructura->NameShop );// определяем размер элемента NameShop
int size3 = sizeof (pMyStruct->pMyStructura->Money );// определяем размер элемента Money
Ты передал в ф-цию указатель на структуру, потом перебирая все поля
посчитал размер всей структуры. Вот мне нужно АВТОМАТИЧЕСКИ перебрать
эти поля (NameGoods, NameShop, Money)...
А общий вид представляю примерно такой...
void EnteraData (MyStruct* pMyStruct , int count){
for (int i=0;i<count;i++){
cout<<"Введите поля записи № "<<i<<"\n";
//Каким то макаром (циклом, перечеслением незнаю тут
//перебераются поля)...
//И получается что-то типа (далее по русски не смеятся! ))
Перечисляем поля структуры (pMyStruct){
cin>>pMyStruct(i).поле;
}
//А ручками как мне показывали, это были примерно...
//cin>>pMyStruct(i).NameGoods;
//cin>>pMyStruct(i).NameShop;
//cin>>pMyStruct(i).Money;
//=======
}
}
Неужели никак автоматически не пройтись по структуре?
Номер ответа: 11
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #11
Добавлено: 24.03.06 00:46
HACKER
Не уверен, но поробую догадаться что от тебя хотят.
Каждая структура описывает ну допустим человека, количеству людей соответствует кол во структур - count.
То есть у нас их много. И получаем доступ к структуре описыващей человека через индекс. Ко всей структуре, а не к полю.
Вот примерчик.
void MyStruct::EnterData (MyStruct* pMyStruct , int count){
pMyStruct->pMyStructura = new MyStruct::MyStructura[count] ;// объявляем массив структур размером count
for (int i=0;i<count;i++){
cout<<"Введите поля записи № "<<i<<"\n"<<endl;
cin>> pMyStruct->pMyStructura.NameGoods ;
cin>> pMyStruct->pMyStructura.NameShop ;
}
delete []pMyStruct->pMyStructura;
}
Может это надо? А не доступ к отдельному элементу одной структуры?
Номер ответа: 12
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #12
Добавлено: 24.03.06 00:48
С примерчиком глюк
pMyStruct->pMyStructura = new MyStruct::MyStructura[count] ;// объявляем массив структур размером count
for (int i=0;i<count;i++){
cout<<"Введите поля записи № "<<i<<"\n"<<endl;
cin>> pMyStruct->pMyStructura[i].NameGoods ;
cin>> pMyStruct->pMyStructura[i].NameShop ;
}
delete []pMyStruct->pMyStructura;
}
Номер ответа: 13
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #13
Добавлено: 24.03.06 01:09
господи, у то и препод так
for (int i=0;i<count;i++){
cout<<"Введите поля записи № "<<i<<"\n"<<endl;
cin>> pMyStruct->pMyStructura.xxxxxxxxxxxxxx ;
cin>> pMyStruct->pMyStructura.NameShop ;
}
Итка
где xxxxxxxxxxxxxx - имя всех полей в структуре которые нужно ввести по очереди, т.е. я у примеру незнаю какие поля может содержать структуры, или её переписать захочу, изменю имена полей... А ФУНКЦИЯ НУЖНА УНИВЕРСАЛЬНАЯ ДЛЯ ЗАПОЛНЕНИЯ ЛЮБОГО МАССИВА СТРУКТУРЫ ж)
Номер ответа: 14
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #14
Добавлено: 24.03.06 02:35
HACKER
Извини, я пас,ничего не понял...
Номер ответа: 15
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #15
Добавлено: 24.03.06 02:38
Здесь все или гораздо проще, что вероятнее или сложнее.
Ты можешь оригинальное задание показать.
Только не на украинском