RPC编程的时候出现的左值问题 5C

i found a releative manual page about l-value on msdn.

you can check it here: https://msdn.microsoft.com/en-us/library/bkbs2cds.aspx

there is an example in this page, but it dose not work as it shows.

msdn上的左值演示,微软的扩展支持,当强制转换一个左值但不会改变变量的长度的时候,转换完依旧是一个左值,msdn上的示例也是想表达这个,但是实际测试的时候并没有其说明的效果,两个赋值表达式都是编译错误。

char *p ;  
short  i;  
long l;  

(long *) p = &l ;       /* Legal cast   */     // this statement can not complie sucess
(long) i = l ;          /* Illegal cast */  

i am not sure what's your result.

here is an example of mime:
然后自己写了一个实例,将char*类型指针转换成int*指针的时候,指针就无法自加了

char* pBuffer = new char[1024];

((int*)pBuffer)++;     //  the result is the same as the previous. it will issue : ++ need l-value

and the /ZA is not including in the complie cmd line.

the main purpose is that, the midl.exe will generate the samiliar code as previous. such as:

类似的midl编译一个idl文件生成的对应c文件中也有类似代码,并不能直接编译通过。不知道是不是哪里没有设置好。

[ RPCSync_s.c ]

    Result = 0;
    RpcTryFinally
        {
        RpcTryExcept
            {
            if ( (_pRpcMessage->DataRepresentation & 0X0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION )
                NdrConvert( (PMIDL_STUB_MESSAGE) &_StubMsg, (PFORMAT_STRING) &__MIDL_ProcFormatString.Format[0] );

            Param1 = *(( int __RPC_FAR * )_StubMsg.Buffer)++;   //  issue error: ++ need l-value
            Param2 = *(( int __RPC_FAR * )_StubMsg.Buffer)++;   //  issue error: ++ need l-value

i am waiting for code god to help me here, thk very much!

另外有没有C/C++实现的 RPC 同步调用的示例,能否编译通过

0

1个回答

查了一下,这个应该是msdn写错了吧,一般来说,这样做是正常的:
char *p;
short i;
long l;

p = (char*)&l;       /* Legal cast   */
i = (short)l;          /* Illegal cast */

一般的类型转换,都是在等号右侧来做的,在左侧做,应该是无法通过吧,因为左值要求不能是一个算式,你最后这段代码,我感觉调整一下括号似乎可以,因为主要问题是内部那个自加变量进行了类型转换造成的,比如以下代码:
long l;
char* pBuffer = new char[1024];
strcpy(pBuffer, "11112222");
l = *(long *)(pBuffer);
l = *(long *)((pBuffer) += sizeof(long));
后面两次执行的结果,long分别是0x31313131,0x32323232,这样一个做法应该是可以达到目的的,请看一下,调整一下括号
0
qq_35162107
Aecu潘神 回复phenix2009: _RPC_FAR是定义为空的宏,只做标识使用,该代码是微软提供的midl工具编译idl自己生成的,所以编译器自己生成的代码却无法编译通过比较困惑。个人也觉得是强制转换造成的,可是看MSDN上的意思好像微软自己的标准是支持这种转换的,其意思是强制转换后变量的大小如果不发生变化的话,仍然认为是一个左值,实测又没有这效果,所以想看看别人是否有相关的经验
一年多之前 回复
phenix2009
白色一大坨 不了解你最后一段代码具体的类型结果,你只要把__RPC_FAR代替long,_StubMsg.Buffer代替了pBuffer,应该可以进行操作,请务必试一下
一年多之前 回复
phenix2009
白色一大坨 反正主要问题是左值要是个变量,如果是表达式,比如你程序里面的那种转换,结果是无法改变的,问题就出在这里
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于RPC编程的问题。
最近我写了一个RPC程序。rn在本机用rpc打开一个tcp端口,然后用client端本机连接端口,进行rpc调用,但是,本机调用时显示 拒绝访问。 于是我便做了个远程的。结果显示,rpc为监听。rn我不清楚这是什么原因。想请大家指点一下。rn或者给一个基础一些的例子,或文章,谢谢
关于rpc编程的问题。。。。。
我想把在一个客户机上输入一个命令,例如/client hostname 12,之后服务器上显示your input value = 12,然后给客户机返回一个值12+1,请问该代码有什么问题??rnrnrn服务器端代码:rn#include rn#include rn#include rn#include "rpc.h"rnunsigned int nuser(unsigned int ui)rnrn printf("haha,your input value = %d\n",ui);rn return (ui+1);rn;rnmain()rnrn registerrpc(DEMOPROG, DEMOVER, DEMOFUNC,rn nuser, xdr_u_int, xdr_u_int);rn svc_run(); /* Never returns */rn fprintf(stderr, "Error: svc_run returned!\n");rn exit(1);rnrnrnrn客户机端代码:rn#include rn#include rn#include rn#include "rpc.h"rnrnmain(argc, argv)rn int argc;rn char **argv;rnrn unsigned long nusers=0;rn int stat=0;rn unsigned int val=0;rn if (argc != 3) rn fprintf(stderr, "usage: nusers hostname\n");rn exit(-1);rn rn val = atoi(argv[2]);rn printf("val = %d\n",val);rn if (stat = callrpc(argv[1],rn DEMOPROG, DEMOVER, DEMOFUNC,rn xdr_u_int,&val, xdr_u_int, &nusers) != 0) rn clnt_perrno(stat);rn exit(1);rn rn printf("%d users on %s\n", nusers, argv[1]);rn exit(0);rnrnrnrn头文件rpc.h:rn#define DEMOPROG 0x20000001rn#define DEMOVER 0x1rn#define DEMOFUNC 0x1rnrnrnrn
RPC编程
RPC(Remote Procedure Call, 远程过程调用)是一种通过网络从远程计算机程序请求服务,而不需要了解底层网络细节的应用程序通信协议。构建于TCP或UDP,或是HTTP。 1.Go语言中RPC的支持于处理 2.Gob简介 3.设计优雅的RPC接口 实际上,Go标准库提供的net/rpc/json包,就是一套实现了rpc.ClientCodec和rpc.ServerCode...
左值、左值表达式、左值引用 C++
关于这边文章的topic 什么是左值和右值 什么是左值表达式、右值表达式 引用的分类 之前学习Java的时候只记得在赋值表达式左边的就是左值,右边的就是右值。这个说法没有错,但今天又在C++中有学习到了关于左右值得概念,在此梳理了一些这些知识点。 左值和右值 左值:左值是一个对象或变量,可以代表着一个固定地址。 int i = 1;//此时,i是个变量,本质和对象一样,是一块内存区域,代表着一...
char * 左值问题
如下代码rn[code=C/C++]rn char ch = 'a';rn char *cp = &ch;rn cp = "abc";rn printf("%s \n", cp);rnrn *(cp+1) = 'P'; // keyrn printf("%c \n", *cp);rn[/code]rnrnrn书上说 *(cp+1)可以用作左值, 但调试出现访问冲突,为何 ? 谢谢
左值的问题
int int(int offset) rnrn struct mem_t * p;rn (int)p = offset;rn ...rn ...rn rnrn为什么在另外一个工程中报错误而一个工程中编译通过.rn编译错误是 p 不是左值rnwindwos2000 + vc60
在预览打印发票的时候出现RPC服务器不可用
在预览打印发票的时候出现RPC服务器不可用,不太明白怎么回事,希望大侠们,给解决下。。。。 跪求rnrn系统提示信息“system error. code:1722.RPC 服务器不可用”rnrn在此跪谢大侠们
左值问题
i++与++i的赋值问题以前在编程时。没有注意这样一件事情,一个整型变量,做前加加和后加加后,能否再给它赋值???今天就让我们验证一下吧!!! 我们写下面一段程序int main() { int iIndex = 0; ++iIndex = 20; iIndex++ = 10; return 0; }一些功能强大的编译器在不不编译的情况下就已经能够提示iIndex++
左值问题?
int a=3;rn++(a++); a++不是左值 (摘自钱能《C++程序设计教程》)rn 是不是因为a++的意思是必须在该语句执行完毕后,a自加1,而++是提前加1,当两者同时出现时会产生矛盾,所以a++不是左值,希望各位大侠不吝赐教?
左值和右值问题
不明白a==8;和8==a的区别?
左值?
[code=C/C++]rnvoid getimage256(x1,y1,x2,y2,image)rnshort x1,y1,x2,y2;rnchar-huge *image;rnrnchar-far*buf,-huge *q;rnlong u;rnshort m,n,i,j,block;rnm=abs(x2-x1)+1;rnn=abs(y2-y1)+1;rn(short)*image=m; //编译到这里 TC报错 说“Lvalue required in function getimage256” 下面那句也是这个错误rn(short)*(image+2)=n;rn[/code]rnrn求解释
右值和左值,右值引用和左值引用
右值和左值左值右值的形式区分(或者称语法区分)是能否用取地址&运算符;语义区分(即其本质涵义)在于表达式代表的是持久对象还是临时对象。 当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置) ——CppPrimer, 5th 返回左值的有: 赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果也是一个左值 取地址作用于一个左值运算
左值
double & dr=1 //错,要求左值,为什摸??rnrn为什摸const就可以。rnrnconst double & cdr=1;//okrndouble temp=double(1);rnconst double & cdr=temp;rn
左值和右值,左值引用和右值引用
左值(lvalue)这一术语来源于C语言,用来指代那些可以用在赋值表达式左侧的东西,具名对象、在栈和堆上分配的对象,或者其他对象的成员,总之就是又确定存储空间的东西。而术语右值(rvalue)也是源自C语言,指的是只能在赋值表达式右侧出现的东西,如字面值和临时对象。 只能绑定到左值,不能绑定到右值的引用是左值引用。只能绑定到右值,而不能绑定到左值的引用是右值引用。 举个例子: int a =...
关于函数指针被赋值时候 右值与左值不一样的问题
详细描述在代码注释中rnrn#include "stdio.h"rnrntypedef int (*PNFV)() ;rnrnint temp1()rnrn return printf( "temp1\n" );rnrnrnint temp2()rnrn return printf( "temp2\n" );rnrnrnint temp()rnrn static PNFV temp = 0;rn if ( temp == 0 )rn rn temp = temp1; \\此处不管是 temp=&temp1 还是temp = \\ = temp1,temp的值都是一样,但跟temp1不同?何解??rn temp();rn rn else if ( temp == temp1 )rn rn temp = &temp2;rn \\同上;rn temp();rn rnrnrn return 0;rnrnrnint main()rn rn printf( "The address of temp1 is %x\n", temp1 );rn printf( "The address of temp2 is %x\n", temp2 );rn temp();rn printf( "The address of temp is %x\n", temp );rn temp();rn printf( "The address of temp is %x\n", temp );rn return 0;rn
c和c++的左值问题?
为何C和C++的编译错误的结果不同?谁能讲出差别吗?rn环境:cygwin gcc 4.3.4 for xprn[code=C/C++]#include rnrnvoid f(int x,int y)rnrn int j = x = y;rn int *p = & ++x;rn int *q = &(x++);rn int *r = &x;rn int *pp = &(x>y?x:y);rnrnrnint main(int argc, char *argv[])rn rn rn return 0; rn[/code]rn$ gcc b.crnb.c: In function ‘f’:rnb.c:6: error: lvalue required as unary ‘&’ operandrnb.c:7: error: lvalue required as unary ‘&’ operandrnb.c:9: error: lvalue required as unary ‘&’ operandrnrnAdministrator@PC-201105201517 /cygdrive/drn$ g++ b.crnb.c: In function ‘void f(int, int)’:rnb.c:7: error: lvalue required as unary ‘&’ operand
关于右值左值的问题
const int a=1;rnconst int & b=2;rna是左值还是右值?rnb呢???
前后增量与左值问题?????????
当后增量操作符为重载操作符时:rn(n++)++;语句没有错误,(n为一类对象)rn而当后增量不是操作符重载时:rn(n++)++;语句错误,//ERROR:'++' needs l-value;rn请指教
c语言左值问题
#include rnrnint main()rnrn int a ;rn rn a = 2 ;rnrn //(a ++) += 2;对于赋值语句,左值是不能变的rnrn (++ a) += 2;rnrn printf("%d\n",a);rnrn return 0;rnrn这个程序保存为test.会报错,保存为test.cpp没有问题啊,这是为什么啊?我用的是vc6.0
一个函数返回左值的问题
请问函数返回值 哪些情况下是左值 哪些情况下是右值rn数上说 函数返回引用和指针都是左值rn可是 我用rnclass dhrnrnpublic :rn dh operator*(dh g)rn rn dh gg;rn gg.x = g.x * x;rn return gg;rn rn rn dh()x = 0;rn int x;rn;rnrndh fff()rnrn dh h;rn return h;rnrnint main(int argc, char* argv[])rn rn dh g;rn fff() = g;rn return 0;rnrn我返回的事对象 再vc6下面编译也不会出错拿
关于函数左值的问题
写一个函数:例如rnint &fn(....)rnrn.....rnstatic int nTemp;rn........rnreturn nTemp;rnrnint y = 9;rn fn = y;rnrn当函数在左值的时候有什么用处,请各位大侠给个例子,说明用处rn
关于附值运算符的左值问题
#includernusing namespace std;rnclass CNamernrnpublic:rn char *name;rnpublic:rn rn CName(char *s="as")rn rn name = new char[strlen(s)+1];rn strcpy(name,s);rn rn ~CName()rn rn if(name)delete []name;name=NULL;rn CName& operator =(CName &a)------------------------>为什么这里的返回值要是对象的引用呢?rn rn if(a.name=="sd")rn rn name = new char[strlen(a.name)+1];rn strcpy(name,a.name);rn return *this;rn rn else rn rn return *this;rn rnrn void print();rn;rnvoid CName::print()rnrn cout<
引用返回左值的问题
[code=c]char &get_val(string &str, string::size_type ix)rnrn return str[ix];rnrnrnint main()rnrn string s("a value");rn cout<
一个基本的左值问题
《C++程序设计语言》(特别版)中说rn “只要逻辑上可行,一个以左值作为运算对象的运算符的结果,仍然是指称这个左值对象的左值,rn例如,rn void f(int x, int y)rn rn int j = x = y; //x = y的值是赋值后x的值rn int* p = &++x; //p指向xrn int* q = &(x++); //错误:x++不是一个左值(它不是存储在x里的值)rn int* pp = &(x>y?x:y); //较大的那个int的地址rn rn”rnrn 小弟读了很久还是没读清楚这句话的意思,另外,“int* q = &(x++);”为什么是错误的喃?求大家指教。
C++ 左值右值问题?
class Arnrnpublic:rn int a;rn;rnrnclass Brnrnpublic:rn A a;rn int i;rn;rnrnint main()rnrn B().a = A();rn B().i = 1; ////////////////////////////////////// 这个地方 显示 表达式必须为可修改的左值rnrn return 0;rn
左值问题,新手求教!!!
#include rn#include rn#include rn#include rnrnstruct studentrn long ID;rn char name[20];rn float score;rnstu[15];rnstruct student *p;rnrnrn//函数原型声明rnvoid get(struct student *p,int N,int i);rnvoid print(struct student *p,int N,int i);rnvoid search_name(int N);rnvoid sort_ID(struct student *p,int N);rnvoid sort_score(struct student *p,int N);rnvoid sort_name(struct student *p,int N);rnrn//主函数rnvoid main()rn int N,i=0;rn printf("Please enter the number of students(5~15):");rn scanf("%d",&N);rn printf("\n");rn //子函数rn get(p,N,i);//输入rn p=stu;rn print(p,N,i);rn search_name(N);//按姓名查询rn p=stu;rn sort_ID(p,N);//按学号排序rn print(p,N,i);rn p=stu;rn sort_score(p,N);//按成绩排序rn print(p,N,i);rn p=stu;rn sort_name(p,N);//按姓名排序rn print(p,N,i);rn p=stu;rn getch();rnrnrnvoid get(struct student *p,int N,int i)rn p=stu;rn for(i;iID));rn fflush(stdin);rn printf(" Please enter the student's name:\t");rn scanf("%s",&((p+i)->name));rn fflush(stdin);rn printf(" Please enter the student's score:\t");rn scanf("%f",&((p+i)->score));rn fflush(stdin);rn rnrnrnvoid print(struct student *p,int N,int i)rn printf(" The Score List\n");rn printf("NO. ID Name Score\n");rn for(i;iID,(p+i)->name,(p+i)->score);rn rnrnrnvoid search_name(int N)rn int i,count=0;rn char name[20];rn printf("Please enter the name you want to find:");rn scanf("%s",name);rn printf("\n");rn for (i=0;iname) == 0)rn printf("ID Name Score\n");rn printf("%-6d%-12d%-6f\n",i+1,(p+i)->ID,(p+i)->score);rn count++;rn rn rn if(count==0)rn printf("This guy is not exsist!\r\n");rnrnrnvoid sort_ID(struct student *p,int N)rn struct student *pt;rn int i,j;rn for(i=0;iID>(p+j+1)->ID)rn pt=p+j;rn p+j=p+j+1;rn p+j+1=pt;rn rn rn rnrnrnvoid sort_score(struct student *p,int N)rn struct student *pt;rn int i,j;rn for(i=0;iscore>(p+j+1)->score)rn pt=p+j;rn p+j=p+j+1;rn p+j+1=pt;rn rn rn rnrnrnvoid sort_name(struct student *p,int N)rn struct student *pt;rn int i,j;rn for(i=0;iname,(p+j+1)->name)>0)rn pt=p+j;rn p+j=p+j+1;rn p+j+1=pt;rn rn rn rnrnrnrnPS:左操作数必须为左值rnrn在三个查找函数中,if((p+j)->ID>(p+j+1)->ID)rn pt=p+j;rn p+j=p+j+1;rn p+j+1=pt;rn rn都显示左操作数必须为左值rn不明白什么问题,看了很多解释也没懂~~
C++的左值和右值问题
以下文字是摘自《C++ Primer 3rd Edition》-- page76rn“变量和文字常量都有存储区,并且有相关的类型。区别在于变量是可寻址的rn(addressable) 对于每一个变量都有两个值与其相关联:rn1.它的数据值,存储在某个内存地址中。有时这个值也被称为对象的右值(rvalue ,读rn做are-value)。 我们也可认为右值的意思是被读取的值(read value)。 文字常量和变量都可rn被用作右值。rn2.它的地址值——即存储数据值的那块内存的地址。它有时被称为变量的左值(lvalue,rn读作ell-value)。 我们也可认为左值的意思是位置值location value。 文字常量不能被用作rn左值rn在下面的表达式中:rnch = ch - 'O';rn变量ch 同时出现在赋值操作符的左边和右边。右边的实例被读取,与其相关联的内存中rn的数据值被读出。左边的ch 用作写入。减操作的结果被存储在ch 的位置值所指向的内存区rn中,原来的数据值会被覆盖。在表达式的右边,ch 和文字字符常量用作右值。在左边,chrn用作左值。rn”rnrn为什么 左边的ch是 左值 呢?rnrn不理解。请详细解释一下。rn下面还有篇文章:rnhttp://dev.csdn.net/develop/article/19/19165.shtmrn没看懂!rn
请教windows下的rpc编程
我有个rpc的c/s程序,在unix下已经调试通过了,现打算把client端的程序移植到windows下,该如何处理?rnrn另,谁有这方面的资料?麻烦推荐几篇,多谢了:)
Go网络编程之RPC编程
    RPC(Remote Procedure Call, 远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议。RPC协议构建于TCP或UDP,或者是HTTP之上,允许开发者直接调用另一台计算机上的程序,而开发者无需额外地为这个调用过程编写网络通信相关代码,使得开发包括网络分布式程序在内的应用程序更加容易。    RPC采用客户端--服务器(Cl...
求rpc编程的资料
我想学习rpc编程,但上网搜不到相关的书,有没有人有这方面的资料??rn例如Microsoft RPC Programming Guide的电子书(好像找不到:))??? rnrn我的邮箱unchallenger@sina.com rn
求RPC编程的资料
我想学习rpc编程,但上网搜不到相关的书,有没有人有这方面的资料??rn例如Microsoft RPC Programming Guide的电子书(好像找不到:))??? rnrn我的邮箱unchallenger@sina.com rn
有没有做过RPC编程的?
有没有做过ONC RPC编程的朋友,推荐一个好的RPC开发包,最好是免费的。
左操作数必须为左值
此句出错: CHUNK_SIZE=nLeft;rn这句应该怎么改呢rn它们的定义如下:rn int nLeft;rn#define CHUNK_SIZE (1*1024)
vs2015左操作数必须为左值
#includern#includernrnrnstruct nameinfornrn char name[50];rn char phone[50];rn int num[20];rn;rnrnrnrnrnvoid main()rnrn struct nameinfo a;rn a.num=120;//左操作数必须为左值rn pritnf("%d", a.num);rn system("pause");rnrnrnrnrn这是为什么?rn
左值与右值的引用
这是关于C++左值与右值引用的课程视频,课程易于理解,可以很快掌握
左值与右值
右值:由运算操作(加减乘除函数调用)产生的中间值称为右值,如:a+b,右值是不可以被修改的,也不能被const、volatile修饰。右值是只能出现在等号右边的变量或者表达式。 左值:既能出现在等号左边又能出现在等号右边的变量或者表达式。
左值引用和右值引用
在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&amp;amp;a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译。左值一定在内存中,右值有可能在内存中也有可能在寄存...
左值和右值
区分左值和右值能否用“取地址&”运算符获得对象的内存地址 对于临时对象,它可以存储于寄存器中,没办法用“取地址&”运算符 对于常量,它可能被编码到机器指令的“立即数”中,没办法用“取地址&”运算符std::string strHello = "Hello World!" Foo(strHello.substr(0, 5)); //右值引用, substr()返回作为Foo参数是临时变量,执行结束
左值和右值.cpp
/*左值/纯右值/将亡值(后两者统称为右值) *左值可放在运算符左右两侧,右值只能放在运算符右侧 *其中纯右值主要包括常量,将亡值主要指临时变量,左值主要指定义的具名变量 *被const修饰的变量也是右值 * */# include using namespace std;int main(){    int x_ = 3;    int y_ = 7;    int z_;    int* p_
什么是左值???
RT