Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C编写的DLL库被C#调用的问题

回复:
user: user-1
content: 报内存错误，应该是调用和定义没匹配上  确认下dll的CallingConvention 到底是什么 CallingConvention.StdCall 还是Cdecl

user: user-0
content: 解决了，把CallingConvention改成Cdecl，把函数声明为int型的就好了

user: user-0
content: 多谢各位，我白天上班在办公室没法上网，现在才看到。 这个DLL库是要提供给别的公司调用的，我是加密了之后再进行BASE64编码的，所以出参为char* 是可以的。

user: user-2
content: StringBuilder 需要预先分配空间。返回的 int *, 处理需要使用 ref 之外，可能还需要 Out 特性。  输入的 input 最好为 char const *, C# 的字符集需要指定为 多字节的。  想这类函数，最好使用 unsigned char，而不要使用字符串。加密的数据可能字符串不能保存，因为加密后，可能存在中间的 0 .  C# 端使用 byte[].

user: user-3
content: 要在前面增加函数声明，在接口函数前面增加extern "C" __declspec(dllexport) 比如 extern "C" __declspec(dllexport)  long test(char *input,int srcLen,char *output,int *desLen)

user: user-4
content: C 中的传出参数在C#中使用StringBuilder。 C#中的字符串有不可变性，C#会将字符串放入字符串拘留池，每次改变字符串，相当于在C中改变了指针的指向。字符串拘留池是受保护的内存，理论上应该是常量。不能被修改。使用stringbuilder是动态分配内存，相当于C中的malloc realloc 的组合。    _declspec(dllexport) int getss(char * s) { 	strcpy(s, "ABC"); 	return strlen(s); }      [DllImport("CC.dll", EntryPoint = "getss", CallingConvention = CallingConvention.Cdecl)]         public static extern int getss( StringBuilder s);         static void Main(string[] args)         {             StringBuilder s = new StringBuilder();             s.Append("");             //Console.WriteLine(getii(10));             Console.WriteLine("{0}长度",getss(s));             Console.WriteLine(s);             Console.ReadKey();         }
user-0 提问: 求教这种类型的题，用C作答吧

回复:
user: user-0
content: 哦！6楼好像是c++的样子么

user: user-1
content: 6楼带X了。

user: user-0
content: 引用 1 楼 zxhuser-3 的回复:貌似是oj上的题。。。对 void checknum(char* str) { 	char* temp; 	int sum=0; 	int i=1; 	for(temp=str;*(temp+1);temp++) 	{ 		if(checkch(*temp)) 		{ 			sum=sum+(*temp-'0')*i; 			i++; 		} 	} 	i=sum%11; 	if(str[12]==i+'0')printf("Right\n"); 	else 	{ 		str[12]=i+'0'; 		printf("%s\n",str); 	} } 里面的char* 什么意思？指针吗？还有for(;scanf("%s",str)!=EOF;getchar()) 	{ 		checknum(str); 	} 也不太明白什么意思。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:X呢？什么X？

user: user-0
content: 引用 4 楼 zxhuser-3 的回复:[quote=引用 3 楼 whm546877424 的回复:] 也不太明白什么意思。 其实有更简单的方法。。。[/quote] 先讲讲上面的什么意思呗，然后再考虑下简单方法。

user: user-2
content: #include<string> #include<vector> #include<iostream> using namespace std;  bool check(const string &str) { 		int sum; 		vector<int> v; 		for(auto const &temp : str) 				{ 						if(temp != '-') 								v.push_back(temp - '0'); 				} 		sum = 0; 		for(int i = 0; i <= 8; ++i) 				sum = sum + v[i] * (i+1); 		if( (v[v.size()-1] == sum % 11 && v[v.size()-1] != 10) || (sum % 11 == 10 && v[v.size()-1 ] == 'X')) 				return true; 		else 				return false; }  void modify(string &str) { 		int sum; 		vector<int> v; 		for(auto const &temp : str) 				{ 						if(temp != '-') 								v.push_back(temp - '0'); 				} 		sum = 0; 		for(int i = 0; i <= 8; ++i) 				sum = sum + v[i] * (i+1); 		if(10 != sum % 11) 			*(str.end()-1) = sum % 11 + '0'; 		else 			*(str.end()-1) = 'X'; }  int main() { 		string test; 		cin >> test; 		if(check(test)) 				cout << "Right" << endl; 		else 			{ 						modify(test); 						cout << test << endl; 			} 		return 0; }

user: user-1
content: X呢？

user: user-3
content: 引用 3 楼 whm546877424 的回复:也不太明白什么意思。 其实有更简单的方法。。。

user: user-3
content: /*A. ISBN  TimeLimit: 1s   MemoryLimit: 32M Description  每一本正式出版的图书都有一个ISBN号码与之对应，ISBN码包括9位数字、1位识别码和3位分隔符，其规定格式如“x-xxx-xxxxx-x”，其中符号“-”就是分隔符（键盘上的减号），最后一位是识别码，例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言，例如0代表英语；第一个分隔符“-”之后的三位数字代表出版社，例如670代表维京出版社；第二个分隔符后的五位数字代表该书在该出版社的编号；最后一位为识别码。   识别码的计算方法如下：     首位数字乘以1加上次位数字乘以2……以此类推，用所得的结果mod 11，所得的余数即为识别码，如果余数为10，则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的：对067082162这9个数字，从左至右，分别乘以1，2，...,9,再求和，即0×1+6×2+……+2×9=158，然后取158 mod 11的结果4作为识别码。     你的任务是编写程序判断输入的ISBN号码中识别码是否正确，如果正确，则仅输出“Right”；如果错误，则输出你认为是正确的ISBN号码。 Input 多组输入输出，对于每组数据：  输入只有一行，是一个字符序列，表示一本书的ISBN号码（保证输入符合ISBN号码的格式要求）。  Output 对于每组数据：  输出共一行，假如输入的ISBN号码的识别码正确，那么输出“Right”，否则，按照规定的格式，输出正确的ISBN号码（包括分隔符“-”）。  SampleInput 0-670-82162-4 0-670-82162-0   SampleOutput Right 0-670-82162-4*/  #include <stdio.h>  int checkch(char ch) { 	if(ch=='-')return 0; 	return 1; }  void checknum(char* str) { 	char* temp; 	int sum=0; 	int i=1; 	for(temp=str;*(temp+1);temp++) 	{ 		if(checkch(*temp)) 		{ 			sum=sum+(*temp-'0')*i; 			i++; 		} 	} 	i=sum%11; 	if(str[12]==i+'0')printf("Right\n"); 	else 	{ 		str[12]=i+'0'; 		printf("%s\n",str); 	} }  int main() { 	char str[20]; 	for(;scanf("%s",str)!=EOF;getchar()) 	{ 		checknum(str); 	} 	return 0; }

user: user-3
content: 貌似是oj上的题。。。
user-0 提问: 汉诺塔递归 。 每一层递归中的实参是怎么确定的？

回复:
user: user-1
content: 跟踪一遍有三个盘子的塔。

user: user-2
content: 我觉得你的疑惑是不是跟递归无关？ 汉诺塔这个挺经典的 hanoi 这个函数的作用是将 n 个盘子从 x 借助 y 移动到 z 上，必须要记住这一点 所以当只有一个盘子的时候，直接从 x -> z 就好了（变成了递归的退出条件） 如果不只一个，那么 n-1 个先 移动到 y 上（移动到 y 需要借助 z，代码中这里写错了），然后把 n 移动到 z 上， 再把这 n-1 个从 y 移动到 z 上（需要借助 x），这两步要做的动作刚好可以利用 hanoi 完成（变成了递归） 所以从函数内部来看，不关心 x y z 具体对应 ABC 哪个，但是目的是很明确的 x->z

user: user-3
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
user-0 提问: 基础问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:C语言没有标准化之前的旧式K&R风格的函数定义，现在基本已经不用了。 谢谢！

user: user-0
content: 我对已经知道答案了， int f(a, b) int a, int b; {...} == int f(int a, int b) {...}

user: user-1
content: C语言没有标准化之前的旧式K&R风格的函数定义，现在基本已经不用了。
user-0 提问: 求大神解答

回复:
user: user-1
content: 引用 3 楼 qq_24299431 的回复:为什么交换指针指向的函数不管用呢。  因为你用的那些指针都只有块作用域，离开函数就消失罗~ swap函数的原型应该是这样： void swap (char * * x,char * * y);

user: user-0
content: 为什么交换指针指向的函数不管用呢。

user: user-1
content: 字符串排序好像不太容易写啊。因为标准没有规定从a到z，或者从A到Z在字符集中必须是顺序排列吧……标准只是规定，对于数字字符0到9，必须是一个比一个大地排列。 N1570，5.2.1 Character sets (3) ……，The representation of each member of the source and execution basic character sets shall fit in a byte. In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.    所以，这个程序我可写不出来，怎么写都是不可移植的，因为C不限定所使用的字符集。请赵老湿写。

user: user-1
content: 冒个泡就排好了。这样简单的事，应该找赵四老湿。他有一个锦囊，叫做“仅供参考”，哇哈哈哈~
user-0 提问: C语言问题 求大神给解释

回复:
user: user-1
content: 你这代码到底算啥？？？ 搞不明白 我把代码的错误解决了 这是正确代码  # include <math.h> # include <stdio.h> # define q 2 # define p 1.0*4/3  int main(void) {  	double t,s,o=3,r,m,n,x,y,g,v,u,a[3],b[3],c[3],d[3],e[3],f[3];      int i;     scanf("%f",&t);s=sqrt(o)*t*1.0/2;r=t*1.0/2;      a[0]=0;a[1]=t;a[2]=r; b[0]=0;b[1]=0;b[2]=s;     for(i=0;i<3;i++) 	{ 		c[i]=(a[i]+q*a[i+1])*1.0/(1+q); 		d[i]=(b[i]+q*b[i+1])*1.0/(1+q); 	}     for(i=0;i<2;i++)     { 		e[i]=(c[i]+p*a[i+2])*1.0/(1+p); 		f[i]=(d[i]+p*b[i+2])*1.0/(1+p); 	} 	e[2]=(c[2]+p*a[1])*1.0/(1+p); 	f[2]=(d[2]+p*b[1])*1.0/(1+p);     m=pow(a[0]-a[1],2);     n=pow(b[0]-b[1],2);     x=pow(e[0]-e[1],2);     y=pow(f[0]-f[1],2);     v=sqrt(m+n);     u=sqrt(x+y); 	g=1.0*v*v/(u*u); 	printf("%f",g);  	return 0; }
user-0 提问: 为什么爬取网页调用read之前需要usleep一会儿

回复:
user: user-0
content: 引用 1 楼 zhouqinghe24 的回复:非阻塞read 只是将缓冲区（TCP滑动窗口）的数据读完了，而且没有新的数据发送过来。  并没有断开连接。 如果循环读取到 返回-1  才是断开连接了。  cpu的运算速度，与内存copy的速度 远远比网络传输速度快，所以你usleep 一下就可以接收内容了  你好，我曾试过用Content-Length字段的值控制循环的结束，直到读完整个网页内容，大致的代码： int remainToRead = sizeOfHTML;    //remainToRead初始化为Content-Length的大小 char buf[2048]; while(remainToRead > 0) {        int nRead = read(sock, buf, sizeof(buf));        if(nRead == -1)               break;        remainToRead -= nRead;        //... } 按理说这样应该可以读到所有的数据吧，但实际运行时只能读到一部分，然后read会一直返回0，循环就死掉了，好像必须加个sleep才可以. 读的频率高难道会造成丢包么？

user: user-1
content: 非阻塞read 只是将缓冲区（TCP滑动窗口）的数据读完了，而且没有新的数据发送过来。  并没有断开连接。 如果循环读取到 返回-1  才是断开连接了。  cpu的运算速度，与内存copy的速度 远远比网络传输速度快，所以你usleep 一下就可以接收内容了
user-0 提问: linux 调用system()函数调用脚本导致的问题

回复:
user: user-1
content: 服务器段有write么？

user: user-2
content: 服务器write的对吗

user: user-3
content: 引用 4 楼 zhao4zhong1 的回复:将要调用的脚本写到一个临时文件比如d:\mydir\a.bat中，然后 system("cmd /c start d:\\mydir\\a.bat"); 这是windows下。  Linux下 将要调用的脚本写到一个临时文件比如a.sh中，然后 system("./a.sh &");

user: user-3
content: 将要调用的脚本写到一个临时文件比如d:\mydir\a.bat中，然后 system("cmd /c start d:\\mydir\\a.bat");

user: user-4
content: 用fork一个 子进程 exec族函数 加载命令程序。
user-0 提问: 我这个题的子函数返回值是false和true的条件是什么啊

回复:
user: user-0
content: #include "OJ.h" /* 功能: 找出字符串中第一个出现次数最多的字符      输入: char* pInputString：字符串      输出: char* pChar：出现次数最多的字符       返回: false 异常失败 	  true  输出成功 */ bool FindChar(char* pInputString, char* pChar) { 	//在这里实现功能 } 只能在函数里实现功能，不能外部加#include<stdlib.h>;

user: user-1
content: 更正： 最后一种应该是   if( ! pInputString)     return false;  丢了个叹号

user: user-1
content: 加上一行  #inclde <stdlib>  然后  if(pInputString==NULL)    return false;   也可以  if(pInputString==0)     return false;  或者  if(pInputString)     return false;    此外，贴源代码最好先做好格式化，并且用【code=c】【/code】包围起来。（把【】换成[]）

user: user-0
content: 我试过了，编译错误：error C2065: 'NULL' : undeclared identifier                                        : error C2446: '==' : no conversion from 'int' to 'char *'

user: user-2
content: if(*pInputString==NULL) return false;  改成 if(pInputString==NULL) return false;  pInputString前不加*号

user: user-0
content: 谢啦。。。。。

user: user-3
content: 引用 6 楼 user-4 的回复:bool FindChar(const char* pInputString, char* pChar) {     if(!pInputString      ||*pInputString=='\0'      ||!pChar) return false;      int cnt[256]={0};     int mc =0;     unsigned char ch;     while((ch=*pInputString++))         if(++cnt[ch]>mc)             mc =cnt[ch];      for(int i=1;i<256;i++)         if(cnt[i]==mc) *pChar++ = (char)i;      return true; } 我认为以上 for(int i=1;i<256;i++)         if(cnt[i]==mc) *pChar++ = (char)i; 部分不符合题目要求。 可作如下修改： bool FindChar(const char *pInputString, char *pChar) {     if(!pInputString || *pInputString=='\0' || !pChar) 		return false;      int cnt[256] = {0}; 	int pos = 1, mpos = 1, mc =0;     unsigned char ch;     while(ch = *pInputString++) {         if(++cnt[ch] > mc) {             mc = cnt[ch]; 			mpos = pos; 		} 		pos++; 	} 	*pChar = *(pInputString + i);     return true; }

user: user-0
content: 引用 6 楼 user-4 的回复:bool FindChar(const char* pInputString, char* pChar) {     if(!pInputString      ||*pInputString=='\0'      ||!pChar) return false;      int cnt[256]={0};     int mc =0;     unsigned char ch;     while((ch=*pInputString++))         if(++cnt[ch]>mc)             mc =cnt[ch];      for(int i=1;i<256;i++)         if(cnt[i]==mc) *pChar++ = (char)i;      return true; } 总算对了，谢谢啦，我还有类似的问题，可不可问你啊？

user: user-4
content: bool FindChar(const char* pInputString, char* pChar) {     if(!pInputString      ||*pInputString=='\0'      ||!pChar) return false;      int cnt[256]={0};     int mc =0;     unsigned char ch;     while((ch=*pInputString++))         if(++cnt[ch]>mc)             mc =cnt[ch];      for(int i=1;i<256;i++)         if(cnt[i]==mc) *pChar++ = (char)i;      return true; }
user-0 提问: 变长数组函数？

回复:
user: user-1
content: 引用 2 楼 Daffodiles 的回复:sholber： 引用变量长度数组是不允许初始化的。    数组不初始化，还有什么意义啊？  你可以给它的元素赋值嘛。 void f(int n)  {     int a [n], * p;     while (-- n) a [n] = 0;     p = a;     * p = 0;  }

user: user-0
content: sholber： 引用变量长度数组是不允许初始化的。    数组不初始化，还有什么意义啊？

user: user-1
content: 看样子，在名字的问题上，我们存在严重的分歧哟~  variable length array，我们管它叫“变量长度数组”，而不是“变长数组”，因为它不是动态改变的，而是用一个“变量”来设置长度。  变量长度数组是不允许初始化的。N1570，6.7.9 Initialization，(3)： The type of the entity to be initialized shall be an array of unknown size or a complete object type that is not a variable length array type.
user-0 提问: 又是接口函数，好烦啊，求大神看看我这个接口函数吧

回复:
user: user-0
content: 我照你这样提交上去不全对啊，9个样例只对了2个

user: user-1
content: 闲着没事，我也写了一个： unsigned int Continumax(char * * pOutputstr,  char * intputstr) {     int cnt = 0, c = 0;     char * pos;      while (* intputstr ++ != '\0')         if (* (intputstr - 1) >= '0' && * (intputstr - 1) <= '9')             c ++;         else         {             if (c > cnt) cnt = c, pos = intputstr - c - 1;             c = 0;         }      if (c = cnt)     {         * pOutputstr = malloc (c + 1);         (* pOutputstr) [c] = '\0';         while (c --) (* pOutputstr) [c] = pos [c];     }      return cnt; }

user: user-1
content: 引用 4 楼 u014080033 的回复:我试过了如果改成这样的话： pOutputstr=final; 会报错： error C2440: '=' : cannot convert from 'char *' to 'char ** ' 确定我这里的写法没问题？ *pOutputstr= (char *)malloc(100);  一个比较严重的问题是，你为pOutputstr分配了存储空间，却又令它直接指向final，而final又指向intputstr吧？ 我觉得这里需要的是在pOutputstr和final之间复制字符，而不是*pOutputstr = final

user: user-1
content: 引用 4 楼 u014080033 的回复:我试过了如果改成这样的话： pOutputstr=final; 会报错： error C2440: '=' : cannot convert from 'char *' to 'char ** ' 确定我这里的写法没问题？ *pOutputstr= (char *)malloc(100); 哎呀，我真糊涂，pOutputstr的类型是char **，而且即使它是char *，返回也没用的…… 你原来的写法（那两条语句）没有问题。 问题可能是在中间。

user: user-0
content: 我试过了如果改成这样的话： pOutputstr=final; 会报错： error C2440: '=' : cannot convert from 'char *' to 'char ** ' 确定我这里的写法没问题？ *pOutputstr= (char *)malloc(100);

user: user-1
content: 引用 2 楼 u014080033 的回复:我主要是“pOutputstr 指向的内存应该在函数内用malloc函数申请，由调用处负责释放”这句话怎么理解啊，也不知道我这样对不对：     *pOutputstr= (char *)malloc(100); 反正最后输出的字符串保存在final中，我在这样不知道行不行： *pOutputstr=final;  题目的要求中有一条“pOutputstr 指向的内存应该在函数内用malloc函数申请，由调用处负责释放” 那么，在函数体内，可以用malloc申请，这一点你已经做了。 你唯一做错的是，因为最后输出的字符串是用final指向的，那么，返回时，应当是 pOutputstr = final; 而不是 * pOutputstr = final;  由调用处（者）负责的意思是，在被调用的函数内分配，由调用这个函数的一方负责释放。也就是说，在函数内不需要考虑释放的事情。

user: user-0
content: 我主要是“pOutputstr 指向的内存应该在函数内用malloc函数申请，由调用处负责释放”这句话怎么理解啊，也不知道我这样对不对：     *pOutputstr= (char *)malloc(100); 反正最后输出的字符串保存在final中，我在这样不知道行不行： *pOutputstr=final;

user: user-1
content: 不看不看不看你写得好麻烦……
user-0 提问: C语言循环变量增值

回复:
user: user-1
content: for循环是每次循环体执行完i再自增。 楼主用while循环时，也应该是先执行循环，再自增，而不是一引入while循环体，i就自增。  #include<stdio.h> #include<stdlib.h> void main() {  	int i=100; 	while (i<1000) 	{ 		int a = i / 100; 		int b = i / 10 % 10; 		int c = i % 10; 		if (i==a*a*a+b*b*b+c*c*c) 		{ 			printf("\n%d=%d^3+%d^3+%d^3",i,a,b,c); 		} 		i++; 	} 	getchar(); }
user-0 提问: 急！冒泡法问题！

回复:
user: user-1
content: int i,j; int a[10]; int temp; for(i=0;i<10;i++) {     for(j=i+1;j<10;j++)    {      if(a[i]>a[j]) {  temp=a[i]; a[i]=a[j]; a[j]=temp; }    }  }

user: user-2
content: for(int i=0;i<9;i++) 	{ 		for(int j=0;j<9;j++) 		{ 			if(a[j]>a[j+1]) 			{ 				int t=a[j+1]; 				a[j+1]=a[j]; 				a[j]=t; 			} 		} 	} 第二个循环j应该从0开始，这样判断语句才能对整个数组内数据进行比较，而要是从j=i开始，则只对a[i]及以后的数进行判断，若第i个数后（假设i=4）有比a[0]还要小的，则无法对a[0]和a[4]进行比较。所以要把j=i改为j=0;

user: user-3
content: for (int i = 0; i < 10; i++) { for (int j = 0; j < i; j++)

user: user-4
content: 这是csdn一篇博文，供参考： http://blog.csdn.net/hguisu/article/details/7776068

user: user-0
content: 我不知道自己错在哪里啊。。

user: user-0
content: 大神，你的是选择法啊！

user: user-5
content: for (int i = 0; i < 10; i++) 	{ 		for (int j = i; j < 10; j++) 		{ 			if (a[i] > a[j]) 			{ 				int t = a[i]; 				a[i] = a[j]; 				a[j] = t; 			} 		} 	}  这个是课堂必学内容啊，呵呵

user: user-6
content: 你搞个双重循环干嘛。你去网上看看人家的，参考不就行了
user-0 提问: 输出十六进制数组，总是有空格，怎样去掉空格

回复:
user: user-1
content: rep[n] 内容是什么，如果可以吧整段贴出来看下~

user: user-2
content: 因为你02X后面就有一个空格，去掉应该就没了

user: user-3
content: 改为printf("%02X",rep[n]);

user: user-4
content: printf("%.2X ",rep[n]); 这个X后面就有一个空格，是这个？
user-0 提问: 求大神指导makefile时error:unrecognized command line option "-wno-error=pragmas"怎么解决？

回复:
user: user-1
content: 引用 2 楼 baidu_24211805 的回复:来个帅哥散分拉~~ 意思是楼主问题已经自己解决了？ 贴下怎么解决的，提携一下后辈。

user: user-2
content: 可以把makfile 贴出来么

user: user-0
content: 来个帅哥散分拉~~

user: user-0
content: 重装系统所有环境重来一遍，还不行。。。。
user-0 提问: 求103到200之间的素数，求大神解惑

回复:
user: user-1
content: 8楼和11楼比，谁更“高大上”呢？

user: user-2
content: 我也来给个参考吧，http://blog.csdn.net/redraiment/article/details/2072005

user: user-3
content: 200以内的素数， 素因子就几个，直接模这几个就行了， bool isprime(int n) {     static int pl[]={2,3,5,7,11,13};     for(auto &i :pl) if(n%i==0) return false;     return true; }

user: user-4
content: j变量没用到。。。。不用定义了吧

user: user-5
content: 问题呢？？？？

user: user-1
content: 要不换这个：http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-1
content: 给个链接也叫抄袭？

user: user-1
content: 引用 5 楼 sholber 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] [quote=引用 1 楼 sholber 的回复:] 如果是求1000000000以内的素数，算法还有点讲究。这个没意思。留给赵四老湿的“仅供参考” 仅供参考： Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Article.aspx?tag=198374988322054872& [/quote]  赵四老湿涉嫌抄袭。 而且他给出的链接不打不开。[/quote] 我刚用Chrome浏览器试能打开的。

user: user-6
content: 引用 4 楼 zhao4zhong1 的回复:[quote=引用 1 楼 sholber 的回复:] 如果是求1000000000以内的素数，算法还有点讲究。这个没意思。留给赵四老湿的“仅供参考” 仅供参考： Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Article.aspx?tag=198374988322054872& [/quote]  赵四老湿涉嫌抄袭。 而且他给出的链接不打不开。

user: user-1
content: 引用 1 楼 sholber 的回复:如果是求1000000000以内的素数，算法还有点讲究。这个没意思。留给赵四老湿的“仅供参考” 仅供参考： Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Article.aspx?tag=198374988322054872&

user: user-7
content: #include <stdio.h> #include <stdlib.h>  int fun(int num) { 	int i; 	for(i=2; i<num; i++) 	{ 		if(!(num%i)) 		{ 			return 0; 		} 	} 	return 1; }   int main() { 	int i,j;      	for(i=101;i<=200;i++) 	{ 		if(fun(i)) 			printf("%-4d",i);             	} 	//	system("pause"); 	return 0; }

user: user-6
content: 如果是求1000000000以内的素数，算法还有点讲究。这个没意思。留给赵四老湿的“仅供参考”
user-0 提问: 如何判断一个变量的值是不是系统随机值？

回复:
user: user-1
content: vs调试时有几个特殊值  栈区没有初始化 CDCDCDCD                                             堆区没有初始化 DDDDDDDD                                             堆区越界       FDFDFDFD                                             还有个         00000000

user: user-2
content: 此问题无解.

user: user-3
content: 未出初始化对象具有不确定的值（interdeterminate value)。   struct A { int a,b,c,d; };  char* p  = new char[sizeof(A)]; //随便写入一些值 *p =  0x01;  //*a是未经过构造或初始化的, 所以*a的值由其所占内存的不确定的值决定。 A * a = (A*)(p);

user: user-4
content: 应该是想办法去初始化你定义的每一个变量, 而不是判断是否已经赋值.  应该是没有办法判断是否是随机值, 你想, 既然都是随机的, 有什么策略可以判断呢?

user: user-5
content: 所有变量在构造函数或者初始化时，赋初值。 这个问题就不存在了

user: user-6
content: 如何判断一张彩票的号码是不是随机值？[问题点数：200000000000000000分]

user: user-7
content: 不确定值不是随机值，随机值是遵守一些数学概率分布规律的，通常是正态分布。   不确定，真的不知道它什么时候会出现随机值，说不得会百分百出现同一个值。无解

user: user-8
content: Debug版vs会初始化一些特殊值，如0xcdcd....这样的，这种就是未初始化的随机值。release版系统什么都不会做，得到什么值看运气。

user: user-9
content: 此问题无解

user: user-10

user: user-11
content: 此问题无解.  你需要做的是让每个变量都有自己的初始值,并且按程序运转生成确定的值. 这是计算机程序基础,有限自动机.
user-0 提问: for语句耗时计算的一些疑惑

回复:
user: user-0
content: 我最后将程序循环次数放大到10亿次

user: user-0
content: 谢谢各位啦  12楼的方法我用了 感觉不错profiler 大家可以借鉴一下

user: user-1
content: 15楼说的有道理。楼主要让代码重复执行一定次数求平均耗时，再下结论

user: user-2
content: 时间片给当前进程的非陪，编译器对循环做计数寄存器的优化， cpu现场保存，cpu现场恢复，  执行时运行的进程数，就绪的进程数，计时函数的 压栈 出栈，计时函数的 运算时间点，循环内的 运算量    这些都会影响 运行的最终时间

user: user-3
content: 因为CPU不会一直都在跑你的代码。为了实现多任务，CPU要不断在不同的线程之间切换，所以不能保证你的代码第二次执行的时候还是在同一个时间片里。毕竟Windows不是实时系统，不要太纠结这些，ms级别的精度就够了。

user: user-4
content: 0.001400(ms) 0.004666(ms)  这种数据根本没有意义，相对误差太大了。 要想得出什么结论，至少也要让二者的时间都达到秒级。

user: user-5
content: QueryPerformanceCounter运算也是需要时间的，所以你不应该用1和1000比，至少也是1000和10000比。

user: user-6
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-7
content: 引用 8 楼 ri_aje 的回复:系统问题吧，这几个回帖都重复了，难道大家都有病？! CSDN现在连一个论坛都维护不好了？

user: user-7
content: 空循环应该被优化掉才对。

user: user-8
content: 试了一下，是 csdn 有病。每次点完提交回复，出个对话框说提交失败（实际上已经成功了），此时再重复提交就导致重复回复了。

user: user-8
content: 系统问题吧，这几个回帖都重复了，难道大家都有病？!

user: user-0
content: 一句话为啥要发好几遍，难道系统问题

user: user-0
content: 一句话为啥要发好几遍，难道系统问题

user: user-9
content: 1)最直接的办法是反编译,看汇编. 2)不知道你的取时间函数是怎么实现的,一般来说是一个系统调用来实现,系统调用的时间不是确定的. 3)一般来说,(for 100次的时间)比(for 1次时间*100)要短,原因有很多,比如指令流水线,cache,    指令预测等.

user: user-9
content: 1)最直接的办法是反编译,看汇编. 2)不知道你的取时间函数是怎么实现的,一般来说是一个系统调用来实现,系统调用的时间不是确定的. 3)一般来说,(for 100次的时间)比(for 1次时间*100)要短,原因有很多,比如指令流水线,cache,    指令预测等.

user: user-8
content: 我猜那个空 for 都优化没了，看看汇编是不是这样。

user: user-8
content: 我猜那个空 for 都优化没了，看看汇编是不是这样。

user: user-8
content: 我猜那个空 for 都优化没了，看看汇编是不是这样。
user-0 提问: 请教大神，随意输入一个身份证号码，生成一个唯一7位ID

回复:
user: user-1
content: 3DES算法，输入任意长度一个密钥key，跟你要加密的数据data，生成你需要的密钥key_data，再根据你生成的密钥key_data跟key通过3DES解密算法，得到你要加密的原始数据data，我这里有算法源码

user: user-2
content: 7位感觉太少了，7个字节直接把身份证转为大整数都可以放下了 楼上的64进制，在计算机中应该怎么存了

user: user-3
content: 身份证号前6位约对应10000个地区 后跟4位1900..2099对应200年 接2位01..12对应12个月 接2位01..31对应31天 接3位000..999对应1000个序号 接1位校验位0..9或X，可根据前面内容算出。 共需约 10000×200×12×31×1000＝744000000000＜64的7次方。 可用7位64进制数表示。

user: user-4
content: 非要7位？ md5？

user: user-5
content: 引用 3 楼 dbzhang800 的回复:[quote=引用 2 楼 luciferisnotsatan 的回复:] 不可能是唯一的，中国有多少人？光上海的人口，7位ID都不够大家分的。  如果ID每个字符的范围是 [0-9a-zA-Z]或更大，还是可能的[/quote] 那就直接算7个字节吧，这样应该是够的。 去查下18位身份证号码规则，把数据压缩下就行了。如， 年只要1 BYTE（从某年开始算）。月，只要4个bit位，日，只要5位。

user: user-6
content: 如果是按0-9A-F的十六进制算，7位最多就0xFFFFFFF大约是2亿多，不够用....除非将其他字母也加上去。

user: user-7
content: 引用 2 楼 luciferisnotsatan 的回复:不可能是唯一的，中国有多少人？光上海的人口，7位ID都不够大家分的。  如果ID每个字符的范围是 [0-9a-zA-Z]或更大，还是可能的

user: user-5
content: 不可能是唯一的，中国有多少人？光上海的人口，7位ID都不够大家分的。

user: user-8
content: scanf  输入  号码字符串  strcmp   相等则，输出已注册 否则  输出一个随机7位ID，并存储起来（可用文件或者数据库） 以后每生成一个随机数都要和之前存储的对比，若相同则重新生成直到不同
user-0 提问: 新手写的二叉搜索技术。帮我看一下哪出问题了？谢谢

回复:
user: user-0
content: O(∩_∩)O谢谢。新手上路，磕磕碰碰的。多亏你们大牛扶持。

user: user-1
content: 引用 1 楼 Evankaka 的回复:#include<stdio.h> const int  n=10;///用const比用define好 int BinarySearch( int a[],const int& x,int n) {  	int left=0;int right=n-1; 	int middle=(left+right)/2;///把它放在外面好一点 	 	while(left<right){  		if(x==a[left]) return left;///先判断左右两边 		else if(x==a[right]) return right; 		else if(x==a[middle]) return middle;  		if(x<a[middle]) //你代码这里写错了啊 		right=middle-1; 		else 		left=middle+1; 		middle=(left+right)/2;   	} 	return -1;//表示没有找到   }  int main() { 	int a[n]={1,2,3,4,5,6,7,8,9,10}; 	int x; 	int b; 	printf("请输入一个1~10之间的数：\n"); 	scanf("%d",&x);  	b=BinarySearch(a,x,n);///数组用a 	printf("%d",b); 	while(1);//弄个死循环，以防控制台退出 	return b;  }  这是我在VS2010上跑的，没问题了。。  首先，为什么 const比 define好？ 其次 死循环放在那里有什么好处  放个getchar()不是更好？

user: user-2
content: 1.define由预处理程序处理，const由编译程序处理  2.#define不分内存，因为它是预编译指令，编译前进行了宏替换。const 不一定？某种说法，Const常量是占有内存的被“冻结”了的变量  3.const定义常量是有数据类型的，这样const定义的常量编译器可以对其进行数据静态类型安全检查，而#define宏定义的常量却只是进行简单的字符替换，没有类型安全检查，且有时还会产生边际效应  4.有些调试程序可对const进行调试，但不对#define进行调试。  5.const在编译期间会计算其值,而define不会  上面是第一个问题的答案，，当然拉，你这里要用define也是可以的。。。。 然后最后你要用getchar()也可以的。。。这两个在这里面都没问题。。。

user: user-3
content: BinarySearch( a[n],x,n); 哪有这样调用函数的。。。。

user: user-2
content: #include<stdio.h> const int  n=10;///用const比用define好 int BinarySearch( int a[],const int& x,int n) {  	int left=0;int right=n-1; 	int middle=(left+right)/2;///把它放在外面好一点 	 	while(left<right){  		if(x==a[left]) return left;///先判断左右两边 		else if(x==a[right]) return right; 		else if(x==a[middle]) return middle;  		if(x<a[middle]) //你代码这里写错了啊 		right=middle-1; 		else 		left=middle+1; 		middle=(left+right)/2;   	} 	return -1;//表示没有找到   }  int main() { 	int a[n]={1,2,3,4,5,6,7,8,9,10}; 	int x; 	int b; 	printf("请输入一个1~10之间的数：\n"); 	scanf("%d",&x);  	b=BinarySearch(a,x,n);///数组用a 	printf("%d",b); 	while(1);//弄个死循环，以防控制台退出 	return b;  }  这是我在VS2010上跑的，没问题了。。
user-0 提问: 字符串溢出

回复:
user: user-1
content: 堆栈的默认限定大小是MAXBUFFER

user: user-2
content: 定义两个字符串 比如 s[3] t[4],如果t[4]输入溢出了  那么会侵占s的内存 这是没有任何根据的胡说。

user: user-3
content: 内存对齐 变量的起始地址是4的倍数，那么两个变量起始地址的差也是4的倍数。 t[4]时，s在t后4个字节。 t[5]时，s在t后8个字节

user: user-4
content: 错误的代码, 行为本身就是未定义的, 不保证结果的.   何别纠结这个.  要弄清为什么, 就要去看生成的二进制代码的反汇编是怎么样子的, 就可以明白为什么会有这样的结果了.

user: user-5
content: 不一定吧，那要看系统是怎么帮你分配内存的

user: user-6
content: 楼主能具体定吗，贴代码
user-0 提问: 菜鸟关于INT_MAX值和%d的问题

回复:
user: user-1
content: 1、说明你系统里的int是32位，可以这样查看：  printf("%d", sizeof(int));  结果应该是4，代表4Bytes. 2、应该是-2147483648 到 2147483647

user: user-2
content: 1 . 16位int 最大是32768， 你的结果代表int是32位了 2. %d 就是对应int

user: user-3
content: 32767应该是16位系统的取值 在32位下应该是2174483647
user-0 提问: 关于字符串提取数据

回复:
user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.   非常非常感谢！赵4老师的指导下让我更爱C语言了！   问题已经解决： 我把数据改成[b]0.9p2i3.3d5.6s这种格式， 然后  #include <stdio.h> char s[]="0.9p2i3.3d5.6s"; char *p; int S; float P,I,D;  void main(){ 	p=s; 	sscanf(p,"%fp%fi%fd%ds",&P,&I,&D,&S);	 	printf("p=%f,i=%f,d=%f,s=%d,\n",P,I,D,S);	 }  成功了，再次感谢老师，感谢论坛！

user: user-1
content: 仅供参考#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-2
content: 推荐使用sscanf函数
user-0 提问: scanf_s()读入字符有问题

回复:
user: user-1
content: 当scanf_s()读取字符时, 在字符变量前要加一个作为大小的数字参数, 当接收数值时, 不用加这个参数, 比如: double number1 = 0.0; 	double number2 = 0.0; 	char operation = 0;  	printf_s("\nEnter the calculation\n"); 	scanf_s("%lf %c %lf", &number1, &operation, 1, &number2);

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-0
content: 谢谢楼上两位，我再翻了一下MSDN文档，改成scanf_s("%c,%c", &c1, 1, &c2, 1);就没问题了。。 之前把两个指定缓冲区大小的参数写在最后了，事实上应该紧跟前面的指针参数。

user: user-3
content: 在调用时，必须提供一个数字以表明最多读取多少位字符。

user: user-0
content: 引用 1 楼 turingo 的回复:scanf_s需要多传一个参数，例如：scanf_s("%c,%c", &c1, &c2，32); 额，原来又是这个问题啊，之前我就碰到过要读入一个字符串到char[]数组中，知道上有人告诉我说要在后面再传一个表示字符串长度的参数。没想到对单个字符读入现在也有这个规定。。。 scanf_s("%c,%c", &c1, &c2, 32); 但是我按你说的改了还是不行。。。

user: user-0
content: 而后我改成 scanf_s("%c", &c1); printf("%c", c1); 只读入一个字符也有问题，编译器没有报错，但是当我输入一个A按下回车后，我看到的输出只有一个空格。。。 我再用c1 = getchar(); c2 = getchar(); 分别读入后再printf("%c%c", c1, c2);输出，这次倒没有问题了。。。到底是为什么啊？？

user: user-4
content: scanf_s需要多传一个参数，例如：scanf_s("%c,%c", &c1, &c2，32);

user: user-5
content: http://baike.baidu.com/view/3529726.htm?fr=aladdin

user: user-5
content: http://baike.baidu.com/view/3529726.htm?fr=aladdin

user: user-5
content: http://baike.baidu.com/view/3529726.htm?fr=aladdin
user-0 提问: #define xdata 定义后面没有取代xdata的内容

回复:
user: user-0
content: 引用 10 楼 lm_whales 的回复:还有像 嵌入式c语言教程 非常感谢这么细心的解释，获益匪浅，真心感谢

user: user-1
content: 其实，你这个问题，到嵌入式模块问，可能更好 这历史C，C++模块，搞嵌入式的，一般不怎么来

user: user-1
content: 还有像 嵌入式c语言教程

user: user-1
content: xdata  这种内存空间，是特定CPU的 内存布局 编译器 看到这个符号，把 后面定义的数据组织到一起   例如  xdata  char a; xdata char b;  a ,b 都是在 xdata 这个空间的  分配的时候计算一下 a,b 一共占用多少空间 然后分别为 a,b安排一个位置，如果 xdata 空间（可以在编译选项里面设置）不够，那么就会报错。 读写这个空间的数据，会使用对应的指令  实际上 51 系列CPU，对不同空间数据的读写，使用不同指令. 这些，都是编译器根据xdata， 这种，特定平台关键字，作出的安排。所以这个  xdata 看似无用，其实作用很多。  jmp_buf 这个是 C语言特定的长跳转专用缓冲区数据结构； 是一个struct，是为了进行函数间跳转用的。  extern jmp_buf xdata _error_env; 表示这是个外部声明， 表示 这个数据 即变量  _error_env 是定义在函数外部的， 在本模块(.c)或者其他模块（.c） 中已经定义了  这种特定平台的知识，看 Keil C51 或者其他 C51之类的书记  数据类型为： jmp_buf 存储空间为 ：xdata (片外ram,或者片内 XDATA 空间)   xdata 本来是表示  外部ram（rom） 空间的， 但是有些 CPU片内，有XDATA ram（rom） , 使用的存取指令和外部 XDATA 空间相同 速度要比外部ram（rom） 快一些。  PS： 这个声明这么解析 这是一个外部变量声明： 存储类型  数据类型         内存空间                 变量名字 外部变量  跳转缓冲区     外部存储器空间      _error_env; extern       jmp_buf           xdata                       _error_env;  这种在特定平台编程序， 自学的话，需要看特定编程方面的书 例如  《单片机C语言教程》 《keil c51 教程》这一类的。

user: user-0
content: 引用 7 楼 lm_whales 的回复:xdata 不是数据结构 他只是指定一个内存空间的位置 因为这是个 C标准之外的关键字，由编译器自行解释(和C语言标准无关) 实际上 xdata char * p,比较特殊 xdata char x 则没有什么特殊之处 只是编译的时候 x 放在xdata内存空间  xdata char *px; 编码的指针长度，和通用指针 char *pg;  内部间接存取空间指针idata *pi;的指针长度是不同的 C51  px 是两个字节的， 通用指针 pg 3个字节， pi一个字节  #define xdata 的作用 是让编译器识别出xdata 是已经定义的 而不是未定义的标志符 如果，被认定为未定义，那么编译器会报错， 然后就没法编译下去了  事实上，编译器 读到xdata 会对后面的数据作个标记， 以便 分配不同空间的内存，给某个特定变量  原来如此~~~~找到组织了。。。 但是还是有许多疑惑，比如如果xdata不是预定义的数据结构，而只是一个内存的占位符，那编译器又是按照怎样的规范来对他进行解释的？ 还有正如你所说的那样，我看到类似如：extern jmp_buf xdata _error_env;表示不知道该怎么解读。。。 啊啊啊。。。菜鸟问题实在太多了。。。能否指示一些有关C更深的这方面的一些资料，让菜鸟自己去好好学习。在C Primer和C专家编程这类的书籍上貌似没有看到有关的介绍。。。

user: user-1
content: xdata 不是数据结构 他只是指定一个内存空间的位置 因为这是个 C标准之外的关键字，由编译器自行解释(和C语言标准无关) 实际上 xdata char * p,比较特殊 xdata char x 则没有什么特殊之处 只是编译的时候 x 放在xdata内存空间  xdata char *px; 编码的指针长度，和通用指针 char *pg;  内部间接存取空间指针idata *pi;的指针长度是不同的 C51  px 是两个字节的， 通用指针 pg 3个字节， pi一个字节  #define xdata 的作用 是让编译器识别出xdata 是已经定义的 而不是未定义的标志符 如果，被认定为未定义，那么编译器会报错， 然后就没法编译下去了  事实上，编译器 读到xdata 会对后面的数据作个标记， 以便 分配不同空间的内存，给某个特定变量

user: user-2
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-3
content: 你可以先grep看看xdata都出现在哪里了，然后gcc -E 就能看到宏展开后的代码了。还有一点，宏定义中只有名称，后面没有替换的内容是没问题的，就像下面这样。 #ifndef A_H #define A_H  #endif

user: user-2
content: VC：编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。

user: user-2
content: 就是在某种条件下，该宏需要被替换为空。  VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E 多谢，因为我是在windows下用VC调试的，因为在Linux上外接设备有些困难，能说说这种无内容替代定义的应用场景么？

user: user-0
content: 引用 1 楼 user-3 的回复:你可以先grep看看xdata都出现在哪里了，然后gcc -E 就能看到宏展开后的代码了。还有一点，宏定义中只有名称，后面没有替换的内容是没问题的，就像下面这样。 #ifndef A_H #define A_H  #endif  我是在VC下编译运行的，暂时没在Linux下调试，能跟踪到xdata出现的位置，他应该是一个栈帧的结构体，但却没有找到明确的定义，所以很困惑。 然后再请教就是，如上面所示的定义方式，后面没有替代体部分，这样做的作用以及应用场合主要是什么呢？
user-0 提问: C语言的相关问题，求指导

回复:
user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:求想被指导C语言的相关问题的MM 哪位MM熟练掌握Sex和Home以及Baby的开发？  赵老湿年近耄耋，学术无增而色心有加。

user: user-0
content: 你牛逼啊，等待我来开发啊

user: user-2
content: 求想被指导C语言的相关问题的MM 哪位MM熟练掌握Sex和Home以及Baby的开发？

user: user-3
content: 楼主这么问，让人怎么回
user-0 提问: 关于float 和double的转换

回复:
user: user-1
content: 用clang编译  1、C是不是把floating point常量读成double?     至少在 flloat f ＝ 9.9 中不是    但 f += 1.0 中是  2、C把float传给printf是不是将其转换成double？       好像真是这样  int main(){   float f = 9.9;   double d = 9.9;   printf("%d %f %lf",sizeof(double),f,d); }  /* 	.section	__TEXT,__text,regular,pure_instructions 	.section	__TEXT,__literal8,8byte_literals 	.align	3 LCPI0_0: 	.quad	4621762822593629389     ## double 9.9000000000000003 	.section	__TEXT,__literal4,4byte_literals 	.align	2 LCPI0_1: 	.long	1092511334              ## float 9.89999961 	.section	__TEXT,__text,regular,pure_instructions 	.globl	_main 	.align	4, 0x90 _main:                                  ## @main 	.cfi_startproc ## BB#0: 	pushq	%rbp Ltmp2: 	.cfi_def_cfa_offset 16 Ltmp3: 	.cfi_offset %rbp, -16 	movq	%rsp, %rbp Ltmp4: 	.cfi_def_cfa_register %rbp 	subq	$32, %rsp 	leaq	L_.str(%rip), %rdi 	movabsq	$8, %rsi 	movsd	LCPI0_0(%rip), %xmm0        sd是和双精度有关的 	movss	LCPI0_1(%rip), %xmm1        ss是和单精度有关的 	movss	%xmm1, -4(%rbp) 	movsd	%xmm0, -16(%rbp) 	cvtss2sd	-4(%rbp), %xmm0     cvt应该是convert的意思 	movsd	-16(%rbp), %xmm1 	movb	$2, %al 	callq	_printf  	movl	$0, %ecx 	movl	%eax, -20(%rbp)         ## 4-byte Spill 	movl	%ecx, %eax 	addq	$32, %rsp 	popq	%rbp 	retq 	.cfi_endproc  	.section	__TEXT,__cstring,cstring_literals L_.str:                                 ## @.str 	.asciz	"%d %f %lf"   .subsections_via_symbols */
user-0 提问: 用vc++如何获得Delphi开发程序中的CVirtualGridCtrl列表中的数据

回复:
user: user-1
content: 在那个程序里写代码发送数据到你的VC程序。传送方式有剪贴板、命名管道、WM_COPYDATA、SOCKET、内存共享文件等等、
user-0 提问: 有一段动态申请的连续内存，怎么实例化出一个结构体？

回复:
user: user-0
content: 引用 3 楼 whatlovenba 的回复:引用 2 楼 user-1 的回复:A *a = new(p) A();好像真的可以，请问一下这是new的什么用法？或者哪里有介绍？刚找到了，原来是placement new用法。

user: user-0
content: 引用 2 楼 user-1 的回复:A *a = new(p) A();好像真的可以，请问一下这是new的什么用法？或者哪里有介绍？

user: user-1
content: A *a = new(p) A();

user: user-1
content: A* = new(p) A();
user-0 提问: C语言,求代码,谢谢各位大侠!

回复:
user: user-0
content: 引用 4 楼 Penetralia 的回复:新人来挑战，虽然做出来了，但是时间复杂度挺高的 }[/code]  同是新人，非常感谢！！  :)

user: user-0
content: 引用 3 楼 wenpinglaoyao 的回复:现在回头一看，貌似char *p是多余的代码，直接用sr2数组就可以 谢谢大神！学习了，谢谢！！

user: user-1
content: 新人来挑战，虽然做出来了，但是时间复杂度挺高的#include<stdio.h> int main() { 	char a[8]; 	int j,i,l=0,k,t; 	printf("Input your birthday:"); 	scanf("%s",&a); 	for(i=1;i<=9;i+=2){ 		j=9-i; 		for(k=j;k>=0;k--){ 			if(k==j/2){ 				for(t=0;t<i;t++,l++){ 					if(l==8)l=0; 					printf("%c",a[l]); 				} 			} 			printf(" "); 		} 		printf("\n"); 	} 	for(i=7;i>=1;i-=2){ 		j=9-i; 		for(k=j;k>=0;k--){ 			if(k==j/2){ 				for(t=0;t<i;t++,l++){ 					if(l==8)l=0; 					printf("%c",a[l]); 				} 			} 			printf(" "); 		} 		printf("\n"); 	} 	return 0; }

user: user-2
content: 现在回头一看，貌似char *p是多余的代码，直接用sr2数组就可以

user: user-2
content: #include "stdio.h" char sr[8]; char sr2[100]; void main() {     int i,j,zuo,you,biao=1;     char *p;     printf("请输入你的生日\n");     gets(sr);     for(i=0;i<100;i++) sr2[i]=sr[i%8];          zuo=you=5;     p=sr2;          for(i=0;i<=10;i++)     {       for(j=0;j<10;j++)       {     	if(j>=zuo&&j<=you)     	printf("%c",*p++);     	else printf(" ");       }       printf("\n");              if(zuo<=0) biao=0;              if(biao!=0)       {       	zuo--,you++;       }       else zuo++,you--;     }     }

user: user-2
content: #include "stdio.h" char sr[8]; char sr2[100]; void main() {     int i,j,zuo,you,biao=1;     char *p;     printf("请输入你的生日\n");     gets(sr);     for(i=0;i<100;i++) sr2[i]=sr[i%8];          zuo=you=5;     p=sr2;          for(i=0;i<=10;i++)     {       for(j=0;j<10;j++)       {     	if(j>=zuo&&j<=you)     	printf("%c",*p++);     	else printf(" ");       }       printf("\n");              if(zuo<=0) biao=0;              if(biao!=0)       {       	zuo--,you++;       }       else zuo++,you--;     }     }
user-0 提问: 怎样吧 aa(）函数的返回值 给函数bb()呢  我这样为什么 bb()没有打印出效果呢？

回复:
user: user-1
content: C,C++外部函数，外部变量 可以在函数的内部声明，不过一般来说，没有必要  因为 只需要在所有函数 之前，声明一次，所有函数就都可见了 而且，外部函数，外部变量中， 通常不会有同名两个不同标识符的。  在函数内部声明，完全是多余的 但是是允许的

user: user-0
content: 还是不行啊.........................

user: user-2
content: int a() {   return 1; }  void b(int a) {   printf("%d\n", a); }  先从简单的代码片段搞起。

user: user-3
content: 看了半天没看出毛病，就试了下 2010有输出，不过 int class; 这种关键字是不能当描述符的

user: user-4
content: struct st_info * aa(); void bb(struct st_info *head1);  这两个为什么要在main里面声明   个人认为xx是一个指针，他指向的区域已经被释放了 不如用传址的方法来实现 struct st_info *xx; xx  malioc 申请内存 aa(xx);      (   void aa(struct st_info *tinputxx);  )   bb(xx);

user: user-5
content: 程序太大，不才兄弟我也是醉了……
user-0 提问:  关于C++访问C定义的结构体时，结构体首元素地址和结构体首地址不一致的问题。

回复:
user: user-1
content: this 指針是編譯器給類的非靜態成員函數添加的參數，不會存在於類或者結構中。 可能真的是 C 和 C++ 編譯器對 struct 的處理方式不一樣吧。

user: user-2
content: 写出的 C++  的测试代码看看。

user: user-3
content: 要不就是你的C++编译器有问题，要不就是你的设置有问题  C struct  C++ 是一定可以使用的，并且使用方式和C的使用方式一致 除非 C++某处，定义了一个和 C的 struct同名的 struct ，但是定义方式，不同于 C struct 的定义  另外，检查一下，.c,.cpp 对齐方式是否一致 必要时，强制 要求该结构，采用某种对齐方式  PS： 对于一个 C++编译器，一般都内置一个 C编译器，多半还会内置一个汇编器 所以通常不会有，编译器不兼容问题 如果，不能用，考虑下是否设置错误

user: user-4
content: 你去看《深入理解c++对象模型》，c语言中，结构体纯粹是数据的集合，除了字节对齐以外，没有其他改变结构 而c++中，一般会空出开始的4字节，为了区别对象地址，和第一个成员的地址。通常是1字节，但是字节对齐的时候，就占用了4字节。 实际上，你看到sizeof（空结构体) =4.  至于为什么要区分对象的地址和和第一个成员的地址，我就不懂了。 另外this指针，并不存在任何的类或者结构中，那个不过是给编译器或者程序员看的。《深入理解c++对象模型》详细的说明了，一个函数是如何被编译器改写的，this就是为了改写之后，作为一个函数的参数而已。

user: user-5
content: 发3个贴....
user-0 提问: C语言编程出现return 1错误 在线求解答！！！(是有关服务器连接的程序)

回复:
user: user-1
content: 引用 6 楼 baidu_15729179 的回复:上面有 #include <winsock2.h>呀  我说的是这个头文件是windows下的，所以确定其环境应该是windows下，那么就没必要在用gcc编译了，vc有自己的cl.exe,如果一定用你上面的编译的话 就不知道了，没用过你那套

user: user-0
content: 上面有 #include <winsock2.h>呀

user: user-1
content: 你这用的gcc编译？ 可上面的代码明明是windows下的啊， #include <winsock2.h>  没玩过makefile 帮不了多少

user: user-0
content: 程序跑了一遍没有错, 只是最后出了一个return 1 Makefile里的第二十五行报错  # Project: sample # Makefile created by Dev-C++ 5.8.2  CPP      = g++.exe CC       = gcc.exe WINDRES  = windres.exe OBJ      = sample.o LINKOBJ  = sample.o LIBS     = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib32" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32" -static-libgcc -m32 -pg INCS     = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include" CXXINCS  = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++" BIN      = sample.exe CXXFLAGS = $(CXXINCS) -m32 -pg CFLAGS   = $(INCS) -m32 -pg RM       = rm.exe -f  .PHONY: all all-before all-after clean clean-custom  all: all-before $(BIN) all-after  clean: clean-custom 	${RM} $(OBJ) $(BIN)  $(BIN): $(OBJ) 	$(CC) $(LINKOBJ) -o $(BIN) $(LIBS)  sample.o: sample.c 	$(CC) -c sample.c -o sample.o $(CFLAGS)

user: user-0
content: 程序跑了一遍没有错, 只是最后出了一个return 1 Makefile里的第二十五行报错  # Project: sample # Makefile created by Dev-C++ 5.8.2  CPP      = g++.exe CC       = gcc.exe WINDRES  = windres.exe OBJ      = sample.o LINKOBJ  = sample.o LIBS     = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib32" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32" -static-libgcc -m32 -pg INCS     = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include" CXXINCS  = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++" BIN      = sample.exe CXXFLAGS = $(CXXINCS) -m32 -pg CFLAGS   = $(INCS) -m32 -pg RM       = rm.exe -f  .PHONY: all all-before all-after clean clean-custom  all: all-before $(BIN) all-after  clean: clean-custom 	${RM} $(OBJ) $(BIN)  $(BIN): $(OBJ) 	$(CC) $(LINKOBJ) -o $(BIN) $(LIBS)  sample.o: sample.c 	$(CC) -c sample.c -o sample.o $(CFLAGS)

user: user-1
content: 哪儿错了，楼主你得交代清楚

user: user-1
content: 哪儿错了，楼主你得交代清楚
user-0 提问: C语言编程出现return 1错误 在线求解答！！！(是有关服务器连接的程序)

回复:
user: user-1
content: #pragma comment(lib,"Ws2_32.lib")  #include <winsock2.h> #include <ws2tcpip.h>  #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h>  #define BLOCKSIZE 16  SOCKET sock = INVALID_SOCKET;  int Oracle_Connect() {     WSADATA wsaData = { 0 };     struct sockaddr_in servaddr = { 0 };     int result;      result = WSAStartup(MAKEWORD(2, 2), &wsaData);     assert(result == 0);      sock = socket(AF_INET, SOCK_STREAM, 0);     assert(sock != INVALID_SOCKET);      servaddr.sin_family = AF_INET;     servaddr.sin_addr.S_un.S_addr = inet_addr("54.165.60.84");     servaddr.sin_port = htons(6667);     result = connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr));      if (result == 0)     {         printf("%s\n", "Connected to server successfully.");     }     else     { perror("Failed to connect to oracle");  return -1; }  return 0; }  int Oracle_Send(unsigned char *ctext, int num_blocks) { unsigned char *buffer; char recvbit[2] = { 0 }; int result;  unsigned int buf_size = num_blocks * BLOCKSIZE + 2; buffer = (unsigned char *)calloc(buf_size, 1); buffer[0] = (unsigned char)num_blocks; memcpy_s(&buffer[1], buf_size - 1, ctext, num_blocks * BLOCKSIZE);  result = send(sock, (const char *)buffer, buf_size, 0); assert(result == buf_size);      result = recv(sock, recvbit, sizeof(recvbit), 0);     assert(result != 0);  free(buffer);  return atoi(recvbit); }  int Oracle_Disconnect() { int result;  result = closesocket(sock); assert(result == 0);  printf("%s\n", "Connection closed successfully.");  WSACleanup();  return 0; }  int main() { char *data =          "9F0B13944841A832B2421B9EAF6D9836"         "813EC9D944A5C8347A7CA69AA34D8DC0"         "DF70E343C4000A2AE35874CE75E64C31";     unsigned int num_bytes;     unsigned char *bytes;     unsigned int i;     int result;      assert(strlen(data) == 2 * 3 * BLOCKSIZE);      num_bytes = strlen(data) / 2;     bytes = (unsigned char *)malloc(num_bytes);      for (i = 0; i < num_bytes; i++)     {         int temp;          sscanf_s(data + 2 * i, "%2x", &temp, sizeof(temp));         bytes[i] = (unsigned char)temp;     }      Oracle_Connect();      result = Oracle_Send(bytes, 3);     result ?         printf("%s\n", "Ciphertext decrypted successfully.") :         printf("%s\n", "Ciphertext failed to decrypt.");      Oracle_Disconnect();      free(bytes);      return 0; }

user: user-2
content: 楼主好像没描述清楚

user: user-3
content: 先学好语文再来把

user: user-4
content: 什么 return 1错误，听不明白，或者说在那里

user: user-4
content: 什么 return 1错误，听不明白，或者说在那里

user: user-4
content: 什么 return 1错误，听不明白，或者说在那里
user-0 提问: 请问这个递归函数为什么不能正常结束，也没有出现死循环？谢谢

回复:
user: user-0
content: 谢谢你的帮助！ 没有啊，循环退出是由 j 控制的，本身就是与 m 无关。（程序不会死循环！） 我找到原因了，因为递归一次只能退出一层递归函数，并不能一次完全退出递归函数。

user: user-1
content: m没有发生过变化，进入无限递归出不来了，正常的逻辑m值应该是变的，或者再其他条件下有return

user: user-1
content: m没有发生过变化，进入无限递归出不来了，正常的逻辑m值应该是变的，或者再其他条件下有return

user: user-1
content: m没有发生过变化，进入无限递归出不来了，正常的逻辑m值应该是变的，或者再其他条件下有return
user-0 提问: shell和c语言效率比较

回复:
user: user-1
content: 引用 19 楼 SXJIAKE 的回复:[quote=引用 7 楼 u013163178 的回复:] 楼上是复读机 别提了这破论坛，我也有过好几次，经常提示发帖失败。连续三次提示失败后，再提交，提示：同一用户只允许连续回复三次。然后刷新一看，我×，三条回复！！！如果没人回复，你连解释的机会都要等。[/quote] 都一样！你以为大名鼎鼎的Google或者百度和CSDN的关系不是“五十步笑百步”？

user: user-2
content: 引用 7 楼 u013163178 的回复:楼上是复读机 别提了这破论坛，我也有过好几次，经常提示发帖失败。连续三次提示失败后，再提交，提示：同一用户只允许连续回复三次。然后刷新一看，我×，三条回复！！！如果没人回复，你连解释的机会都要等。

user: user-3
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 7 楼 u013163178 的回复:] 楼上是复读机 这是被CSDN服务器的不稳定逼的！[/quote] CSDN最不能忍受的是，自己发的贴还不能删，自己的东西还不让自己管了。还有csdn网站做得太垃圾和论坛名称“全球最大中文IT社区”严重不符！

user: user-4
content: 侧重点不同。 没有什么好比较的。

user: user-5
content: 引用 15 楼 u010936098 的回复:[quote=引用 13 楼 bear234 的回复:] 如果你是指计算机运行代码本身的效率的话............. 除了机器语言和汇编，我还不知道哪个能比c的效率高 c只是能够写得效率很高，但不是一定写得效率很高。 很多人用C写的cgi效率还不如一个新手用perl写的[/quote]  那肯定啊 shell的功能肯定比c强大很多  写起来很容易

user: user-6
content: 引用 13 楼 bear234 的回复:如果你是指计算机运行代码本身的效率的话............. 除了机器语言和汇编，我还不知道哪个能比c的效率高 c只是能够写得效率很高，但不是一定写得效率很高。 很多人用C写的cgi效率还不如一个新手用perl写的

user: user-5
content: 如果你是指计算机运行代码本身的效率的话............. 除了机器语言和汇编，我还不知道哪个能比c的效率高

user: user-7
content: 一个开发效率高，一个运行效率高！shell脚本写工具还是挺方便的，尤其服务器端！

user: user-1
content: 引用 7 楼 u013163178 的回复:楼上是复读机 这是被CSDN服务器的不稳定逼的！

user: user-8
content: 引用 4 楼 ForestDB 的回复:一条shell胜过千条C代码。 当然这是指开发效率。 我同意这个说法

user: user-9
content: 开发效率还是执行效率？这两个应该是反比的吧？  没有任何编程基础的人，只要能善用百度，都可以写出一些基本功能的脚本。但绝对写不出C程序

user: user-10

user: user-11
content: 楼上是复读机

user: user-12
content: 一条shell胜过千条C代码。 当然这是指开发效率。

user: user-12
content: 一条shell胜过千条C代码。 当然这是指开发效率。

user: user-12
content: 一条shell胜过千条C代码。 当然这是指开发效率。

user: user-13
content: shell语言的核心目标就不是效率。

user: user-1
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-14
content: C语言效率更好，shell是脚本语言，边解释边执行
user-0 提问: 新手求来个大神解决问题， 困扰了好久了！

回复:
user: user-1
content: 在C里，任何字符串在内存里的表现形式都是指针，这可不是java

user: user-2
content: ++ 引用 1 楼 user-9 的回复:从右往左看， const char *mytal[5] ，有5个元素，每个元素都是const char *， 而字符串就是const char *

user: user-3
content: const char *mytal[5] = {  "Adding numbers swiftly", "Multiplying accurately", "Stashing data", "Following instructions to the letter ", "Understanding the c language"};   数组是由5个指向char的指针构成的，每个指针指向各自字符串的首字母。。。

user: user-4
content: char **p; p = mytal+1; cout<< *p;// 输出Multiplying accurately cout<<**p;//输出M  懂了没？

user: user-5
content: 和起看不懂的话，那就展开理解吧 mytal[0] ="Adding numbers swiftly"; mytal[1] = "Multiplying accurately"; mytal[2]="Stashing data"; mytal[3]"Following instructions to the letter "; mytal[4]="Understanding the c language"};  注：展开只是帮助理解，不涉及const修饰符问题

user: user-6
content: N1570,6.4.5 In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals.The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence.  这就是说，字符串字面值将用于初始化一个静态数组。并且，因为你需要的是指针，于是静态数据自动转化为指向其第一个元素的指针。

user: user-7
content: char *pc = "abc"; 相当于指向一个字符串了

user: user-8
content: const char *mytal[5] 是指向字符型指针，它指向的是字符串第一个字符

user: user-9
content: 从右往左看， const char *mytal[5] ，有5个元素，每个元素都是const char *， 而字符串就是const char *
user-0 提问: 请参加C语言基础测试，200分奖励

回复:
user: user-1
content: 《牛肉干》   C语言上机课，某女同学偷偷吃起牛肉干。  有一粒牛肉干掉到了键盘上，卡在7和8键之间。  女同学就在键盘上抠啊、抠啊、抠啊……  程序里一行代码变成这个样子：  int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a;  后来的结局是  ————程序顺利通过编译，运行结果正确！

user: user-2
content: 返回值类型：int * (**)[] 这个一个指针类型 函数指针：(*AT)() 因此AT还是一个函数指针类型，验证代码如下  #include <stdio.h> typedef int * (**(*AT)())[];  AT special;  int *(**array)[2];  int * (**fun(void))[] { 	printf("special return type\n"); 	return array; }  int main(void) { 	int *(**p)[]; 	special = fun; 	p = special(); 	return 0; }

user: user-3
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 8 楼 sholber 的回复:] 赵四老湿心说不让俺参与拉倒，正好俺也不会。 激将法是不？我还真吃这套！ 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*x000)[5];//返回值     char (*(x00)())[5];//函数原型，参数为空，返回值为指针     char (*(*x0)())[5];//数组的元素，是个函数指针     char (*(*x[3])())[5];//是个数组，大小为3      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5] [/quote]  赵四老湿，C1X已经支持泛型了。你能用C的泛型来搞一下嘛？

user: user-1
content: 引用 8 楼 sholber 的回复:赵四老湿心说不让俺参与拉倒，正好俺也不会。 激将法是不？我还真吃这套！ 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*x000)[5];//返回值     char (*(x00)())[5];//函数原型，参数为空，返回值为指针     char (*(*x0)())[5];//数组的元素，是个函数指针     char (*(*x[3])())[5];//是个数组，大小为3      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-4
content: AT 是函数指针，返回类型为  int *(**) [];

user: user-3
content: Define AT as a type pointer to function returning pointer to pointer to array of pointer to int

user: user-3
content: 赵四老湿心说不让俺参与拉倒，正好俺也不会。

user: user-1

user: user-5
content: AT是一个函数指针，他指向一个函数，这个函数返回一个指针，这个指针指向类型为int的数组

user: user-0
content: 引用 4 楼 qq_24182661 的回复:自定义的函数指针  不够具体。

user: user-6
content: 自定义的函数指针

user: user-7
content: 函数地址，入口

user: user-0
content: 还有吗，1小时候结贴。

user: user-3
content: 将AT定义为一个指针，该指针指向一个函数，该函数返回一个指向“指向数组的指针”的指针，数组的元素类型是指向int类型的指针。
user-0 提问: 入门级别的C，想动手实践stm8，已有stvd和cosmic等环境，怎么深入，求指导

回复:
user: user-0
content: 原谅我不会按楼层回复，直接在这回复了，首先 谢谢老师们的建议，虽然我不知道下一步该怎么办，但是我已经把最初始的工程建立好了，而且我凭借着自己的感觉去熟悉stm8的库函数，相信一两天之内我会知道stm8库函数大概有些什么函数，接着在项目里调用也大致有个方向。听了 zhao4zhong1   turingo两位老师的建议，我更加确定了  再次感谢！

user: user-1
content: 第一步直接用STM8的库函数，等到应用都会写了，然后第二步再去深入研究库函数的源代码。

user: user-2
content: 有时去执行一个错误的决定总比优柔寡断或者没有决定要好得多。
user-0 提问: 一个小问题~虽然不太好意思问，但缺少没搞懂，请大家指教下

回复:
user: user-1
content: char const *digit_string 和 const char *digit_string 是一样的，都是到const char的指针，不一样的是 char *const digit_string 这个是到char的const指针 楼上的还是自己回去翻翻书吧

user: user-0

user: user-2
content: 楼上的正解，你用一个非const char*指向了一个const char*, 编译器会认为你用p去改变所指向地址的值

user: user-3
content: 编译器害怕你通过p来修改digit_string所以不允许转化。你可以把p也定义成const char*p

user: user-4
content: 引用 4 楼 u011337306 的回复:[quote=引用 2 楼 yulinlang 的回复:] char const *digit_string 和 const char *digit_string 是一样的 你也回去翻翻基础的书籍吧，这也是一样的？？？？？？？？？？！！！！！[/quote] 你打自己脸了。。确实是一样的。。

user: user-5
content: 引用 2 楼 yulinlang 的回复:char const *digit_string 和 const char *digit_string 是一样的 你也回去翻翻基础的书籍吧，这也是一样的？？？？？？？？？？！！！！！

user: user-5
content: char *p = digit_string + len_digit - 1;//如果digit_string  是const修饰，这里肯定转换不了的！  错误为：cannot convert from 'const char *' to 'char *'  另外，const char *p跟char const *p是不一样的，前者*p所指向的内容不能被修改 ，但是指针可以修改的，比如自加自减操作，后者指针是常指针，不能被修改！！！比如不能进行自加自减操作！！！

user: user-1
content: char const *digit_string 和 const char *digit_string 是一样的

user: user-1
content: 不是 int format(char *format_string, char const *digit_string) 而是 int format(char *format_string, char *const  digit_string)  char const *digit_string 和 const char *

user: user-0
content: 引用 6 楼 starytx 的回复:编译器害怕你通过p来修改digit_string所以不允许转化。你可以把p也定义成const char*p 解决了，确实是这样！谢谢！你们的回答都对我有帮助。额，还有一点，大家请不要随便骂人。。。

user: user-5
content: 引用 5 楼 nwcfafniw 的回复:[quote=引用 4 楼 u011337306 的回复:] [quote=引用 2 楼 yulinlang 的回复:] char const *digit_string 和 const char *digit_string 是一样的 你也回去翻翻基础的书籍吧，这也是一样的？？？？？？？？？？！！！！！[/quote] 你打自己脸了。。确实是一样的。。[/quote] 白痴就是这样来的！！！