LINUX.ORG.RU

Как вывести содержимое C-структуры?


2

2

После нескольких лет джаваскрипта осваиваю сишечку. Не хватает аналога console.dir(object), который выводит на экран содержимое объекта в виде:

поле: значение
... 

Возможно ли такое в си для структур?

★★★★★

Последнее исправление: makoven (всего исправлений: 2)

Ответ на: комментарий от Kuzy

можнозделать (на самом деле нельзя)

Да можно, уже написали ключевые слова - gccxml и препроцессор, ничего там особо сложного нет. Только это никому особо не нужно

anonymous
()

Нихрена себе вы тут понаписали пока я линолеум клал)

makoven ★★★★★
() автор топика

Не хватает аналога console.dir(object)

Аналог JS object в С++ это std::map. Для Си — нечто подобное std::map и имеющее метаинформацию о себе.

А если надо дебажить структуры выводом, то как-то так:

typedef struct {
    int size;
    const char *name;
} info_t;

int main() {
    info_t info = { 42, "Foo" };

    printf("{ size: %d, name: %c }", info.size, info.name);

    return 0;
}

KennyMinigun ★★★★★
()
Ответ на: комментарий от Eddy_Em

не, некрасиво.

лучше нумера и «строчки» кодирующие представление

а выводильщик на вход получает адресс и что за нумер

и читает согласно «сточки» по нумеру по адрессу

т.е эдакий свой принтф. т.е для структуры пишеш «poleA%ifildB%irusloC%d»

парсеру передаюёш (tag,&valoftypetag) и оно

выдаёт

poleA:239234 fildB:78234 rusloC:4353.345345

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: комментарий от stevejobs

ура, мы надругались на C++, теперь в нём всё работает!

я и не знал, что грибы можно курить..

ps/ почти всё что хочет ТС можно сделать через libdwarf, но пока приходёт такое понимание, надобность в таких извращениях давно отпадает..

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

можно сделать через libdwarf

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

i-rinat ★★★★★
()
Ответ на: комментарий от stevejobs

Да нет, это я так, в плане реакции на вброс :)

den73 ★★★★★
()
Ответ на: комментарий от b-stern

Да. Не всем, а всем _желающим_. Есть разница? К тому же у нас и вакансия открыта, но никак руки не дойдут этим заняться.

den73 ★★★★★
()
Ответ на: комментарий от anonymous

Да, про gccxml я тоже вспоминал, но не знал, как он называется.

den73 ★★★★★
()
Ответ на: комментарий от stevejobs

А что у этих нормальных языков с производительностью?

Я как то писал одну вычислительную программу, сперва зачем-то на c++. переписал на C - скорость выросла в разы. А c++ побыстрее джавы будет.

cvs-255 ★★★★★
()
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от i-rinat

А по-моему, нормальный ответ на заданный тобой вопрос.

tailgunner ★★★★★
()
Ответ на: комментарий от cvs-255

Числодробилка на С++ сливающая С в разы? К хирургу на выпрямление рук проследуйте.

NegatiV
()

Можно начать пользоваться C++ и перегрузить 'operator <<'

comp00 ★★★★
()
Ответ на: комментарий от i-rinat

Понятно, что это возможно сделать. Но делал ли кто-нибудь такое?

кто понимает, что это возможно, понимает что это ненужно..есть gdb и printf

если пытаться делать рефлексию через dwarf то выходит какой-то извращённый «внутренний gdb» :) и в чистом С всё равно оно нужно только для printf..который и так проще некуда

MKuznetsov ★★★★★
()
Ответ на: комментарий от i-rinat

Отвечая на удаленный пост... ИМХО, вполне очевидно, что подобное делалось десятки раз - это фаново, не сложно, и полезно. А довести код до публикабельного состояния - наоборот.

tailgunner ★★★★★
()
Ответ на: комментарий от b-stern

Скажешь, это из-за того что происходит автоматическое приведение типов при умножении float и int?

Булев еще забыл.

Deleted
()

void mystruct_snprint(char *buf, size_t size, const struct mystruct * s);

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Прикол в том, что так более чем дофига языков, которые, судя по википедии, со строгой типизацией, на самом деле со слабой. Та же жабка, как я помню.

b-stern
()
Ответ на: комментарий от anonymous

Ты же явно указываешь в скобочках что хочешь привести к типу long. Где же тут слабая типизация?

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

Сильная/слабая типизация описывает допустимые преобразования типов, а не способ этого преобразования. В строго типизированных языках может даже отсутствовать преобразование int -> float. Так что всякие float a = 1; там может даже не скомпилировать.

anonymous
()
Ответ на: комментарий от anonymous

В строго типизированных языках может даже отсутствовать преобразование int -> float.

А может и не отсутствовать. С тем, что в С/С++ типизация весьма условно строгая спорить не буду, но вот этот пример с лонгом точно не в ту степь. Скажем, хаскель достаточно строг в этом плане? Но конвертить (хоть и не явно) позволяет.

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

DarkEld3r ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.