Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Офф-топ

Страница: 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-сайт: softvito.narod2.ru
 Профиль | | #1
Добавлено: 22.03.06 04:27
Если класс выполняет одну задачу, почему бы не ввести структкру в класс и сделать примерно так.

cpp:

#include <iostream>
#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 <windows.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-сайт: softvito.narod2.ru
 Профиль | | #5
Добавлено: 22.03.06 23:37
Fever
Первый премер не работает потому что ошибок очень много.

HACKER

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

void MyStruct::EnterData (MyStruct* pMyStruct , int count){
       
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-сайт: softvito.narod2.ru
 Профиль | | #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-сайт: softvito.narod2.ru
 Профиль | | #8
Добавлено: 23.03.06 18:17
Fever
Пока у тебя просто не было особой нужды использовать С.
Если ты пишешь на ASM, уверен, что писать на С не будет выше твоих сил.

Ответить

Номер ответа: 9
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #9
Добавлено: 23.03.06 18:39
Я тут ошибся.

Вместо строки.
DWORD *pTr =(DWORD*) pMyStruct->pMyStructura->NameGoods;// приводим указатель на структуру (точнее на ее элемент)


Нужно.

const unsigned char *pTr =(unsigned char*) pMyStruct->pMyStructura->NameGoods;// приводим указатель на структуру (точнее на ее элемент)

Ответить

Номер ответа: 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-сайт: softvito.narod2.ru
 Профиль | | #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-сайт: softvito.narod2.ru
 Профиль | | #12
Добавлено: 24.03.06 00:48
С примерчиком глюк:)

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[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-сайт: softvito.narod2.ru
 Профиль | | #14
Добавлено: 24.03.06 02:35
cin>> pMyStruct->pMyStructura.xxxxxxxxxxxxxx ;


где xxxxxxxxxxxxxx - имя всех полей в структуре которые нужно ввести по очереди


 HACKER

Извини, я пас,ничего не понял...

Ответить

Номер ответа: 15
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #15
Добавлено: 24.03.06 02:38
Здесь все или гораздо проще, что вероятнее или сложнее.

Ты можешь оригинальное задание показать.

Только не на украинском:)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам