由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 今天被一个面试问题难住了
相关主题
sgi stl 源代码一问unsigned long long
round function in math问一个排序的问题
两个古董的C优化代码,现在还有效果么?python比java慢这么多呀
Go’s path to becoming a Top 10 if not Top 5 language学python的必要性有多大?
C++中size_type怎么处理?【失败感言】我是做PHP的 (转载)
这两个地方是否需要typename?ruby,python有没有自己的ide?
如何 define/initialize static data member of a class templ微软的架构设计师真是大学生水平啊
这个dtor为啥能被调用呢脚本语言 vs 编译语言
相关话题的讨论汇总
话题: record话题: containing话题: macro话题: type
进入Programming版参与讨论
1 (共1页)
t******c
发帖数: 1103
1
有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
no C++).
求高人解答~
a*w
发帖数: 4495
2
sizeof?

【在 t******c 的大作中提到】
: 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
: 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
: no C++).
: 求高人解答~

a**e
发帖数: 64
3
很难理解。没有源码如何“加入新成员变量, int a”
t******c
发帖数: 1103
4
我觉得题目既然说 "有很多很多成员", 意思是a可能不是唯一增加的成员变量吧.
而且sizeof会随平台/版本有不同结果, 不太靠谱.

【在 a*w 的大作中提到】
: sizeof?
d*********8
发帖数: 2192
5
FYI
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) \
((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
#endif
t******c
发帖数: 1103
6
小弟才疏学浅, 真没看懂. 大神能解释一下吗?
尤其是这里的address是指的什么?

【在 d*********8 的大作中提到】
: FYI
: #ifndef CONTAINING_RECORD
: #define CONTAINING_RECORD(address, type, field) \
: ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
: #endif

i*****o
发帖数: 1714
7
假定last是这个struct的最后一个member:(void*)A->last - (void*)A + sizeof(A->
last) == sizeof(A) 就说明里面有a,否则没有。

★ 发自iPhone App: ChineseWeb 7.7

【在 t******c 的大作中提到】
: 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
: 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
: no C++).
: 求高人解答~

a****l
发帖数: 8211
8
http://www.cpptalk.net/containingrecord-macro-vt50598.html
Hi All
I was reading an article
"http://msdn.microsoft.com/msdnmag/issues/1000/Winsock/default.aspx"
where I encountered a macro called CONTAINING_RECORD. A purpose of this
macro is to return a poniter to the extended structure.
After the pointer to the OVERLAPPED structure is returned, the
CONTAINING_RECORD macro can be used to obtain a pointer to the extended
structure.
OVERLAPPED *Overlap;
OVERLAPPEDPLUS *OverlapPlus;
typedef struct _OVERLAPPEDPLUS {
SOCKET s, sclient;
OVERLAPPED ol;
int OpCode;
WSABUF wbuf;
DWORD dwBytes, dwFlags;
// other useful information
} OVERLAPPEDPLUS;
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
The defination of macro is as follows :
#define CONTAINING_RECORD(address, type, field)
((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
Could anyone help me out to understand the operations being performed
in macro.
Regards
Dinesh

【在 d*********8 的大作中提到】
: FYI
: #ifndef CONTAINING_RECORD
: #define CONTAINING_RECORD(address, type, field) \
: ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
: #endif

x****o
发帖数: 21566
9
this is Linux how access the field in the structure...?

【在 d*********8 的大作中提到】
: FYI
: #ifndef CONTAINING_RECORD
: #define CONTAINING_RECORD(address, type, field) \
: ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
: #endif

d*********8
发帖数: 2192
10
This is a C macro. has nothing to do with OS

【在 x****o 的大作中提到】
: this is Linux how access the field in the structure...?
相关主题
这两个地方是否需要typename?unsigned long long
如何 define/initialize static data member of a class templ问一个排序的问题
这个dtor为啥能被调用呢python比java慢这么多呀
进入Programming版参与讨论
d*********8
发帖数: 2192
11
哦,对了。里面是有几个微软变态的TYPEDEF
其实就是char* void*而已。

【在 d*********8 的大作中提到】
: This is a C macro. has nothing to do with OS
t******c
发帖数: 1103
12
有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
no C++).
求高人解答~
a*w
发帖数: 4495
13
sizeof?

【在 t******c 的大作中提到】
: 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
: 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
: no C++).
: 求高人解答~

a**e
发帖数: 64
14
很难理解。没有源码如何“加入新成员变量, int a”
t******c
发帖数: 1103
15
我觉得题目既然说 "有很多很多成员", 意思是a可能不是唯一增加的成员变量吧.
而且sizeof会随平台/版本有不同结果, 不太靠谱.

【在 a*w 的大作中提到】
: sizeof?
d*********8
发帖数: 2192
16
FYI
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) \
((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
#endif
t******c
发帖数: 1103
17
小弟才疏学浅, 真没看懂. 大神能解释一下吗?
尤其是这里的address是指的什么?

【在 d*********8 的大作中提到】
: FYI
: #ifndef CONTAINING_RECORD
: #define CONTAINING_RECORD(address, type, field) \
: ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
: #endif

i*****o
发帖数: 1714
18
假定last是这个struct的最后一个member:(void*)A->last - (void*)A + sizeof(A->
last) == sizeof(A) 就说明里面有a,否则没有。

★ 发自iPhone App: ChineseWeb 7.7

【在 t******c 的大作中提到】
: 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
: 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
: no C++).
: 求高人解答~

a****l
发帖数: 8211
19
http://www.cpptalk.net/containingrecord-macro-vt50598.html
Hi All
I was reading an article
"http://msdn.microsoft.com/msdnmag/issues/1000/Winsock/default.aspx"
where I encountered a macro called CONTAINING_RECORD. A purpose of this
macro is to return a poniter to the extended structure.
After the pointer to the OVERLAPPED structure is returned, the
CONTAINING_RECORD macro can be used to obtain a pointer to the extended
structure.
OVERLAPPED *Overlap;
OVERLAPPEDPLUS *OverlapPlus;
typedef struct _OVERLAPPEDPLUS {
SOCKET s, sclient;
OVERLAPPED ol;
int OpCode;
WSABUF wbuf;
DWORD dwBytes, dwFlags;
// other useful information
} OVERLAPPEDPLUS;
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
The defination of macro is as follows :
#define CONTAINING_RECORD(address, type, field)
((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
Could anyone help me out to understand the operations being performed
in macro.
Regards
Dinesh

【在 d*********8 的大作中提到】
: FYI
: #ifndef CONTAINING_RECORD
: #define CONTAINING_RECORD(address, type, field) \
: ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
: #endif

x****o
发帖数: 21566
20
this is Linux how access the field in the structure...?

【在 d*********8 的大作中提到】
: FYI
: #ifndef CONTAINING_RECORD
: #define CONTAINING_RECORD(address, type, field) \
: ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
: #endif

相关主题
学python的必要性有多大?微软的架构设计师真是大学生水平啊
【失败感言】我是做PHP的 (转载)脚本语言 vs 编译语言
ruby,python有没有自己的ide?感觉Swift开源后有望到当年visual basic的高度
进入Programming版参与讨论
d*********8
发帖数: 2192
21
This is a C macro. has nothing to do with OS

【在 x****o 的大作中提到】
: this is Linux how access the field in the structure...?
d*********8
发帖数: 2192
22
哦,对了。里面是有几个微软变态的TYPEDEF
其实就是char* void*而已。

【在 d*********8 的大作中提到】
: This is a C macro. has nothing to do with OS
b*******s
发帖数: 5216
23
规定初始化时其余成员一律为0,而这个必须为1
这样按byte加起来不为0就存在这个变量

【在 t******c 的大作中提到】
: 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
: 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
: no C++).
: 求高人解答~

t*****r
发帖数: 142
24
不明白想干什么。随便写个code,用上A.a,一编译不就知道了?
Runtime 检测应该是很变态的要求,c 毕竟是编译语言。

【在 t******c 的大作中提到】
: 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
: 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
: no C++).
: 求高人解答~

t*****r
发帖数: 142
25
不明白想干什么。随便写个code,用上A.a,一编译不就知道了?
Runtime 检测应该是很变态的要求,c 毕竟是编译语言。

【在 t******c 的大作中提到】
: 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
: 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
: no C++).
: 求高人解答~

n*****3
发帖数: 1584
26
it is used in the production code; sometime it is
hard to test it if it is part of a huge old system;

【在 t*****r 的大作中提到】
: 不明白想干什么。随便写个code,用上A.a,一编译不就知道了?
: Runtime 检测应该是很变态的要求,c 毕竟是编译语言。

m********5
发帖数: 17667
27
不是啊,比如你只改了很大一个project的一小部分
也只编译了这一部分,那么project中的其他部分仍然用了老的定义
或者其他部分对size敏感,hard-coded的,也要吃鳖
所以这东西其实很常见,项目做多了应该看到过。

【在 t*****r 的大作中提到】
: 不明白想干什么。随便写个code,用上A.a,一编译不就知道了?
: Runtime 检测应该是很变态的要求,c 毕竟是编译语言。

h**********c
发帖数: 4120
28
让我们猜一下出题人的意思
可能是这样, 你有一个.h,编译的时候,用到一个.o,运行时候甚至是一个dll.
<<<<<<<<
IDE多半告诉你它从.h看到的是什么,因为version control 或着qa 没做好, .h does
match .o 或者是 dll。
>>>>>>>>>
IDE多半告诉你它从.h看到的是什么,因为version control 或着qa 没做好, .h does
not match .o 或者是 dll。
这种现象在open source lib应该比较普遍。
<<<<<<<<
所以出题的人可能是想让你做一个c 的static type checking .
>>>>>>>>>>>>
所以出题的人可能是想让你做一个c 的dynamic type checking .
这种题就有点偏了,有的公司需要专家系统,有的要数据库....
面面一个人的基本逻辑思维,为人处事,肯不肯做事就行了。
看f35那个活干的,这种问题不奇怪。整个大氛围不是推理做事,而是难偏怪,
chopping logic.

【在 t******c 的大作中提到】
: 有一个struct A, 包含很多很多成员. 在某个版本中加入了一个新成员变量, int a.
: 在未知版本的情况下, 有无方法检测A.a是否存在? 如果有请说明其优劣. 限定C语言(
: no C++).
: 求高人解答~

h**********c
发帖数: 4120
29
五年以上system software
答不上来是不应该的
看背景看面什么了
p***o
发帖数: 1252
30
这需求不是挺常见么, 也跟open source扯不上什么关系, 另外对齐方式估计也得检查。
Win32里面的解决方式就是检查struct的大小,比如说
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
Members
nLength
The size, in bytes, of this structure. Set this value to the size of the SEC
URITY_ATTRIBUTES structure.

does
does

【在 h**********c 的大作中提到】
: 让我们猜一下出题人的意思
: 可能是这样, 你有一个.h,编译的时候,用到一个.o,运行时候甚至是一个dll.
: <<<<<<<<
: IDE多半告诉你它从.h看到的是什么,因为version control 或着qa 没做好, .h does
: match .o 或者是 dll。
: >>>>>>>>>
: IDE多半告诉你它从.h看到的是什么,因为version control 或着qa 没做好, .h does
: not match .o 或者是 dll。
: 这种现象在open source lib应该比较普遍。
: <<<<<<<<

相关主题
对PyCharm屈服了……round function in math
How to send a structure containing a pointer over socket?两个古董的C优化代码,现在还有效果么?
sgi stl 源代码一问Go’s path to becoming a Top 10 if not Top 5 language
进入Programming版参与讨论
h**********c
发帖数: 4120
31
Win32 or system software is not my area.
I wrote applications. Occasionally compile some open source projects for
experiments/prototypes.
If checking size only, if someone added a char[4] or two short int the size
won't change. Probably the interviewers want to hear something implementing
reflection(java) , moc_class (QT) , or their similarity.
Win32 or system software is not my area.

查。
SEC

【在 p***o 的大作中提到】
: 这需求不是挺常见么, 也跟open source扯不上什么关系, 另外对齐方式估计也得检查。
: Win32里面的解决方式就是检查struct的大小,比如说
: typedef struct _SECURITY_ATTRIBUTES {
: DWORD nLength;
: LPVOID lpSecurityDescriptor;
: BOOL bInheritHandle;
: } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
: Members
: nLength
: The size, in bytes, of this structure. Set this value to the size of the SEC

1 (共1页)
进入Programming版参与讨论
相关主题
脚本语言 vs 编译语言C++中size_type怎么处理?
感觉Swift开源后有望到当年visual basic的高度这两个地方是否需要typename?
对PyCharm屈服了……如何 define/initialize static data member of a class templ
How to send a structure containing a pointer over socket?这个dtor为啥能被调用呢
sgi stl 源代码一问unsigned long long
round function in math问一个排序的问题
两个古董的C优化代码,现在还有效果么?python比java慢这么多呀
Go’s path to becoming a Top 10 if not Top 5 language学python的必要性有多大?
相关话题的讨论汇总
话题: record话题: containing话题: macro话题: type