LINUX.ORG.RU

Вытащить члена структуры без передачи аргумента низя?

 


0

3

Есть заголовок:

struct rdp_settings
{
	ALIGN64 void* instance; /* 0 */
	UINT64 padding001[16 - 1]; /* 1 */

	ALIGN64 BOOL ServerMode; /* 16 */
	ALIGN64 UINT32 ShareId; /* 17 */
	ALIGN64 UINT32 PduSource; /* 18 */
	ALIGN64 UINT32 ServerPort; /* 19 */
	ALIGN64 char* ServerHostname; /* 20 */
	ALIGN64 char* Username; /* 21 */
	ALIGN64 char* Password; /* 22 */
	ALIGN64 char* Domain; /* 23 */
};
typedef struct rdp_settings rdpSettings;

В функции структура передается вот так:

void rdp_write_synchronize_pdu(wStream* s, rdpSettings* settings)
{
	Stream_Write_UINT16(s, SYNCMSGTYPE_SYNC);
	Stream_Write_UINT16(s, settings->PduSource);
}

Я так понимаю без аргумента rdpSettings* settings переменную settings->Username не вытащить?

Гм... А из чего ее вытаскивать? Надо же передать структуру...

timdorohin ★★★★
()

Не понятно нихрена, чего ты хочешь.

1) Ты и так передаешь не структуру, а указатель на неё

2) Можешь передавать только settings->Username

Но повторюсь, я не понял, что ты на самом деле хочешь

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

Кстати да, он же может сразу передавать значение settings->Username

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

Ты и так передаешь не структуру, а указатель на неё

Да это понятно.

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

Но повторюсь, я не понял, что ты на самом деле хочешь

Я не хочу переделывать 50 функций, чтобы по цепочке передать указатель.

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

статическая глобальная переменная, псевдокод:

static struct mystruct * data = malloc(mystruct....

использование

void process_struct() { *data.username ... }

extern если нужно объявить в одном модуле а использовать во многих, объявлешь так же а в используемых делаешь

extern struct mystruct * data (на счет статика тут не уверен)

не благодари, на сях писал последний раз в колледже лет 15 назад

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

static особо не обязателен, вроде, а extern говорит линкеру как бы «есть такая переменная, но объявлена {* память выделена *} где-то еще»

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

Вот если бы ты писал на Хаскеле, я бы сказал, что тебе нужна монада Reader. На Си лучше передавай структуру по цепочке.

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

В приличном обществе член не вытаскивают аргументы глобальными переменными не передают.

anonymous
()

переменную settings->Username не вытащить?

Почему?

void onlyForUserName(const char *uname) {
    if (uname) {
        printf("uname = %s\n", name);
    }
}

onlyForUserName(settings->Username);

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

Это не важно, что длинная цепочка, надо передавать явно.

Вариант передачи параметра через глобалные переменные приведет к абсолютной нечитаемости кода и куче потенциальных ошибок.

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

У FreeRDP обычно во всех таких структурках уже есть какая-нибудь void* с прямым или косвенным указателем на Самый Главный Контекст. Так что если тебе очень капец как надо, то добраться можно до чего угодно откуда угодно. Без глобальных переменных, но с нарушениями инкапсуляции.

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