LINUX.ORG.RU

[C] как сделать красиво?

 


0

0

имеется структура

struct A {
    char * text;
    int width;
    int hight;
    ...
    и т.д
}

требуется присвоить значение определённому полю структуры в зависимости от значения переменной(для примера val). Например, если val == «text» , то значение записываем в поле text структуры, если val == «width» то значение заносится в поле width. Это можно сделать примерно следующим образом:

if(strcmp(val , "text") == 0)
    A->text = "some text";
else
    if(strcmp(val , "width") == 0)
        A->width = 300;
    else
        if(strcmp(val , "hight") == 0)
            A->width = 100;

и т.д Всё будет работать, но вопрос в том, как сделать такое красиво. Не хочется чтобы в коде было куча if/else, полей таких больше десятка. Пытался сделать макросом типа:
#define SET_ATTR_VALUE(stuct, attr, value) (struct->##attr = value;)
Но компилятор ругался, типа не может найти attr и не знает что такое struct, хотя в коде подставил SET_ATTR_VALUE(A, val, «some text»);

★★★★★

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

> Ты, во-первых, где это там увидел?

http://www.lispworks.com/documentation/HyperSpec/Body/m_w_slts.htm#with-slots

Во-вторых, это не аналог.


а кто сказал, что я буду писать аналог твоего бреда с ООП? стоит задача - хранить свойства, ТС сделал это на С как смог, это не повод копировать его логику на другом языке

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

> Вынужден согласится с лавсаном, ты фигню написал

в отличие от него - я отписался и по теме( про С ), и привел вариант как сделать просто на другом языке, а фигню писать - это влазить везде со своим лиспом и предлагать бредовые быдлокодерские решения

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

>На питоне, например, можно ли по содержанию строковой переменной сразу обратиться к нужному методу/свойству?

Да, getattr(obj, string). Или obj.__dict__[string]

anonymous
()

Лучше на Lua сделать.

window = { text = «Test window», width = 300, height = 100, { type = «button», text = «Click me», width = 50, height = 20, x = 50, y = 20 }, { type = «textbox», text = «Simple text», width = 100, height = 20, x = 50, y = 50 } }

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

> я отписался и по теме( про С ), и привел вариант как сделать просто на другом языке,

Совсем другую фигню, да.

Самое же смешное, что ты даже не понимаешь разницы. )))

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

Совсем другую фигню
Самое же смешное, что ты даже не понимаешь разницы. )))

самое смешное, что в отличие от всяких идиотов, я смотрю на задачу в целом, а не ставлю задачу вы%бнутся фичами языка - и вижу много разных виджетов с разными свойствами, а также вижу, что данные читаются из текстового файла, в итоге в моем примере чтение файла будет очень просто:

widget->props[ name ] = value;

где и name и value строки, а перенос свойств на реальный виджет будет также прост:

void Button::ApplyProperties( void )
{
    mpQtButton->setText( props[ "label" ] );
    Widget::ApplyProperties();
}

но ведь конечно это я дурак - лучше налабать на лиспе кучу классов для хранения данных под каждый виджет, а еще лучше - один большой, где будут все возможные свойства

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

> И нихера её не понимаешь. Бывает.

у тебя - однозначно, да

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

> По-твоему, невозможность такого вызова как-то связана с ассемблером? Это же совсем низкоуровневая вещь, которая ни про методы, ни про объектность вообще не догадывается.

А их нет, методов и объектности. Это симптом промывки мозгов - мастурбация на бессодержательные термины, пустышки.

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

> Хоть я плюсы и недолюбливаю, но кажется здесь им более место, чем просто Це.

Им нет места, нигде.

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

> >>А их нет, методов и объектности

Солипсист-самоучка?

Нет. Опытный инженер с критическим отношением к действительности. Есть конечные автоматы и тьюринг с фон-нейманом, есть структурное программирование, есть дейкстра. А ооп просто нет. Тем кто ничем серьезным не занимался, ооп кажется серьезным. Рынок? Веб? Ентерпрайз? Булочки с пряничками? От законов природы не отмахнешься.

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