LINUX.ORG.RU

поля в структуре


0

0

Приветствую.
struct _MyStruct
{
int val1;
int val2;
int val3;
};

typedef struct _MyStruct MyStruct;

main()
{
MyStruct *mst;
int i;

mst=malloc(sizeof(MyStruct));
mst->val1=1;
mst->val2=2;
mst->val3=3;

i=mst->val3;
}
возможно ли к полю val3 обратиться не i=mst->val3, а как нибудь по положению
поля в структуре (что нибудь типа i=&(mst+8)), причем +8 тоже както нужно вычислить.
Попробую по другому обьяснить проблему:
Функция работает со значением в каком либо поле структуры, причем поля могут быть различные
(либо val1, либо val2, либо val3, ...) возможно ли указать этой функции с каким полем работать
но не так:
if(name_field==1)i=mst->val1;
else if(name_field==2)i=mst->val2;
else i=mst->val3;
т.к. полей в структуре очень много и они имеют различные типы.


На C++:

#include <iostream>

struct _MyStruct
{
        int val1;
        int val2;
        int val3;
};

typedef struct _MyStruct MyStruct;

main()
{
        MyStruct mst;
        int i;

        mst.val1=1;
        mst.val2=2;
        mst.val3=3;

        int _MyStruct::*j = &_MyStruct::val3;

        i=mst.*j;


        std::cout << i << std::endl;
}

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

к сожалению (в данном случае) программа пишется на С. как раз глядя на С++ я и озадачился как еще можно обрашаться к полям структуры на языке С.

CL
() автор топика

> возможно ли к полю val3 обратиться не i=mst->val3, а как нибудь по положению поля в структуре

Можно, конечно. Указатель+смещение и не забудь привести тип. Вот только так писать не надо без особой нужды.

> возможно ли указать этой функции с каким полем работать но не так:

А почему не так? У тебя есть определённая логика работы алгоритма и она должна быть как-то реализована или изменён алгоритм.

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

Так писать оправдано только в особых обстоятельствах, например, для прошивок встроенных устройств.

anonymous_incognito ★★★★★
()

чтото я туплю с синтаксисом
main()
{
MyStruct *mst;
int i;
int *o;

mst=malloc(sizeof(MyStruct));
mst->val1=1;
mst->val2=2;
mst->val3=3;

i=mst->val3;
o=(int*)mst+offsetof(MyStruct,val3);
printf ("i = %d o = %d\n",i,*o);
}
вывод printf i!=o, подскажите где не правильно

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

тоже самое различные значения. Я в отладчике посмотрел
адрес mst: 0x8b2d008
после выполнения строки
o=(int*)(mst+offsetof(MyStruct,val3));
адрес o: 0x8b2d068
т.е смещение идет на 0x60
а offsetof(MyStruct,val3)=8
попробовал вот так
o=(int*)(mst+4);
адрес o: 0x8b2d038
похоже или смешение вообще так не реализовать или мне нужно выпить йаду

CL
() автор топика

Если тебе нужно узнать значение "int val1;" не способом "mst->val1;" а чeмто покрасивее то - 

т.к. val1 есть int, тебе нужен указатель на int.

#include <iostream>
using namespace std;
void quit_app();
struct a
{
	int i1;
	int i2;
	int i3;
};
typedef int typeINT;
typedef int * PVALN;
typedef struct a MSTRUCT;

int main(int argc, _TCHAR* argv[])
{
	MSTRUCT ms;
	ms.i1 = 22;
	ms.i2 = 81;
	ms.i3 = 555;

	typeINT firstVal;
	PVALN pNonknownVal;
	
	pNonknownVal = &ms.i1;
	cout << "Size Of int - " << sizeof(int)<< endl;	
	cout << *pNonknownVal << endl; // print ms.i1
	cout << pNonknownVal << endl;

	firstVal = *pNonknownVal++;    // + int
	cout << firstVal << " != ";
	cout << *pNonknownVal << endl; // print ms.i2
	cout << pNonknownVal << endl;

	pNonknownVal++;
	cout << *pNonknownVal << endl; 
	cout << pNonknownVal << endl;

	// quiting..
	quit_app();
	return 0;
}

void quit_app()
{
	char c;
	do
	{
		cout << "Press any Enter to quit..\n";
	}while ((c = getchar()) != '\n');
}
 

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

вы думаете что он знает perl??

меня терзают жуткие сомнения

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

> хренасебе вы чудите....
маладца, дай руку пожму, я как увидел чуть род стол не свалился :)
но меня опередил с коррецией

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