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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2011, 14:40   #1
rus_phantom
Пользователь
 
Регистрация: 02.05.2011
Сообщений: 16
По умолчанию Передача структуры в функцию

Есть структура:
Код:
struct defaultposition{
    char level[32];
    struct {
        float x;
        float y;
        float z;
    } direction;
    struct {
        float x;
        float y;
        float z;
    } position;
    long level_vertex;
    int game_vertex;
};
И есть функция, которая парсит строку типа -246.72631835938,-24.793264389038,-134.4338684082 в 3 float числа и загоняет ее в структуру. Вот функция:

Код:
void parse_vector(char str[],struct defaultposition *structure)
{
    char* str_orig = new char[256];
    
    strcpy(str_orig,str);
    str_cut(str,0,strlen(str)-string_find(str,","));
    structure.x=atof(str);
    
    str_cut(str_orig,string_find(str_orig,",")+1,0);
    strcpy(str,str_orig);
    str_cut(str,0,strlen(str)-string_find(str,","));
    structure.y=atof(str);
    
    str_cut(str_orig,string_find(str_orig,",")+1,0);
    structure.z=atof(str_orig);
    
    delete str_orig;
    printf("vector=%f,%f,%f\n",structure.x,structure.y,structure.z);
    
}
Но есть проблема. Как можно сделать так, чтобы я в функцию мог передать разные структуры. Допустим я хочу чтобы строку -246.72631835938,-24.793264389038,-134.4338684082 функция распарсила в структуру defaultposition.position, а потом чтобы функция распарсила строку 0.3543214,0.312412,0.964343 в defaultposition.direction. Что мне нужно указать в виде параметров?
rus_phantom вне форума Ответить с цитированием
Старый 19.10.2011, 15:43   #2
k1moshka
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 16
По умолчанию

А чем строка с числами -246.72631835938,-24.793264389038,-134.4338684082 отличается от строки с числами 0.3543214,0.312412,0.964343
Научи функцию различать их
k1moshka вне форума Ответить с цитированием
Старый 19.10.2011, 15:53   #3
rus_phantom
Пользователь
 
Регистрация: 02.05.2011
Сообщений: 16
По умолчанию

Нет, вы меня не поняли. Здесь задача стоит в том чтобы передать структуру, которая уже находится в структуре по ссылке в функцию
Что нужно написать вместо struct defaultposition *structure чтобы функция принимала такую структуру?
rus_phantom вне форума Ответить с цитированием
Старый 19.10.2011, 16:27   #4
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

надо использовать объединения (union)
отдельно объявить структурки
Код:
    struct {
        float x;
        float y;
        float z;
    } direction;
    struct {
        float x;
        float y;
        float z;
    } position;
потом основную структуру с объединением
Код:
struct defaultposition{
    char level[32];
    union {
      direction dir;
      position pos;
    }    
    long level_vertex;
    int game_vertex;
};
в общем как-то так....
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 19.10.2011, 16:35   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

union там не надо, так как это части одной структуры(причем разные части)
и нет смысла делать два типа структур, они одинаковы:
Код:
typedef struct 
{
        float x;
        float y;
        float z;
} Point;

typedef struct 
{
    char level[32];
    Point direction;
    Point position;
    long level_vertex;
    int game_vertex;
} defaultposition;

void parse_vector(char* str,Point*struc)
{
    char* str_orig = new char[256];
    
    strcpy(str_orig,str);
    str_cut(str,0,strlen(str)-string_find(str,","));
    structure.x=atof(str);
    
    str_cut(str_orig,string_find(str_orig,",")+1,0);
    strcpy(str,str_orig);
    str_cut(str,0,strlen(str)-string_find(str,","));
    structure.y=atof(str);
    
    str_cut(str_orig,string_find(str_orig,",")+1,0);
    structure.z=atof(str_orig);
    
    delete str_orig;
    printf("vector=%f,%f,%f\n",structure.x,structure.y,structure.z);
    
}
ну и вызываем:
Код:
parse_vector(str,&defaultposition.direction);
parse_vector(str2,&defaultposition.position);
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.10.2011, 18:04   #6
rus_phantom
Пользователь
 
Регистрация: 02.05.2011
Сообщений: 16
По умолчанию

Только тогда void parse_vector(char* str,Point struc)

Последний раз редактировалось rus_phantom; 19.10.2011 в 18:09. Причина: Уже сам нашел ошибку
rus_phantom вне форума Ответить с цитированием
Старый 19.10.2011, 18:15   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

нет, вам нужен выходной параметр, потому и указатель нужен, чтобы вернуть данные куда просил вызывающий.
а то скопируете структуру, измените копию, а оригинал то ничего не получить.(у вас по сути аналог локальной переменной)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.10.2011, 20:11   #8
rus_phantom
Пользователь
 
Регистрация: 02.05.2011
Сообщений: 16
По умолчанию

А да, извините, забылся

Но при попытке компиляции получаю ошибку:
28 C:\Users\Ïðèçðàê\Documents\C\just_t est.cpp request for member `x' in `structure', which is of non-class type `vector*'

28:structure.x=atof(str);

Прошу еще раз извинить - еще раз все перепроверил и все заработало. Спасибо за помощь

Последний раз редактировалось rus_phantom; 19.10.2011 в 20:24.
rus_phantom вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача адреса структуры в функцию notHaker Общие вопросы C/C++ 14 08.09.2011 19:42
Передача структуры в функцию (Си ) Trackman Помощь студентам 0 26.05.2011 11:23
Передача массива в функцию GladiatoR24 Общие вопросы C/C++ 3 24.11.2010 22:51
Вставка в функцию значение из структуры iSky Общие вопросы C/C++ 7 24.10.2010 00:57
Передача массива в функцию Vistar Общие вопросы C/C++ 1 27.04.2009 08:08