c++dll中的char*形参如何通过CLR程序传递给C#?

工程3层结构,底层是c++的dll,接口如下:
CPPDLL_API int fnCppDll(char* p)
{
for (int i = 0;i < 10;i++)
{
*p++ = '0' + i;
}
return 1;
}
中间层是CLR的dll,接口如下:
int MgdDll::Class1::getStr(String^ str)
{
interior_ptr p = const_cast>(PtrToStringChars(str));

fnCppDll(p);
return 0;
}

上层是C# From调用,string str;int rc = 1;rc = cs1.getStr(str);MessageBox.Show(str);

CLR中间层编译错误:MgdDll.cpp(17): error C2664: “fnCppDll”: 不能将参数 1 从“cli::interior_ptr”转换为“char *” 无法将托管类型转换为非托管类型。

请问如何把C#层的str传递到c++层并返回修改后的串?不用说用DllImport直接导入c++的dll,架构设计需要使用3层结构。谢谢

1个回答

char * 在.net 中就是字节数组 byte[]

u_571_2
u_571_2 我说的是通过托管c++调用,不是.net程序直接调用
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++dll中的char*形参如何通过CLR程序传递给C#?
工程3层结构,底层是c++的dll,接口如下: CPPDLL_API int fnCppDll(char* p) { for (int i = 0;i < 10;i++) { *p++ = '0' + i; } return 1; } 中间层是CLR的dll,接口如下: int MgdDll::Class1::getStr(String^ str) { interior_ptr<Char> p = const_cast<interior_ptr<Char>>(PtrToStringChars(str)); fnCppDll(p); return 0; } 上层是C# From调用,string str;int rc = 1;rc = cs1.getStr(str);MessageBox.Show(str); CLR中间层编译错误:MgdDll.cpp(17): error C2664: “fnCppDll”: 不能将参数 1 从“cli::interior_ptr<Type>”转换为“char *” 无法将托管类型转换为非托管类型。 请问如何把C#层的str传递到c++层并返回修改后的串?不用说用DllImport直接导入c++的dll,架构设计需要使用3层结构。谢谢
C++中的带有指针数组的结构体在C#上怎么封装,并作为形参传给C++dll的函数
#pragma pack(1) struct SqJpegScliceSize { unsigned int scliceSize[64]; unsigned char *jpegDst[64]; }; extern "C" _declspec(dllexport) void SqGetSliceData(SqJpegScliceSize *jss) 这是C++函数和结构体 在C#上怎么写?
Unity C#通过动态链接库调用C++传递中文字符串乱码问题。
我在C++端写了一个函数,参数有一个char* 类型的字符串表示文件名,函数里面通过调用win32API实现将这个文件名所指向的文件写入系统剪切板便于用户在别处手动粘贴。 C#脚本导入动态链接库的时候,形参声明为了byte[]类型,在传递实参时,使用System.Text.Encoding.ASCII.GetBytes将string类型转换成ASII字符序列。 如果动态链接库发布x64版本,中文的路径和文件名都正常,可是如果动态链接库发布86版本,传递过去的字符串如果带有中文路径就会出现乱码,而如果只是中文文件名,。目录是英文和数字,就正常。 据我所知系统位数不会影响字符串编码吧?请问有谁知道原因。
为什么构造函数的形参是char*?
class Employee { private: char name[10]; char address[20]; char city[10]; char post[7]; public: Employee(const char *n, const char *a, const char *c, const char *p) { strcpy_s(name, n); strcpy_s(address, a); strcpy_s(city, c); strcpy_s(post, p); };
C语言中指针作为形参传递数据的问题
我想编写子函数readData读取文件中的数据,主函数中申请空间databuffer用于存储数据。 第一次调用子函数获取数据长度,然后申请空间,再次调用子函数将数据写入以申请的空间中。 但是调试总达不到效果。 代码如下: ``` #include<stdio.h> #include<malloc.h> #define DATAFILE "test.bin" int readBuffer(char * fileName, float *data_buffer,int *data_num) { FILE *data_fp; // float *data_buffer; int data_size; int read_num = 0; int check = 1; if (*data_num == 0) { data_fp = fopen(fileName, "rb"); if (data_fp == NULL) { printf("Open data file failed!\n"); getchar(); return -1; } fseek(data_fp, 0, SEEK_END); data_size = ftell(data_fp); *data_num = data_size / sizeof(float); fclose(data_fp); return 0; } while (check) { data_fp = fopen(fileName, "rb"); if (data_fp == NULL) { printf("Open data file failed!\n"); getchar(); return -1; } fseek(data_fp, 0, SEEK_SET); data_size = *data_num * sizeof(float); /* fseek(data_fp, 0, SEEK_END); data_size = ftell(data_fp); fseek(data_fp, 0, SEEK_SET); data_buffer = (float*)malloc(data_size);*/ *data_num = (int *) fread(data_buffer, sizeof(float), data_size/sizeof(float), data_fp); if (*data_num !=data_size/sizeof(float)) { printf("Read data failed!\nTry again now!\n"); read_num++; fclose(data_fp); } else { check = 0; printf("Data read successed!\n"); } if (read_num == 3) { check = 0; printf("we are read data file failed!\nPlease check the program!\n"); } } if (read_num == 3) { getchar(); return -1; } else return 0; } int main() { int error; char *fileName = "test.bin"; float *data_buffer=NULL; int data_num=0; error = readBuffer(fileName,data_buffer,&data_num); if (error != 0) { printf("Get the number of data failed!\n"); return -1; } data_buffer = (float*)malloc(data_num); error = readBuffer(fileName, data_buffer,&data_num); if (data_num==0) { printf("Read data failed!\n"); } return 0; } ```
编写CLR时SQL SERVER形参如何指定大小
我用VS编写的CLR的函数的输入形参是SqlString,部署到sql server默认是nvarchar(4000),请问怎么在部署的时候就改为nvarchar(50)?
C语言 函数的形参传递问题(代码内容是表达式求值,数组栈实现)
例如输入2+3 形参a应该是#,b应该是+。把b打印在屏幕上 b确实是+,但是进入switch的b却是'/n'换行符,也有可能是getnext函数里输入没吞掉回车的问题。但是如果没吞掉回车,形参b和ch应该都是换行符,但是打印出来却是+不。知道为什么会这样,求大佬解答,如果有解决方案就更好了,谢谢各位。 ``` #include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> int num[100]; char str[1000]; char judge(char a, char b) { //printf("%c",b); int i, j; char pre[][7] = { /*运算符之间的优先级制作成一张表格*/ {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','0'}, {'>','>','>','>','0','>','>'}, {'<','<','<','<','<','0','='} }; switch (a) { case '+': i = 0; break; case '-': i = 1; break; case '*': i = 2; break; case '/': i = 3; break; case '(': i = 4; break; case ')': i = 5; break; case '#': i = 6; break; } switch (b) { case '+': j = 0; break; case '-': j = 1; break; case '*': j = 2; break; case '/': j = 3; break; case '(': j = 4; break; case ')': j = 5; break; case '#': j = 6; break; } return pre[i][j]; } int Operate(int a, char theta, int b) { int i, j, result; i = a; j = b; switch (theta) { case '+': result = i + j; break; case '-': result = i - j; break; case '*': result = i * j; break; case '/': result = i / j; break; } return result; } int getnext(int *n) { char c; *n = 0; while ((c = getchar()) == ' '); if (!isdigit(c)) { *n = c; return 1; } do { *n = *n * 10 + (c - '0'); c = getchar(); } while (isdigit(c)); ungetc(c, stdin); return 0; } int main() { int i = 0, j = 0; char ch, c, x; str[j] = '#'; j++; int a, b, flag=-1; str[j] = '#'; j++; flag = getnext(&ch); x = str[j - 1]; while (ch != '='|| x != '#')//str[j-1]是字符栈栈顶 { if (flag == 0) { num[i] = ch; i++; flag = getnext(&ch); } else { //printf("%c", ch); switch (judge(str[j-1], ch))//问题出处 { case '<'://栈顶元素优先级低 num[i] = ch; i++; flag = getnext(&ch); break; case '='://脱括号并接受下一字符 j--; flag = getnext(&ch); break; case '>':// 退栈并将运算结果入栈 c = str[j - 1]; j--; b = num[i - 1]; i--; a = num[i - 1]; i--; num[i]=Operate(a, c, b); i++; break; } } x = str[j - 1]; } c = num[i - 1]; printf("%d", c); } ```
c/c++ 函数调用中形参为指针或者引用对栈操作问题
问题引出: 当我们的函数参数为普通变量或指针时,我们在调用过程中会拷贝一个副本,而当形参为引用时不会拷贝一个副本。 当形参为普通变量时,会拷贝一个变量备份,当为指针时会拷贝一个指针备份,指针指向的内容不会拷贝 问题来了: 查看使用指针和使用引用的方式调用的函数的汇编代码,会发现在汇编代码层面实现方式是一模一样的,都是: lea eax,[i](假设i是整形变量) push eax 而使用值传递方式是: mov eax,dword ptr [i] (假设i是整形变量) push eax -----但是为什么使用指针传递需要拷贝一个指针的备份(4个字节),而使用引用不会产生拷贝。。
C语言中指针数组作为函数参数传递的地址问题?
如下代码和结果 指针数据作为函数的形参和实在的时候,形参指针p和实参指针name指向同一个地址是没问题的,可为什么用&去他自身变量的地址的时候取出来的也是同一的地址呢? ``` int main() { void print(char *p[]); char *name[] = { "11111","2222222","33333333" }; printf("name[0]的地址为:%d\n", &name[0]); printf("name[0]指向的地址为:%d\n", name[0]); printf("name[0]的值为:%s\n", name[0]); printf("\n"); printf("\n"); print(name); return 0; } void print(int *p[]) { printf("p[0]的地址为:%d\n", &p[0]); printf("p[0]指向的地址为:%d\n", p[0]); printf("p[0]的值为:%s\n", p[0]); } ``` 下图为输出结果: ![图片说明](https://img-ask.csdn.net/upload/201910/17/1571290590_733033.jpg) 为了区别问题,特写了一个用指针作为参数的函数做了对比,如下: ``` int main() { void print(char *p); int name = 5; int *n; n = &name; printf("n的地址为:%d\n", &n); printf("n指向的地址为:%d\n", n); printf("name的地址为:%d\n", &name); printf("n指向的地址的值为:%d\n", name); printf("\n"); printf("\n"); print(n); return 0; } void print(int *p) { printf("p的地址为:%d\n", &p); printf("p指向的地址为:%d\n", p); printf("p的值为:%d\n", *p); printf("\n"); printf("\n"); } ``` 下图为输出结果: ![图片说明](https://img-ask.csdn.net/upload/201910/17/1571291266_40842.jpg) 为什么这里实参指针n和形参指针p自身地址是不一样的,而上面用指针数据的时候,实参指针数组name和形参指针数组p是一样的。这里有什么区别吗?
这几段代码我有点理解不了(数据结构c语言),求大神给我讲解一下。
在自学数据结构时遇到了困难,来求助大家了。 ``` #define MAXSIZE 10000 typedef struct { char no[20]; char name[50]; float price; }Book; typedef struct { Book *elem; //这个是定义了谁的指针?为什么这样定义? int length; }sqList SqList L; Status InitList(SqList &L)//形参是结构体是怎么传递的,为什么L前面还有取地址符&; { L.elem=new ElemType[MAXSIZE];//这句话是什么意思? if(!L.elem) exit(OVERFLOW); L.length=0; return OK; } ``` 谢谢
C语言中关于值传递、地址传递和引用传递的区别
大多数人都知道,使用值传递对形参的更改不会影响实参,但是地址传递和引用传递却会, 最经典的例子莫过于交换两个数字。 但是,为什么在使用值传递的时候,传递一个地址给行参依然没有影响到实参了,是因为改变只在函数内部,没有返回给调用函数吗? 比如,下面关于二叉树的建立和遍历 ``` #include <iostream> using namespace std; #define none '#' typedef char TelemType; typedef struct Binode{ TelemType data; // 数据域 struct Binode *left,*right; // 左右孩子指针 }Binode,* Bitree; // 按先序输入建立二叉树 int createBiTree(Bitree& T){ TelemType ch; scanf("%c",&ch); if(ch == none ) T = NULL; // 用#表示空节点 else{ T = new Binode; T->data = ch; createBiTree(T->left); // 建立左子树 createBiTree(T->right); // 建立右子树 } return 1; } // 按照先序遍历二叉树 int preOrder(Bitree T){ if(T){ printf("%c ",T->data); // 先遍历根 preOrder(T->left); preOrder(T->right); return 1; } else return 0; } int main(){ Bitree T; createBiTree(T); preOrder(T); return 0; } ``` 在建立二叉树createBitree去掉引用符号&,就建立不起来了?
关于opencv回调函数形参的问题
``` #include<iostream> #include<opencv2/opencv.hpp> #include<stdlib.h> using namespace cv; using namespace std; // 定义全局变量 cv::Mat img_Original; cv::Mat img_Ranged; cv::Mat img_Median; // 定义回调函数 void on_low_height_thresh_trackbar(int, void*); void on_high_height_thresh_trackbar(int, void*); int low_height = 50, high_height = 85; int main() { img_Original = cv::imread("ROI1.jpg", 0); cv::medianBlur(img_Original, img_Median, 5); // 创建窗口 cv::namedWindow("original image"); cv::namedWindow("selected image"); // 创建回调函数进度条 cv::createTrackbar("Low height", "selected image", &low_height, 255, on_low_height_thresh_trackbar); cv::createTrackbar("High height", "selected image", &high_height, 255, on_high_height_thresh_trackbar); // 显示图像 cv::imshow("original image", img_Original); on_low_height_thresh_trackbar(low_height, 0); on_high_height_thresh_trackbar(high_height, 0); cv::waitKey(0); return 0; } // 定义回调函数 void on_low_height_thresh_trackbar(int, void*) { low_height = cv::min(high_height - 1, low_height); cv::setTrackbarPos("Low height", "selected image", low_height); // 选取阈值 cv::inRange(img_Median, low_height, high_height, img_Ranged); // 显示图像 cv::imshow("selected image", img_Ranged); } void on_high_height_thresh_trackbar(int, void*) { high_height = cv::max(high_height, low_height + 1); cv::setTrackbarPos("High height", "selected image", high_height); // 选取阈值 cv::inRange(img_Median, low_height, high_height, img_Ranged); // 显示图像 cv::imshow("selected image", img_Ranged); } ``` void on_low_height_thresh_trackbar(int, void*) void on_high_height_thresh_trackbar(int, void*) 在这两个函数中int,void*这两个形参都没有出现,那么设置这两个形参是为什么呢?
#C,萌新求助,实参类型与形参不兼容怎么整啊
``` #include<stdio.h> void main() { int n; float fraction[10][5],aver(float,int); printf("输入10个学生的5门成绩:\n"); float gets(fraction[10][5]); for(n=0;0<10;n++) printf("第%d个学生的平均分为%6.2f",n+1,aver(fraction,n)); } float aver(float fraction[10][5],int n) { float sum=fraction[n][0]; for(int i=0;i<5;i++) sum+=fraction[n][i]; float aver=sum/5; return(aver); } ``` 调试后出现两条错误:1:"float (*)[5]" 类型的实参与 "float" 类型的形参不兼容 2:“aver”: 不能将参数 1 从“float [10][5]”转换为“float” 萌新不太懂,求教怎么改啊
C++函数模板传形参的问题
想麻烦问问看函数模板的形参到底应该什么时候传递const引用,什么时候使用复制。 例如: template <typename Iterator> void printl(Iterator v1, Iterator v2) //正确的 { while(v1 != v2){ cout << *v1++ <<endl; } } ------------------------------- template <typename Iterator> void printl(const Iterator &v1, const Iterator &v2) //错误的 { while(v1 != v2){ cout << *v1++ <<endl; } } --------------------------------------- 主函数: int main() { vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); printl(vec.begin(),vec.end()); return 0; } 为什么这里形参用迭代器的引用会出错呢。谢谢。
关于引用形参和指针形参的形参的理解问题
自己总是认为指针形参和引用形参的区别很小,他们都可以对实参进行改变,想了解一下他们的具体区别???
求教一道关于C++的编程问题
编写函数void fun(int x,int *pp,int *n),它的功能是:求出x的偶数因子,并按照从小到大的顺序放在pp所指的数组中,这些因子的个数通过形参n返回(假设pp指向足够大的空间)。如,若x中的值为24,则有6个数符合要求,它们是2,4,6,8,12,24. 非常感谢!!! 下面是本人编写的错误程序,如果能在这基础上修改发给我就更好了 #include <iostream>; using namespace std; int main() { void fun(int x, int pp[], int* n); int x, pp[100], * n; cin >> x; cout << n << endl; return 0; } void fun(int x, int pp[], int* n) { int i; int j = 0; int x; for (i = 1;i <= x;i++) if (x % i == 0) { pp[j++] = i; } *n = j; }
C++ 在形参里加const有什么意义?
/*在形参里加const有什么意义吗?是不是代表这个参数不能在函数里被修改?那为什么在下面的程序中,在print函数输出的还是修改后的对象呢?望大神们指点迷津!谢谢!*/ #include <iostream> #include"string.h" using namespace std; struct Student{ char name[20]; unsigned int id; char sex; unsigned short age; }; void print(const Student &stu)//加不加const的区别在哪? { cout<<stu.name<<endl; cout<<stu.id<<endl; cout<<stu.sex<<endl; cout<<stu.age<<endl; } void set(Student &stu) { strcpy(stu.name,"Jane Green"); stu.id=1; stu.sex='F'; stu.age=20; } int main(int argc, char* argv[]) { Student a={"John Smith",2,'M',21}; set(a); print(a); return 0; }
python 函数 两个枚举类型的形参,取值有关系,怎么写?
1.问题 在写一个数据处理的函数,涉及到两部分数据源,每部分数据源的fields不一样,程序想兼容两部分数据,也就意味着,形参输入数据源的时候就规定了,对应数据源的fields的输入参数,大神教一下?
c中这个定义的形参怎么理解,int型的什么呢
![图片说明](https://img-ask.csdn.net/upload/201510/23/1445559458_746009.png)如果是在程序中那么int &a就是a的地址,但是他们属于形参怎么理解,
(大一新生刚学的c语言,卑微提问,我好像没有C币啥的哎),为什么编译没问题但是程序好像执行不了,就像没运行就直接结束了
#include<stdio.h> int main() { void paixu(int a[10],char b[10][10]); void chazhao(int n,int a[10],char b[10][10]);//函数声明 int i,j,n,a[10]; char b[10][10];//定义函数 printf("请输入职工姓名和职工号\n"); for(i=0;i<10;i++) { printf("姓名:"); scanf("%s\n",b[i][10]); printf("NO:"); scanf("%d",&a[i]); } printf("请输入你要查找的工号\n"); scanf("%d",&n); paixu(a,b);//将数组实参数传递给形参 chazhao(n,a,b); return 0; } void paixu(int a[10],char b[10][10])//调用函数 { int i,j,t; char T; for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(a[i]>a[i+1]) { t=a[i],a[i]=a[i+1],a[i+1]=t; T=b[i][10],b[i][10]=b[i+1][10],b[i+1][10]=T; } for(i=0;i<10;i++) { printf("NO:%d",a[i]); printf("姓名:%c\n",b[i][10]); } } void chazhao(int n,int a[], char b[10][10]) { int top, bot, mid, x, y; top = 0; bot =8; x = 0; y = 1; if ((n < a[0]) || (n > a[8])) x = -1; while ((y == 1) && (top <= bot)) { mid = (bot + top) / 2; if (n == a[mid]) { x = mid; printf("NO.%d,his name is %c\n", n, b[x]); y == -1; } else if (n < a[mid]) bot = mid - 1; else top = mid + 1; } if (y == 1 || x == -1) printf("%d not been found.\n", n); }
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
相关热词 c# clr dll c# 如何orm c# 固定大小的字符数组 c#框架设计 c# 删除数据库 c# 中文文字 图片转 c# 成员属性 接口 c#如何将程序封装 16进制负数转换 c# c#练手项目
立即提问