使用malloc()创建一个二维数组并利用二维数组中的一行存储字符串,能办到吗

char content = (char)malloc(sizeof(char*) * g);
for(i=0;i<g;i++)
content[i]= (char*)malloc(sizeof(char) * g);
printf("依次输入顶点内容\n");
for (i = 0; i < g; i++)
gets_s(*(content+i));

1>C:\Users\liuww\source\repos\Project2\源1.cpp(17,22): error C2660: “gets_s”: 函数不接受 1 个参数

怎么修改,我想要定义一个二维数组,但需要使用变量规定长度,因此用到了malloc()
利用二维数组中的一行存储一个字符串

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
指针数组中的malloc用法
#include<stdio.h> #include<stdlib.h> void sort(char *a[]); //将6,8行去掉 13 14 行a 改为p即可 int main() { char *a[5]; char **p; p = a; //等价于*p=a[0] int i; p=(char**)malloc(5*sizeof(char*)); //这一行不加的话后面的程序就能运行。 for(i=0;i<5;i++){ a[i]=(char*)malloc(20*sizeof(char)); gets(a[i]);} //请问为什么是这样的呢 为什么p不需要malloc呢 它和二维数组有什么不同?
C++,为一个二维数组赋值,为什么到一半就停止了?
int preprocessing(char strFile[],IMAGEDATA *imagedata,PIXEL **imagepixel,long *wid,long *hei) { FILE *fpi; imagedata= NULL;//动态分配存储原图片的像素信息的二维数组 long *width,*height;//新定义一个像素结构体二维数组 width=wid;height=hei; fpi=fopen(strFile,"rb"); if(fpi != NULL){ //先读取文件类型 WORD bfType; fread(&bfType,1,sizeof(WORD),fpi); if(0x4d42!=bfType) { cout<<"the file is not a bmp file!"<<endl; return NULL; } //读取bmp文件的文件头和信息头 fread(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpi); showBmpHead(strHead);//显示文件头 fread(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpi); showBmpInforHead(strInfo);//显示文件信息头 //读取调色板 for(unsigned int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++) { fread((char *)&(strPla[nCounti].rgbBlue),1,sizeof(BYTE),fpi); fread((char *)&(strPla[nCounti].rgbGreen),1,sizeof(BYTE),fpi); fread((char *)&(strPla[nCounti].rgbRed),1,sizeof(BYTE),fpi); fread((char *)&(strPla[nCounti].rgbReserved),1,sizeof(BYTE),fpi); } width = &strInfo.biWidth; height = &strInfo.biHeight; //图像每一行的字节数必须是4的整数倍 *width = ((*width) * sizeof(IMAGEDATA) + 3) / 4 * 4; *wid=*width; *hei=*height; imagedata = (IMAGEDATA*)malloc((*width) * (*height) * sizeof(IMAGEDATA)); imagepixel=(PIXEL**)malloc(sizeof(PIXEL*)*(*height)); for(int w=0;w<(*height);w++) { imagepixel[w]=(PIXEL*)malloc(sizeof(PIXEL*)*(*width)); } //初始化原始图片的像素数组以及新构造的像素数组 for(int i = 0;i < (*height);++i) { for(int j = 0;j < (*width);++j) { (*(imagedata + i * (*width )+ j)).blue = 0; imagepixel[i][j].blue = 0;//系统提示这一句; imagepixel[i][j].tag = 0; imagepixel[i][j].t = i * (*width )+ j; } } //fseek(fpi,54,SEEK_SET); //读出图片的像素数据 fread(imagedata,sizeof(struct tagIMAGEDATA) *(*width),(*height),fpi); fclose(fpi); for(i = 0;i <(*height);++i) { for(int j = 0;j < (*width);++j) { imagepixel[i][j].blue=(*(imagedata + i * (*width) + j)).blue; } } processingpixel(imagedata,imagepixel,width,height);//对像素操作 } else { cout<<"file open error!"<<endl; return NULL; } fclose(fpi); afterprocessing(imagedata,width,height); return 0; } ![![![图片说明](https://img-ask.csdn.net/upload/201604/04/1459740049_603489.png)图片说明](https://img-ask.csdn.net/upload/201604/04/1459740034_302021.png)图片说明](https://img-ask.csdn.net/upload/201604/04/1459740026_282034.png)
关于c语言的二维数组传递的问题求解决~
我遇到的问题是:在主函数中声明的二维数组 ( int **mi;) 传递到函数createmaze(int **mi)以及 find(int **mi)中报错: cannot convert 'int (*)[(c + 1)]' to 'int**' for argument '2' to 'int createmaze(maze**, int**, SqStack&)' 百度上介绍的办法都试过了,没用。使用的dev C++。 所以在此请求大佬支援!!! 相关代码: int find(maze **ma,int **mi,SqStack &S,poi e){ int err; push(S,e);/*先将开始处位置压栈*/ while(1){/*模拟用户寻找出口*/ if(mi[e.a+1][e.b]==1&&ma[e.a+1][e.b].foot==0&&ma[e.a+1][e.b].death==0){ /*向下找*/ e.a++; e.step++; /*表示走了n步*/ ma[e.a+1][e.b].foot++;/*表示第一步已走过*/ push(S,e); return 1; /*返回while再来*/ } else if(mi[e.a][e.b+1]==1&&ma[e.a][e.b+1].foot==0&&ma[e.a][e.b+1].death==0){ /*向右找*/ e.b++; e.step++; ma[e.a][e.b+1].foot++; push(S,e); return 1; } else if(mi[e.a-1][e.b]==1&&ma[e.a-1][e.b].foot==0&&ma[e.a-1][e.b].death==0){ /*向上找*/ e.a--; e.step++; ma[e.a-1][e.b].foot++; push(S,e); return 1; } else if(mi[e.a][e.b-1]==1&&ma[e.a][e.b-1].foot==0&&ma[e.a][e.b-1].death==0){/*向左找*/ e.b--; e.step++; ma[e.a][e.b-1].foot++; push(S,e); return 1; } else if(e.a==r&&e.b==c)/*已经到达出口*/err==0; else{/*未找到路,返回*/ /*death表明死路,不会再去。*/ if(mi[e.a][e.b-1]==1){ /*回左边*/ ma[e.a][e.b].death=1; e.b--; e.step--; ma[e.a][e.b-1].foot--; pop(S,e); return 1; } else if(mi[e.a-1][e.b]==1&&ma[e.a-1][e.b].foot==0){ /*回上*/ ma[e.a][e.b].death=1; e.a--; e.step--; ma[e.a-1][e.b].foot--; pop(S,e); return 1; } else if(mi[e.a][e.b+1]==1&&ma[e.a][e.b+1].foot==0){ /*回右*/ ma[e.a][e.b].death=1; e.b++; e.step--; ma[e.a][e.b+1].foot--; pop(S,e); return 1; } else if(mi[e.a][e.b+1]==1&&ma[e.a][e.b+1].foot==0){ /*回下*/ ma[e.a][e.b].death=1; e.a++; e.step--; ma[e.a][e.b+1].foot--; pop(S,e); return 1; } } } if(err==-1) return -1; else return 0; } int createmaze(maze **ma,int **mi,SqStack& S){/*创建具有出路的迷宫*/ for(int i=0;i<r+2;i++){/*建立迷宫外围i行j列*/ /*foot指已走过的次数:在这循环使之置0或墙的3.*/ for(int j=0;j<c+2;j++){ int R = rand()%2; if(i==0){ /*第一行*/ mi[i][j]=0; ma[i][j].foot=3;/*外墙在数组中的foot置3避免错误*/ ma[i][j].death=3; if(j==0||j==c+1) printf("口"); else printf("—"); } else if(i!=0&&i!=r+1){ /*中间行*/ if(j==0||j==c+1){ mi[i][j]=0; ma[i][j].foot=3; ma[i][j].death=3; /*中间行的外墙在数组中置0*/ printf("||"); } else if(R==0){/*剔除出口与入口后的内墙的建立*/ if(i==1&&j==1){ mi[i][j]=1; ma[i][j].foot=0; /*入口在数组中置1*/ ma[i][j].death=0; printf(" "); } else if(i==r&&j==c){ mi[i][j]=1; ma[i][j].foot=0; /*出口在数组中置1*/ ma[i][j].death=0; printf(" "); } else{ ma[i][j].foot=3; mi[i][j]=0; /*内墙在数组中置0*/ ma[i][j].death=3; printf("口"); } } else{ mi[i][j]=1; ma[i][j].foot=0; /*其他地方置1*/ ma[i][j].death=0; printf(" "); } } else if(i==r+1){/*最底下的墙*/ mi[i][j]=0; /*底行外墙置0*/ ma[i][j].foot=3; ma[i][j].death=3; if(j==0||j==c+1)printf("口"); else printf("—"); } if(j==c+1) printf("\n"); } return 0; } printf("这是数组中的排列:\n"); for(int i=0;i<r+2;i++){ for(int j=0;j<c+2;j++){ printf("%d",mi[i][j]); if(j==c+1) printf("\n"); } } } int main(){ maze **ma;//声明一个迷宫 ma=(maze**)malloc(r*sizeof(maze*)); for(int i=0;i<r+2;i++){ ma[i]=(maze*)malloc(c*sizeof(maze)); } int mi[r+1][c+1]; createmaze(ma,mi,S); if(find(ma,mi,S,e1)==-1) createmaze(ma,mi,S);/*再创建*/ return 0; } ```
大学生初学,定义二维数组的问题求指点,预计定义一个可自动决定大小的数组,并且每个元素含有多个变量
#include <stdio.h> typedef int Status; typedef struct Node { Status var1; Status var2; }; int main() { int i,j,s=0;//i表示行。j表示咧。s为总路程,初始化为0 int Num_Nodes; //定义二维数组 Node** a;//二级指针 a = (Node** )malloc ((sizeof (Node*))*Num_Nodes); for (i=0; i<Num_Nodes; ++i) { a[i] = (Node*)malloc ((sizeof (Node))*Num_Nodes); } }
数据结构 动态配制 指针数组
使用命令行参数为学生总数(2)。在标准输入中,在指令“输入氮名”时,输入一行的输入的数字(输入)的名称。使用二维动态分配将所有名称存储在一个变量中。打印输出结果在标准输出。 ![图片说明](https://img-ask.csdn.net/upload/201603/05/1457163485_552475.png) 数据结构:指针数组 输入:名字 输出:氮名 条件: •学生人数应该超过2个 使用动态分配存储的名字(malloc()) •用户名称的长度应为30个字符 •在名称中不允许空格
C语言寻找三维数组正切面最大和的值,上交Wrong Answer, 有题目和代码, 望大神指点
切面 Description 给出一个长方体,求该长方体每个正切面上的元素之和的最大值。 正切面的意思就是与长方体某一面平行的切面。如果把长方体看作是一个三维数组,那么每个切面就是一个二维数组。 Input 第一行是3个正整数a、b、c,分别表示长方体的长、宽、高。0 < a, b, c ≤ 60 接下来是 c 块数据,每一块数据有a行、每行b个整数。 Output 输出切面元素和的最大值。 Sample Input 3 3 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 Sample Output 27 我的代码 ``` #include <stdio.h> #include <stdlib.h> int main (){ //长a,宽b,高c int a, b, c; scanf("%d %d %d", &a, &b, &c); //定义动态内存 int ***p = (int ***) malloc(sizeof(int **) * a); for (int i = 0; i < a; i++){ p[i] = (int **) malloc(sizeof(int *) * b); for (int j = 0; j < b; j++) p[i][j] = (int *) malloc(sizeof(int) * c); } //读入数据 for (int i = 0; i < a; i++) for (int j = 0; j < b; j++) for (int k = 0; k < c; k++) scanf("%d", &p[i][j][k]); int max; //找最大切面 for (int i = 0; i < a; i++){ int sum = 0; for (int j = 0; j < b; j++) for (int k = 0; k < c; k++) sum += p[i][j][k]; if (i == 0)//当第一个切面时最大切面为第一个切面 max = sum; else if (sum > max) max = sum; } for (int j = 0; j < b; j++){ int sum = 0; for (int i = 0; i < a; i++) for (int k = 0; k < c; k++) sum += p[i][j][k]; if (sum > max) max = sum; } for (int k = 0; k < c; k++){ int sum = 0; for (int i = 0; i < a; i++) for (int j = 0; j < b; j++) sum += p[i][j][k]; if (sum > max) max = sum; } printf("%d", max); //释放p for (int i = 0; i < a; i++){ for (int j = 0; j < b; j++) free(p[i][j]); free(p[i]); } free(p); return 0; } ``` 测试用例 ![图片说明](https://img-ask.csdn.net/upload/201912/04/1575423291_936517.png) 但是上交的是返回 ![图片说明](https://img-ask.csdn.net/upload/201912/04/1575423415_271316.png)
char字符分割成 二维数组,前提是不知道有多少行和列 按照空格和#分割
void main() { char *Result = "系统日期 名称 数量 库存 句柄 保留信息 #20170517 发展 500 500 550030014923 1FFA1208#20170517 发展2 100 100 54923 1ff1F208"; char **split(const char *src, const char *delim); char **strArray = split(Result, "# "); printf("%s",strArray[1][3]); getchar(); } //分割字符并返回字符数组 char **split(const char *src, const char *delim) { int size_char_p = sizeof(char*); char **result = (char**)malloc(size_char_p); char **ptmp = NULL; char *src_copy; int index = 0; int result_size = 1; int i = 0; char *p; if (src == NULL || delim == NULL) { *result = strdup(""); return result; } //备份源字符串 src_copy = strdup(src); //开始分隔第一个字符串 p = strtok(src_copy, delim); printf("%s\n\n\n结束p\n", p); if (p == NULL || strlen(p) == 0) { //释放备份 free(src_copy); *result = strdup(""); return result; } //重新申请字符串指针空间 ptmp = (char**)realloc(result, (++result_size)*size_char_p); if (ptmp == NULL) { printf("cannot realloc\n"); free(result); return NULL; } result = ptmp; *result = strdup(p); index++; //printf("%S\n", result); //重新申请字符串指针的空间 while ((p = strtok(NULL, delim))) { if (*p == '\0') { continue; } //重新申请字符串指针 ptmp = (char**)realloc(result, (++result_size)*size_char_p); if (ptmp == NULL) { printf("cannot realloc\n"); //无法申请内存,则释放申请的空间 for (i = 0; i<result_size; i++) { free(result[i]); } free(result); return NULL; } result = ptmp; result[index] = strdup(p); //printf("%s\n\n\n", p); printf("%s\n\n\n", result[index]); index++; } //释放备份字符串 free(src_copy); //把最后一个置为空 result[index] = strdup(""); return result; }
C++中返回数组供函数调用
如下是我编写的高斯顺序消元法程序,input函数是我自定义的,希望输入一个矩阵,然后给Gauss和zg matrix函数调用,但是输入的矩阵不知如何传递过去。 #include <stdio.h> //包含输入输出函数 #include <stdlib.h>//包含动态内存分配函数。 #define n 3 float input()//输入矩阵函数************出问题的地方 { float **a; //定义二维指针。 float *b;//定义一维指针。 int i,j; a = (float **) malloc(sizeof(float *) *n);//申请一组一维指针空间。 for(i = 0; i < n; i ++) a[i] = (float *)malloc(sizeof(float) *n); //对于每个一维指针,申请一行数据的空间。 b = (float *)malloc(sizeof(float) *n); printf("请输入系数矩阵:\n"); for(i = 0; i < n; i ++) { for(j = 0; j < n; j ++) { printf("a[%d][%d]: ", i+1, j+1); scanf("%f",&a[i][j]);//输入第i行第j列的数据。 } }return a; printf("请输入右端项数组:\n"); for(i=0; i<n; i++) { printf("b[%d]: ", i+1); scanf("%f", &b[i]); }return b; //释放内存 for(i = 0; i < n; i ++) free(a[i]); free(a);free(b); } int Gauss(float a[n][n],float b[n])//高斯消元过程 { int i,j,k,flag=1; float t; for(i=0;i<n-1;i++) { if(a[i][i]==0) { flag=0; break; } else { for(j=i+1;j<n;j++) { t=-a[j][i]/a[i][i]; b[j]=b[j]+t*b[i]; for(k=i;k<n;k++) a[j][k]=a[j][k]+t*a[i][k]; } } } return (flag); } void zg_matrix(float a[n][n],float b[n])//输出增广矩阵 { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%10f",a[i][j]); } printf(" | "); printf("%10f\n",b[i]); } } void main() { float input(); float x[n]={0}; int i,j,flag; zg_matrix(a,b); flag=Gauss(a,b); if(flag==0) printf("Gauss Method Fail!!!\n");//求解 else { x[n-1]=b[n-1]/a[n-1][n-1]; for(i=n-2;i>=0;i--) { x[i]=b[i]; for(j=i+1;j<n;j++) x[i]=x[i]-a[i][j]*x[j]; x[i]=x[i]/a[i][i]; } for(i=0;i<n;i++) printf("x%d=%11.7f\n",i+1,x[i]); } }
关于PTA习题大炮打蚊子的一点疑惑,提交显示答案正确,段错误?
背景: 现在,我们用大炮来打蚊子:蚊子分布在一个M×N格的二维平面上,每只蚊子占据一格。向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意: O OXO O 其中,X为炮弹落点中心,O为紧靠中心的四个有杀伤力的格子范围。若蚊子被炮弹命中(位于X格),一击毙命,若仅被杀伤(位于O格),则损失一半的生命力。也就是说,一次命中或者两次杀伤均可消灭蚊子。现在给出蚊子的分布情况以及连续k发炮弹的落点,给出每炮消灭的蚊子数。 输入格式: 第一行为两个不超过20的正整数M和N,中间空一格,表示二维平面有M行、N列。 接下来M行,每行有N个0或者#字符,其中#表示所在格子有蚊子。 接下来一行,包含一个不超过400的正整数k,表示发射炮弹的数量。 最后k行,每行包括一发炮弹的整数坐标x和y(0≤x<M,0≤y<N),之间用一个空格间隔。 输出格式: 对应输入的k发炮弹,输出共有k行,第i行即第i发炮弹消灭的蚊子数。 输入样例: 5 6 00#00# 000### 00#000 000000 00#000 2 1 2 1 4 输出样例: 0 2 ``` int main(void) { int M, N; int i, j; int k, count = 0; char **a; int *x, *y; // 行列 scanf("%d %d", &M, &N); if(M>0&&M<20 && N>0&&N<20) { // 动态分配内存 // 行指针 a = (char **)malloc(sizeof(char *)*M); for(i = 0;i < M;i++) { a[i] = (char *)malloc(sizeof(char)*N); } // 得到蚊子分布图 for(i = 0;i < M;i++) { getchar(); for(j = 0;j < N;j++) { a[i][j] = getchar(); } } // 炮弹数量 scanf("%d", &k); // 动态分配一维数组存储炮弹命中坐标 x = (int *)malloc(sizeof(int)*k); y = (int *)malloc(sizeof(int)*k); if(k>0 && k<400) { for(i = 0;i < k;i++) { scanf("%d %d", &x[i], &y[i]); } for(i = 0;i < k;i++) { if(x[i]>=0&&x[i]<M&&y[i]>=0&&y[i]<N) { // 第一发炮弹 if(i == 0) { // 直接命中,蚊子消失,生命为0 if(a[x[i]][y[i]] == '#') { a[x[i]][y[i]] = '0'; count++; } // 炮弹波及上下左右的蚊子,标记蚊子生命为1 if(a[x[i]][y[i]+1] == '#') { a[x[i]][y[i]+1] = '1'; } if(a[x[i]][y[i]-1] == '#') { a[x[i]][y[i]-1] = '1'; } if(a[x[i]+1][y[i]] == '#') { a[x[i]+1][y[i]] = '1'; } if(a[x[i]-1][y[i]] == '#') { a[x[i]-1][y[i]] = '1'; } } else { // 直接命中,或命中生命为1的蚊子,蚊子消失 if(a[x[i]][y[i]] == '#' || a[x[i]][y[i]] == '1') { a[x[i]][y[i]] = '0'; count++; } // 波及生命为1的蚊子,蚊子消失 if(a[x[i]][y[i]+1] == '1') { a[x[i]][y[i]+1] = '0'; count++; } else if(a[x[i]][y[i]+1] == '#')// 波及健全的蚊子,标记蚊子生命为1 { a[x[i]][y[i]+1] = '1'; } if(a[x[i]][y[i]-1] == '1') { a[x[i]][y[i]-1] = '0'; count++; } else if(a[x[i]][y[i]-1] == '#') { a[x[i]][y[i]-1] = '1'; } if(a[x[i]+1][y[i]] == '1') { a[x[i]+1][y[i]] = '0'; count++; } else if(a[x[i]+1][y[i]] == '#') { a[x[i]+1][y[i]] = '1'; } if(a[x[i]-1][y[i]] == '1') { a[x[i]-1][y[i]] = '0'; count++; } else if(a[x[i]-1][y[i]] == '#') { a[x[i]-1][y[i]] = '1'; } } } printf("%d\n", count); count = 0; } } } // 释放内存 for(i = 0;i < M;i++) { free(a[i]); } free(a); free(x); free(y); return 0; } ```
vs2008+cuda5.0环境下运行cuda代码,在调试时总发生异常(0xC0000005: 读取位置 时发生访问冲突)
问题截图: ![图片说明](https://img-ask.csdn.net/upload/201904/02/1554170610_506664.png) 1、该异常经常发生,包括来自《cuda高性能编程 cuda实战》书中的代码,自己写的一些代码等。但是不是一定会发生。 2、调试时发现,异常产生的位置都是在主函数中,当调用了cudaMalloc函数分配内存后,接着调用第二个cuda函数时就会出现该异常,比如用cudaMalloc为第二个变量分配内存,或是用cudaMemcpy向GPU复制数据。 举个例子: 这段代码没有问题(只为一个数组分配了内存并在核函数中计算) ``` #include <stdio.h> #include <malloc.h> #include <cuda_runtime_api.h> #include "device_launch_parameters.h" #define type float __global__ void myKernel(type* d_a, int height, int width, int pitch) //四个形参:数组名,高,行宽,行字节数 { int tx = blockDim.x * blockIdx.x + threadIdx.x; int ty = blockDim.y * blockIdx.y + threadIdx.y; if( tx<width && ty<(height) ) d_a[ty*width+tx] *= 10; } int main() { // 定义参数:高、宽、数组 size_t width = 16; size_t height = 10; type *h_a; type *d_a; type *d_b; size_t pitch; // 分配主机内存 h_a = (type *)malloc(sizeof(type)*width*height); //h_data 分配内存:宽*高 // 数组初始化 for (int i = 0; i < width*height; i++) h_a[i] = (type)i; // 分配GPU内存,并复制数组到GPU cudaMallocPitch((void **)&d_a, &pitch, sizeof(type)*width, height); cudaMemcpy2D(d_a, pitch, h_a, sizeof(type)*width, sizeof(type)*width, height, cudaMemcpyHostToDevice); // printf("\nPitch = %d B\n", pitch); cudaMalloc((void **)&d_b, sizeof(type)*width); //分配二维线程 dim3 threadsPerBlock(8,8); dim3 blocksPerGrid((width+threadsPerBlock.x-1)/threadsPerBlock.x,(height+threadsPerBlock.y-1)/threadsPerBlock.y); // +threadsPerBlock.x-1 //核函数执行 myKernel <<< blocksPerGrid ,threadsPerBlock >>> (d_a, height, width, pitch); //参数:d_data,高度,行宽,行字节数 cudaDeviceSynchronize(); //复制数组回CPU cudaMemcpy2D(h_a, sizeof(type)*width, d_a, pitch, sizeof(type)*width, height, cudaMemcpyDeviceToHost); for (int i = width*(height - 10); i < width*height; i++) { printf("%10.2f", h_a[i]); if ((i + 1) % width == 0) printf("\n"); } free(h_a); cudaFree(d_a); getchar(); return 0; } ``` 在这个基础上改了之后,变为为三个变量分配内存并在核函数中计算就发生问题了。 ``` #include <stdio.h> #include <malloc.h> #include <cuda_runtime_api.h> #include "device_launch_parameters.h" #define type float __global__ void myKernel(type* d_a, type* d_b, type* d_c, int height, int width, int pitch) //四个形参:数组名,高,行宽,行字节数 { int tx = blockDim.x * blockIdx.x + threadIdx.x; int ty = blockDim.y * blockIdx.y + threadIdx.y; if( tx<width && ty<height ) d_c[ty*width+tx] = pow( d_b[ty*width+tx] - d_a[ty*width+tx] , 2 ); } int main() { // 定义参数:高、宽、数组 size_t width = 160; size_t height = 16; type *h_a, *h_b, *h_c; // 一维数组 h_data 和 d_data 。。既该二维数组的存储形式,在cpu和gpu都是一维数组 type *d_a, *d_b, *d_c; size_t pitch; // 分配主机内存 h_a = (type *)malloc(sizeof(type)*width*height); //h_data 分配内存:宽*高 h_b = (type *)malloc(sizeof(type)*width*height); h_c = (type *)malloc(sizeof(type)*width*height); // 数组初始化 for (int i = 0; i < width*height; i++) h_a[i] = h_b[i] = (type)i; // 分配GPU内存,并复制数组到GPU cudaMallocPitch((void **)&d_a, &pitch, sizeof(type)*width, height); //分配gpu内存:d_data 数组名地址,pitch地址,行字节数,高度 cudaMallocPitch((void **)&d_b, &pitch, sizeof(type)*width, height); cudaMallocPitch((void **)&d_c, &pitch, sizeof(type)*width, height); printf("\nPitch = %d B\n", pitch); cudaMemcpy2D(d_b, pitch, h_b, sizeof(type)*width, sizeof(type)*width, height, cudaMemcpyHostToDevice); cudaMemcpy2D(d_a, pitch, h_a, sizeof(type)*width, sizeof(type)*width, height, cudaMemcpyHostToDevice); //目标数组名,目标行字节数,原数组名,源行字节数,数组实际行字节数,高 //分配二维线程 dim3 threadsPerBlock(8,8); dim3 blocksPerGrid((width+threadsPerBlock.x-1)/threadsPerBlock.x,(height+threadsPerBlock.y-1)/threadsPerBlock.y); // +threadsPerBlock.x-1 //核函数执行 myKernel <<< blocksPerGrid ,threadsPerBlock >>> (d_a, d_b, d_c, height, width, pitch); //参数:d_data,高度,行宽,行字节数 cudaDeviceSynchronize(); //一个同步函数。该方法将停止CPU端线程的执行,直到GPU端完成之前CUDA的任务,包括kernel函数、数据拷贝等。 //复制数组回CPU cudaMemcpy2D(h_c, sizeof(type)*width, d_c, pitch, sizeof(type)*width, height, cudaMemcpyDeviceToHost); for (int i = width*(height - 10); i < width*height; i++) { printf("%10.2f", h_c[i]); if ((i + 1) % width == 0) printf("\n"); } free(h_a); free(h_b); free(h_c); cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); getchar(); return 0; } ```
这是一个迷宫求解问题
/*如果迷宫有通道可解则正常运行,迷宫不可解为什么显示exe停止工作呢?怎样修改呢?*/ #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define COLUMN 10 #define ROW 10 typedef int Status; typedef struct{ char **maze; int **footprint; int row; int column; }MazeType; typedef struct{ int x; int y; }PosType; typedef struct{ int ord; PosType seat; int di; }SElemType; typedef struct{ SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack *S); Status InitMaze(MazeType *M); Status DestroyStack(SqStack *S); Status ClearStack(SqStack *S); Status StackEmpty(SqStack S); int StackLength(SqStack S); Status GetTop(SqStack S,SElemType *e); Status Push(SqStack *S,SElemType e); Status Pop(SqStack *S,SElemType *e); Status StackTraverse(const SqStack *S); Status PrintMaze(MazeType *M); Status MazePath(SqStack *S,MazeType maze,PosType start,PosType end); Status FootPrint(MazeType *M,PosType pos); Status Pass(MazeType *M,PosType pos); SElemType NewSElem(int step,PosType pos,int d); PosType NextPos(PosType pos,int d); Status MarkPrint(MazeType *M,PosType pos); Status PrintFoot(MazeType *M,SqStack *S); int main() { MazeType maze; SqStack stack; PosType start,end; start.x=0;start.y=1; end.x=8;end.y=9; InitMaze(&maze); printf("迷宫形状:\n"); PrintMaze(&maze); if(TRUE==MazePath(&stack,maze,start,end)) printf("迷宫可解.\n"); else printf("迷宫不可解.\n"); return 0; } Status InitStack(SqStack *S){ //构造一个空栈S S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S->base)//分配失败 { printf("分配内存失败.\n"); exit(0); } S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; } Status InitMaze(MazeType *M){ //初始化迷宫数据 int i,j; char mz[ROW][COLUMN]={ //mz新定义的二维数组 '#',' ',' ','#','#','#','#','#','#','#',//每行十个 '#','#','#','#',' ',' ',' ','#',' ','#', '#',' ',' ','#',' ',' ',' ','#',' ','#', '#',' ',' ',' ',' ','#','#',' ',' ','#', '#',' ','#','#','#',' ',' ',' ',' ','#', '#',' ',' ',' ','#',' ','#',' ','#','#', '#',' ','#',' ',' ',' ','#',' ',' ','#', '#',' ','#','#','#',' ','#','#',' ','#', '#','#',' ',' ',' ',' ',' ',' ',' ',' ', '#','#','#','#','#','#','#','#','#','#' }; M->maze=(char **)malloc(sizeof(char *)*ROW); M->footprint=(int **)malloc(sizeof(int *)*ROW); if(!M->maze||!M->footprint){ printf("申请空间失败,迷宫无法初始化.\n"); return ERROR; exit(0); } for(i=0;i<ROW;i++){ M->maze[i]=(char *)malloc(sizeof(char)*COLUMN); M->footprint[i]=(int *)malloc(sizeof(int)*COLUMN); if(!M->maze[i]||!M->footprint[i]){ printf("申请空间失败,迷宫初始化失败.\n"); return ERROR; exit(0); } } for(i=0;i<ROW;i++){ for(j=0;j<COLUMN;j++){ M->maze[i][j]=mz[i][j]; M->footprint[i][j]=0; } } M->row=ROW; M->column=COLUMN; return OK; } Status DestroyStack(SqStack *S){ if(!S) { printf("指针为空,释放失败.\n"); exit(0); } free(S); return OK; } Status ClearStack(SqStack *S){ if(!S) return FALSE; S->top=S->base; return OK; } Status StackEmpty(SqStack S){ if(S.top==S.base) return TRUE; else return FALSE; } int StackLength(SqStack S){ return S.stacksize; } Status GetTop(SqStack S,SElemType *e){ if(S.top==S.base){ printf("栈为空.\n"); return FALSE; }else{ *e=*(S.top-1); printf("栈顶元素:%c\n",*e); return OK; } } Status Push(SqStack *S,SElemType e){ if(S->top-S->base>=S->stacksize){ S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S->base) { printf("重新申请空间失败.\n"); exit(0); } S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *S->top++=e; return OK; } Status Pop(SqStack *S,SElemType *e){ if(S->top==S->base){//栈为空 printf("栈为空.\n"); return ERROR; } *e=*(--S->top); return OK; } Status StackTraverse(const SqStack *S){ //从栈底到栈顶依次对每个元素进行访问 SElemType *p=S->base; if(S->base==S->top) { printf("栈为空.\n"); return FALSE; } printf("栈中元素:"); while(p!=S->top) { printf("x=%d,y=%d\n",p->seat.x,p->seat.y); *p++; } printf("\n"); return OK; } Status PrintMaze(MazeType *M){ //输出迷宫 int i,j; for(i=0;i<M->row;i++){ for(j=0;j<M->column;j++){ printf("%c",M->maze[i][j]); } printf("\n"); } printf("\n"); return OK; } Status PrintFoot(MazeType *M,SqStack *S){ //输出迷宫的路径 int i,j; SElemType *p; for(i=0;i<M->row;i++){ for(j=0;j<M->column;j++){ M->footprint[i][j]=0; } } p=S->base; if(S->base==S->top) { printf("栈为空.\n"); return FALSE; } while(p!=S->top) { M->footprint[p->seat.x][p->seat.y]=1; *p++; } for(i=0;i<M->row;i++){ for(j=0;j<M->column;j++){ printf("%d",M->footprint[i][j]); } printf("\n"); } return OK; } Status MazePath(SqStack *S,MazeType maze,PosType start,PosType end){ int curstep=1;//当前步数 SElemType e; PosType curpos=start;//当前位置 InitStack(S);//初始化栈 do{ if(TRUE==Pass(&maze,curpos)){ FootPrint(&maze,curpos); e=NewSElem(curstep,curpos,1); Push(S,e); if((curpos.x==end.x)&&(curpos.y==end.y)){//到达终点(出口) printf("迷宫路径:\n"); //StackTraverse(S); PrintFoot(&maze,S); return TRUE; } curpos=NextPos(curpos,1); curstep++; }//if else{//当前位置不能通过 if(!StackEmpty(*S)){ Pop(S,&e); while(e.di==4&&!StackEmpty(*S)){ MarkPrint(&maze,e.seat); Pop(S,&e); }//while if(e.di<4){ e.di++; Push(S,e); curpos=NextPos(e.seat,e.di); }//if }//if }//else //PrintFoot(&maze,S); }while(!StackEmpty(*S));//一直循环到栈空为止 return FALSE; } Status FootPrint(MazeType *M,PosType pos){ //将迷宫的当前位置pos设置为"走过",即footprint该位置为1 if((pos.x>M->row)||(pos.y>M->column))//检验大小 return FALSE; M->footprint[pos.x][pos.y]=1;//如果不满足条件,开始运行下一步 return TRUE; } Status Pass(MazeType *M,PosType pos){ //判断当前位置是否可通,即为走过的通道块 if((M->row<pos.x)||(M->column<pos.y)){ printf("位置越位.\n"); exit(0); } if((0==M->footprint[pos.x][pos.y])&&(M->maze[pos.x][pos.y]==' ')) return TRUE; else return FALSE; } SElemType NewSElem(int step,PosType pos,int d){ //创建新结点,用step,pos,d初始化该结点 SElemType e; e.ord=step; e.seat=pos; e.di=d; return e;//下一步 } PosType NextPos(PosType pos,int d){ //获取pos位置d方向的位置 switch(d){ case 1://东 pos.x++; break; case 2://南 pos.y++; break; case 3://西 pos.x--; break; case 4://北 pos.y--; break; default: printf("位置编号出错.\n"); }//利用坐标左西右东上北下南 return pos; } Status MarkPrint(MazeType *M,PosType pos){ //将迷宫M的pos位置,设为已走,成功返回OK;否则返回ERROR if(pos.x>M->row||pos.y>M->column){ printf("所要标记位置越位.\n"); return ERROR; } M->footprint[pos.x][pos.y]=1; return OK; }
这个迷宫求解代码当迷宫无通路时显示停止运行,劳烦哪个大神帮我看看代码哪里错了?
/*如果迷宫有通道可解则正常运行,迷宫不可解为什么显示exe停止工作呢?怎样修改呢?*/ #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define COLUMN 10 #define ROW 10 typedef int Status; typedef struct{ char **maze; int **footprint; int row; int column; }MazeType; typedef struct{ int x; int y; }PosType; typedef struct{ int ord; PosType seat; int di; }SElemType; typedef struct{ SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack *S); Status InitMaze(MazeType *M); Status DestroyStack(SqStack *S); Status ClearStack(SqStack *S); Status StackEmpty(SqStack S); int StackLength(SqStack S); Status GetTop(SqStack S,SElemType *e); Status Push(SqStack *S,SElemType e); Status Pop(SqStack *S,SElemType *e); Status StackTraverse(const SqStack *S); Status PrintMaze(MazeType *M); Status MazePath(SqStack *S,MazeType maze,PosType start,PosType end); Status FootPrint(MazeType *M,PosType pos); Status Pass(MazeType *M,PosType pos); SElemType NewSElem(int step,PosType pos,int d); PosType NextPos(PosType pos,int d); Status MarkPrint(MazeType *M,PosType pos); Status PrintFoot(MazeType *M,SqStack *S); int main() { MazeType maze; SqStack stack; PosType start,end; start.x=0;start.y=1; end.x=8;end.y=9; InitMaze(&maze); printf("迷宫形状:\n"); PrintMaze(&maze); if(TRUE==MazePath(&stack,maze,start,end)) printf("迷宫可解.\n"); else printf("迷宫不可解.\n"); return 0; } Status InitStack(SqStack *S){ //构造一个空栈S S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S->base)//分配失败 { printf("分配内存失败.\n"); exit(0); } S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; } Status InitMaze(MazeType M){ //初始化迷宫数据 int i,j; char mz[ROW][COLUMN]={ //mz新定义的二维数组 '#',' ',' ','#','#','#','#','#','#','#',//每行十个 '#','#','#','#',' ',' ',' ','#',' ','#', '#',' ',' ','#',' ',' ',' ','#',' ','#', '#',' ',' ',' ',' ','#','#',' ',' ','#', '#',' ','#','#','#',' ',' ',' ',' ','#', '#',' ',' ',' ','#',' ','#',' ','#','#', '#',' ','#',' ',' ',' ','#',' ',' ','#', '#',' ','#','#','#',' ','#','#',' ','#', '#','#',' ',' ',' ',' ',' ',' ',' ',' ', '#','#','#','#','#','#','#','#','#','#' }; M->maze=(char *)malloc(sizeof(char )*ROW); M->footprint=(int *)malloc(sizeof(int *)*ROW); if(!M->maze||!M->footprint){ printf("申请空间失败,迷宫无法初始化.\n"); return ERROR; exit(0); } for(i=0;i M->maze[i]=(char *)malloc(sizeof(char)*COLUMN); M->footprint[i]=(int *)malloc(sizeof(int)*COLUMN); if(!M->maze[i]||!M->footprint[i]){ printf("申请空间失败,迷宫初始化失败.\n"); return ERROR; exit(0); } } for(i=0;i for(j=0;j M->maze[i][j]=mz[i][j]; M->footprint[i][j]=0; } } M->row=ROW; M->column=COLUMN; return OK; } Status DestroyStack(SqStack *S){ if(!S) { printf("指针为空,释放失败.\n"); exit(0); } free(S); return OK; } Status ClearStack(SqStack *S){ if(!S) return FALSE; S->top=S->base; return OK; } Status StackEmpty(SqStack S){ if(S.top==S.base) return TRUE; else return FALSE; } int StackLength(SqStack S){ return S.stacksize; } Status GetTop(SqStack S,SElemType *e){ if(S.top==S.base){ printf("栈为空.\n"); return FALSE; }else{ *e=*(S.top-1); printf("栈顶元素:%c\n",*e); return OK; } } Status Push(SqStack *S,SElemType e){ if(S->top-S->base>=S->stacksize){ S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S->base) { printf("重新申请空间失败.\n"); exit(0); } S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *S->top++=e; return OK; } Status Pop(SqStack *S,SElemType *e){ if(S->top==S->base){//栈为空 printf("栈为空.\n"); return ERROR; } *e=*(--S->top); return OK; } Status StackTraverse(const SqStack *S){ //从栈底到栈顶依次对每个元素进行访问 SElemType *p=S->base; if(S->base==S->top) { printf("栈为空.\n"); return FALSE; } printf("栈中元素:"); while(p!=S->top) { printf("x=%d,y=%d\n",p->seat.x,p->seat.y); *p++; } printf("\n"); return OK; } Status PrintMaze(MazeType *M){ //输出迷宫 int i,j; for(i=0;irow;i++){ for(j=0;jcolumn;j++){ printf("%c",M->maze[i][j]); } printf("\n"); } printf("\n"); return OK; } Status PrintFoot(MazeType *M,SqStack *S){ //输出迷宫的路径 int i,j; SElemType *p; for(i=0;irow;i++){ for(j=0;jcolumn;j++){ M->footprint[i][j]=0; } } p=S->base; if(S->base==S->top) { printf("栈为空.\n"); return FALSE; } while(p!=S->top) { M->footprint[p->seat.x][p->seat.y]=1; *p++; } for(i=0;irow;i++){ for(j=0;jcolumn;j++){ printf("%d",M->footprint[i][j]); } printf("\n"); } return OK; } Status MazePath(SqStack *S,MazeType maze,PosType start,PosType end){ int curstep=1;//当前步数 SElemType e; PosType curpos=start;//当前位置 InitStack(S);//初始化栈 do{ if(TRUE==Pass(&maze,curpos)){ FootPrint(&maze,curpos); e=NewSElem(curstep,curpos,1); Push(S,e); if((curpos.x==end.x)&&(curpos.y==end.y)){//到达终点(出口) printf("迷宫路径:\n"); //StackTraverse(S); PrintFoot(&maze,S); return TRUE; } curpos=NextPos(curpos,1); curstep++; }//if else{//当前位置不能通过 if(!StackEmpty(*S)){ Pop(S,&e); while(e.di==4&&!StackEmpty(*S)){ MarkPrint(&maze,e.seat); Pop(S,&e); }//while if(e.di<4){ e.di++; Push(S,e); curpos=NextPos(e.seat,e.di); }//if }//if }//else //PrintFoot(&maze,S); }while(!StackEmpty(*S));//一直循环到栈空为止 return FALSE; } Status FootPrint(MazeType *M,PosType pos){ //将迷宫的当前位置pos设置为"走过",即footprint该位置为1 if((pos.x>M->row)||(pos.y>M->column))//检验大小 return FALSE; M->footprint[pos.x][pos.y]=1;//如果不满足条件,开始运行下一步 return TRUE; } Status Pass(MazeType *M,PosType pos){ //判断当前位置是否可通,即为走过的通道块 if((M->rowcolumn printf("位置越位.\n"); exit(0); } if((0==M->footprint[pos.x][pos.y])&&(M->maze[pos.x][pos.y]==' ')) return TRUE; else return FALSE; } SElemType NewSElem(int step,PosType pos,int d){ //创建新结点,用step,pos,d初始化该结点 SElemType e; e.ord=step; e.seat=pos; e.di=d; return e;//下一步 } PosType NextPos(PosType pos,int d){ //获取pos位置d方向的位置 switch(d){ case 1://东 pos.x++; break; case 2://南 pos.y++; break; case 3://西 pos.x--; break; case 4://北 pos.y--; break; default: printf("位置编号出错.\n"); }//利用坐标左西右东上北下南 return pos; } Status MarkPrint(MazeType *M,PosType pos){ //将迷宫M的pos位置,设为已走,成功返回OK;否则返回ERROR if(pos.x>M->row||pos.y>M->column){ printf("所要标记位置越位.\n"); return ERROR; } M->footprint[pos.x][pos.y]=1; return OK; }
C++ ImageRotate的一些问题
从网上找了一个CImage的旋转函数,但是好像在读取一些图片的时候会出错, 哪位大神知道问题出在哪里呢? ``` //------图像旋转 //参数:源图像 目标图像 旋转度(alpha = angle * 3.14 / 180) //using method: CImage *dest = new CImage;ImageRotate(src,dest,alpha); //算法:邻近点算法 void ImageRotate(CImage *Imgm, CImage *Imgn, double alpha) { int ww, Dx, Dy, bpd; double centerx, centery, sintheta, costheta; double X1, Y1, X2, Y2, theta, xx, yy, rr; BYTE **list, *sc, *lp; int x, y; //Dx获取宽度 Dx=Imgm->GetWidth(); //Dy获取高度 Dy=Imgm->GetHeight(); sc=(BYTE*)malloc(2*(Dx*Imgm->GetBPP()+31)/32*4); //申请工作单元 list=(BYTE**)malloc(Dy*sizeof(BYTE*)); //对原位图建立二维数组 //list中保存的是每一个高度像素的地址 for (int i=0;i<Dy;i++) { list[i]=(BYTE*)Imgm->GetPixelAddress(0, i); } //计算位图中心位置 centerx=Dx/2.0+0.5; centery=Dy/2.0+0.5; //计算对角线长度 rr=sqrt(centerx*centerx+centery*centery); //反正切 theta=atan(centery/centerx); //求图像边缘长度 X1=fabs(rr*cos(alpha+theta))+0.5; Y1=fabs(rr*sin(alpha+theta))+0.5; X2=fabs(rr*cos(alpha-theta))+0.5; Y2=fabs(rr*sin(alpha-theta))+0.5; //得外接矩形宽度 哪条边长就用哪个长度 if (X2>X1) X1 = X2; //外接矩形高度 if (Y2>Y1) Y1 = Y2; //图片的像素值 ww=(int)(2 * X1); Imgn->Destroy(); //建立结果位图 Imgn->Create(ww,(int)(2*Y1),Imgm->GetBPP()); bpd = Imgm->GetBPP()/8; sintheta = sin(alpha); costheta = cos(alpha); for (int j=(int)(centery-Y1),Yd=0;j<=(centery + Y1);j++,Yd++) { //256色位图像素行置背景值 if (Imgm->GetBPP()==8) memset(sc,255,ww); //真彩色位图像素行置背景值 else memset(sc,255,ww*bpd); for (int i=(int)(centerx-X1),Xd=0;i<=centerx+X1;i++,Xd+=bpd) { xx=centerx+costheta*(i-centerx)+sintheta*(j-centery); yy=centery-sintheta*(i-centerx)+costheta*(j-centery); x=(int)(xx+0.5); y=(int)(yy+0.5); if (x<0||x>= Imgm->GetWidth()||y<0||y>=Imgm->GetHeight()) continue; if(x==Imgm->GetWidth()) x--; if(y==Imgm->GetHeight()) y--; memcpy(&sc[Xd],&list[y][x*bpd],bpd); //从源位图复制像素数据 } lp=(BYTE*)Imgn->GetPixelAddress(0,Yd); //处理结果总结果位图 memcpy(lp,sc,ww*bpd); } free(list); //释放工作单元 free(sc); } ``` 已知在读取某些bmp和png图像时函数会挂掉。。
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
MyBatis研习录(01)——MyBatis概述与入门
C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往——自定义View系列教程(10篇) 走出思维困境,踏上精进之路——Android开发进阶精华录 讲给Android程序员看的前端系列教程(40集免费视频教程+源码) 版权声明 本文原创作者:谷哥的小弟 作者博客
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
web前端javascript+jquery知识点总结
Javascript javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ,语法同java类似,是一种解释性语言,边执行边解释。 JavaScript的组成: ECMAScipt 用于描述: 语法,变量和数据类型,运算符,逻辑控制语句,关键字保留字,对象。 浏览器对象模型(Br
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。 2月6日追记:本文发布后,腾讯的数据源多次变更u
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
渗透测试-灰鸽子远控木马
木马概述 灰鸽子( Huigezi),原本该软件适用于公司和家庭管理,其功能十分强大,不但能监视摄像头、键盘记录、监控桌面、文件操作等。还提供了黑客专用功能,如:伪装系统图标、随意更换启动项名称和表述、随意更换端口、运行后自删除、毫无提示安装等,并采用反弹链接这种缺陷设计,使得使用者拥有最高权限,一经破解即无法控制。最终导致被黑客恶意使用。原作者的灰鸽子被定义为是一款集多种控制方式于一体的木马程序
Python:爬取疫情每日数据
前言 有部分同学留言说为什么412,这是因为我代码里全国的cookies需要你自己打开浏览器更新好后替换,而且这个cookies大概只能持续20秒左右! 另外全国卫健委的数据格式一直在变,也有可能会导致爬取失败! 我现在已根据2月14日最新通报稿的格式修正了! 目前每天各大平台,如腾讯、今日头条都会更新疫情每日数据,他们的数据源都是一样的,主要都是通过各地的卫健委官网通报。 为什么已经有大量平台做
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
粒子群算法求解物流配送路线问题(python)
粒子群算法求解物流配送路线问题(python) 1.查找论文文献 找一篇物流配送路径优化+粒子群算法求解的论文 参考文献:基于混沌粒子群算法的物流配送路径优化 2.了解粒子群算法的原理 讲解通俗易懂,有数学实例的博文:https://blog.csdn.net/daaikuaichuan/article/details/81382794 3.确定编码方式和解码策略 3.1编码方式 物流配送路线的
教你如何编写第一个简单的爬虫
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。 下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。 第一步:获取页面 #!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang.
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
情人节来了,教你个用 Python 表白的技巧
作者:@明哥 公众号:Python编程时光 2020年,这个看起来如此浪漫的年份,你还是一个人吗? 难不成我还能是一条狗? 18年的时候,写过一篇介绍如何使用 Python 来表白的文章。 虽然创意和使用效果都不错,但有一缺点,这是那个exe文件,女神需要打开电脑,才有可能参与进来,进而被你成功"调戏”。 由于是很早期的文章了,应该有很多人没有看过。 没有看过的,你可以点击这里查看:用Pyt...
用Python开发实用程序 – 计算器
作者:隋顺意 一段时间前,自己制作了一个库 “sui-math”。这其实是math的翻版。做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于计算器,很多复杂的计算都离不开它。我们使用过各式各样的计算器,无论是电脑自带的,还是网也上的计算器,却都没有自己动手编写属于自己计算器。今天就让我们走进计算器的世界,用python来编写...
经典算法(19)教你两分钟学会【选择排序】
这篇博客使用图文并茂的方式讲解选择排序算法,并有完整的算法逻辑以及代码实现。
Python学习笔记(语法篇)
本篇博客大部分内容摘自埃里克·马瑟斯所著的《Python编程:从入门到实战》(入门类书籍),采用举例的方式进行知识点提要 关于Python学习书籍推荐文章 《学习Python必备的8本书》 Python语法特点: 通过缩进进行语句组织 不需要变量或参数的声明 冒号 1 变量和简单数据结构 1.1 变量命名 只能包含字母、数字和下划线,且不能以数字打头。 1.2 字符串 在Python中,用引号...
用Python打造你的专属情人节贺卡,赶快发给TA浪漫一下吧
明天就是情人节了。这个情人节,注定是一个不能约会的情人节,但不能约会不代表不能浪漫。古人比我们出生早,那些浪漫的诗词早都被他们挖掘一空,比诗词我们肯定没有机会了。好在我们还有Python,不然都不知道该如何表达浪漫。接下来,浪导教你制作一个浪漫的情人节专属贺卡。
Python绘图与可视化
文章目录使用的库Matplotlib程序包绘图命令的扩展及其属性设置 使用的库 Python有很多可视化工具,如:Matplotlib。 Matplotlib是一种2D的绘图库,它可以支持硬拷贝和跨系统的交互,它可以在Python脚本、IPython的交互环境下、Web应用程序中使用。如果结合使用一种GUI工具包(如IPython),Matplotlib还具有诸如缩放和平移等交互功能。它不仅支持各...
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问