Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Функция, определяющая тип аргумента. (Си)  (Прочитано 840 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Допустим у меня такой код:


int size_type(void *arg)
{
int size; /*Это переменная, которая должна содержать размер типа, расположенного по указателю*/
size = sizeof (arg); /*какой бы ни был тип, на который указывает указатель, size == 4*/
size = sizeof (*arg); /*то же самое*/
size = sizeof (&arg); /*А это уже идиотизм*/
/*Что тут должно быть?*/
return size;
}

/*мне нужно, чтобы функция возвращала 1 в случае size_type(char), 4 в случае size_type(int) и т.д.*/
Я не понимаю, как извлечь размер типа по адресу *arg.
P.S. sizeof не предлагать.

andrey_p

  • Гость
Никак. void* - это просто адрес места в памяти. Что в этом месте храниться, компилятору или еще кому-либо неизвестно (за исключением программиста, пишущего код).

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Ну, вот мне и интересно - мне нужно извлечь информацию, хранящуюся в этом месте и проверить ее тип, нет?

andrey_p

  • Гость
Для этого в С делают структуры с тегами, которое занимает первое поле, а когда получают, преобразуют в этот тег, а потом в switch определяют - что есть что. Не зря говорят, что С - ассемблер высокого уровня.

ЗЫ Что вообще конкретно надо то?

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Собственно, я пытаюсь написать функцию, которая возвращает размер аргумента и его тип.

Пользователь решил продолжить мысль 18 Июня 2011, 14:27:01:
>>Для этого в С делают структуры с тегами, которое занимает первое поле, а когда получают, преобразуют в этот тег, а потом в switch определяют - что есть что.
Не совсем понял, что вы имели в виду.

Пользователь решил продолжить мысль 18 Июня 2011, 14:29:44:
Может, у меня неправильный подход? Стоит ли тут вообще использовать указатели на void?
В общем, КАК мне сделать подобную функцию?
« Последнее редактирование: 18 Июня 2011, 14:29:44 от Sеr »

andrey_p

  • Гость
Цитировать
Собственно, я пытаюсь написать функцию, которая возвращает размер аргумента и его тип.

Тип (и соотвественно размер) известны только на этапе компиляции. В С нельзя написать подобную функцию.

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
хм..
А если, допустим, у меня существует битовое поле, в котором уже предварительно записан тип, то я смогу определить размер, верно?
Значит, тогда последний вопрос.
Допустим, у меня сделан файл такого типа:
8 бит - указано, какой тип данных | произвольный размер - собственно данные | приоритет выполнения | символ конца строки
и так столбцами(таблицей)
и вопрос - как записать в начало строки битовое поле? и, если оно записано, как его заменить, не повредив содержимое файла?

andrey_p

  • Гость
Что-то типа:

enum
{
    FOO,
    BAR
} TAG;

typedef struct OBJECT
{
    TAG tag;
    size_t size;
    void * content;
} OBJECT;


В одном месте заполняешь все поля, в другом месте OBJECT obj = (OBJECT) * arg, считая что arg - это void *, и работаешь с obj.tag, obj.size, *obj.content (который тоже преобразуешь, в зависимости от оbj.tag).

Если все это непонятно, то значит бежишь впереди паровоза.
« Последнее редактирование: 18 Июня 2011, 15:22:29 от andrey_p »

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Что-то вы невразумительное пытаетесь сделать, уверен есть более простые способы. Давайте вы опишите задачу, а мы подумаем, как лучше.
А по первому вопросу можно сделать так:
struct Data {
int type;
int size;
void *data;}
Соответственно, в Data.type храним тип, например 1 - char, 2 - int, 3 - float, 4 - double, в Data.size храним размер выделенного блока данных, а в Data.data указатель на сами данные.

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Ну, считаем, что программа берет из какого то файла информацию, причем указан тип информации.
далее программа должна ее должным образом обработать, поэтому я создаю тип, который включает в себя описание информации, указатель на нее в памяти, и размер занимаемой памяти.
Фактически, в файле просто может содержаться различная информация - как строки, так и целые числа, так и новые типы, которая программа может не знать(ну или просто ошибки)
И эта функция должна описать информацию, проверить ее на ошибки и указать размер.
Что то вроде этого..

Пользователь решил продолжить мысль 18 Июня 2011, 15:37:25:
(Нажмите, чтобы показать/скрыть)
это определения типов.
я сейчас попробую написать функцию, которая считывает битовое поле и другие данные и записывает все в строку.
так что это в общем виде. Скорее всего, будет либо сложнее, либо гораздо легче =)
« Последнее редактирование: 18 Июня 2011, 15:37:25 от Sеr »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Функция, определяющая тип аргумента. (Си)
« Ответ #10 : 18 Июня 2011, 17:05:14 »
Sеr, ты от куда такой взялся? из другого мира? Иди учиться на программиста там тебе всё что надо расскажут.
И забудь все свои гениальные идеи. не может у тебя быть ни чего гениального пока ты даже не представляешь как работают существующие системы.
а по поводу всяких там типов данных иди почитай про asn.1 что ли. почитай как БД организовывают хранение произвольных записей.
главное не стесняйся сказать что ты на самом деле хочешь сделать. тебе популярно объяснят почему это не будет работать и дадут пинок в нужную сторону.

Пользователь решил продолжить мысль 18 Июня 2011, 17:13:17:
еще я думаю тебе стоит почитать про сериализацию/десериализацию
« Последнее редактирование: 18 Июня 2011, 17:13:17 от Yurror »

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: Функция, определяющая тип аргумента. (Си)
« Ответ #11 : 18 Июня 2011, 19:07:51 »
а еще я пытаюсь одновременно учить ассемблер и Си -_-
Так что Си бОльшая часть выучена, но далеко не все еще.
Мне очень интересно почитать книжку про устройство компьютера(железа, то есть про сис. прерывания и т.д.) но пока что такой книжки в наличии у меня попросту нет. а то что я сейчас знаю, это в общих чертах. и это меня не устраивает.
на программиста собственно я и собираюсь учиться..
я пока что школоло, что я говорю то.
пока что профильный класс, а из того, что преподают, я уже все знаю =(
короче, учу Си. и Асм. и всякой херней страдаю. Любые материалы, которые посоветуете - почитаю =/ главное, чтобы ссылка была =
и не судите особо строго, я же сказал - я еще школоло =/

Пользователь решил продолжить мысль 18 Июня 2011, 19:08:44:
>> не представляешь как работают существующие системы
представляю. но смутно.

andrey_p

  • Гость
Re: Функция, определяющая тип аргумента. (Си)
« Ответ #12 : 18 Июня 2011, 19:26:35 »
Да все нормально, только не торопись. Если бы того же K&R внимательно проработал, было бы достаточно для начала. Но там, о том что тебя волнует, в самом последнем разделе последней главы пример дается. Не совсем о том, конечно, но если бы ты это усвоил, то у тебя бы и вопросов не возникало бы, и задачу свою бы решил запросто.

 

Страница сгенерирована за 0.031 секунд. Запросов: 25.