C#如何通过指针获取数据? 5C
unsafe void ads(object sender, EventArgs e)
{
    int res;
    fixed (int* p = &res)
    {
        mob mb = new mob();
        mb.mobile = "11255455687";

        //调用c++编写的dll文件接口,传入指针,然后得到返回的数据指针地址res
        PDDCodeSend(drv, JsonConvert.SerializeObject(mb), p);
    }
}

求问如何通过 res 获取指针指向的数据?

c#

1个回答

res = *p;
和C语言一样的

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复lonesea2013: 那么你传StringBuilder作为参数,而不是int *
9 个月之前 回复
lonesea2013
lonesea2013 不好意思,我比较小白。。没有c的基础,想知道的是 res 存的是一个整数型的指针地址,如何通过这个地址把数据取出来,里面存的是一段dll处理过的json
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c语言调用动态库中的函数,不能获取返回值,但C#可以,不知c代码该如何改进?vs2017环境下。
c语言: typedef char * (__stdcall *MYPROC)(char * s, char * rs);//函数原型,s:传入数据,rs:返回数据。 HINSTANCE hinstLib; MYPROC send; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; WCHAR msg[] = L"{\"head\":{\"jylsh\":\"330199103576000000000000001811\",\"xxlxm\":\"C009\",\"fhsj\":\"\",\"xxfhm\":\"\",\"fhxx\":\"\",\"yytcq\":\"330799\",\"zdjbh\":\"Test11111\",\"yljgdm\":\"8095\",\"czydm\":\"\",\"bbh\":\"1.0\"},\"data\":{\"ksjgs\":{\"klb\":\"12\",\"knsj\":\"A30533169330799D1560000050009A4378127B360\"}}}"; wprintf(L"%s", msg); WCHAR P[] = L""; char oututfmsg[1024] = { 0 }; WCHAR outmsg[2048] = { 0 }; char utfmsg[10240] = { 0 }; unicode_to_utf8((short *)msg, utfmsg); hinstLib = LoadLibrary(TEXT("SendRcvB.dll")); if (hinstLib != NULL) { printf("begin GetProcAddres\n"); send = (MYPROC)GetProcAddress(hinstLib, "SendRcv"); if (NULL != send) { char * rcode = send(utfmsg, oututfmsg);//调试发现oututfmsg调用前后未发生变化 fRunTimeLinkSuccess = TRUE; } wprintf(L"%s", oututfmsg); fFreeResult = FreeLibrary(hinstLib); } c#代码如下: [DllImport("SendRcvB.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.StdCall)] private extern static IntPtr SendRcv(IntPtr sSend, out IntPtr sRcv); public Main() { InitializeComponent(); } private void btn_fs_Click(object sender, EventArgs e) { try { string sRcv, sRs; string sIn = rTextIn.Text; byte[] tmpIn = gbkToUft8(sIn); IntPtr pIn = mallocIntptr(tmpIn.Length); Marshal.Copy(tmpIn, 0, pIn, tmpIn.Length); //IntPtr pIn = mallocIntptr(sIn); IntPtr pOut = IntPtr.Zero; IntPtr pRs = IntPtr.Zero; pRs = SendRcv(pIn, out pOut);//pOut指针在变化,能指向返回数据 sRcv = Marshal.PtrToStringUni(pOut); sRs = Marshal.PtrToStringAnsi(pRs); sRcv = utf8ToGbk(sRcv); rTextOut.Text = sRcv; Marshal.FreeHGlobal(pIn); } catch (Exception oe) { MessageBox.Show(oe.Message); }
C# 将byte[]转化为灰度图片
想要将存在byte[]信号强度数据转换成灰度图片,现在用下面这种方法,总是出现内存操作 错误,请大牛来为我解惑~~不胜感谢! public static Bitmap ToGrayBitmap(Int16[] rawValues, int width, int height) { //// 申请目标位图的变量,并将其内存区域锁定 Bitmap bmp = new Bitmap(width, height,PixelFormat.Format16bppRgb565); Rectangle newbmp = new Rectangle(0, 0, width, height); BitmapData bmpData = bmp.LockBits((newbmp),ImageLockMode.WriteOnly, PixelFormat.Format16bppRgb565); //// 获取图像参数 int stride = bmpData.Stride; // 扫描线的宽度 int offset = stride - width; // 显示宽度与扫描线宽度的间隙 int scanBytes = stride * height; // 用stride宽度,表示这是内存区域的大小 IntPtr iptr = bmpData.Scan0; // 获取bmpData的内存起始位置 //// 下面把原始的显示大小字节数组转换为内存中实际存放的字节数组 int posScan = 0, posReal = 0;// 分别设置两个位置指针,指向源数组和目标数组 Int16[] pixelValues = new Int16[scanBytes]; //为目标数组分配内存 for (int x = 0; x < height; x++) { //// 下面的循环节是模拟行扫描 for (int y = 0; y < width; y++) { pixelValues[posScan++] = rawValues[posReal++]; } posScan += offset; //行扫描结束,要将目标位置指针移过那段“间隙” } //// 用Marshal的Copy方法,将刚才得到的内存字节数组复制到BitmapData中 Marshal.Copy(pixelValues, 0, iptr, scanBytes); bmp.UnlockBits(bmpData); return bmp; }
关于C语言指针相加问题
代码: # include<stdio.h> main(){ int a , *p; a = 3 ; p = &a ; int *q = p + 1; printf("p is %d",p); printf("q is %d",q); printf("*q is %d",*q); } 运行结果: p is 2293308q is 2293312*q is 2293312 -------------------------------- Process exited after 0.1425 seconds with return value 13 请按任意键继续. . . 我的理解是:变量P存储了指针a。而变量q是指针+指针,也就是说,变量q是加的是a地址后面的那个变量,至于这个变量值是多少,我不知道,可能是一个有效值,也可能是一个垃圾值,我在第三个输出的时候是*q。也就是说把这个有效值或者垃圾只输出,但是实际电脑运行的结果是地址,那么我的问题是:*运算符不是获取数据运算符吗?
C语言指针内存分配相关问题,求大神指导。。。
这里有两段程序,基本上是一样的。都是使用链表来实现队列。这里实现了出队和入队操作。第一段程序能够正确执行,但是第二段程序不可以,原因是rear和front总是相同的,所以输出的都是-1。我检查了一下,发现每一次rear改变会是的front同时改变。这是为什么?第一段程序通过一个结构体传递rear和front确可以,这是为什么?是通过结构体构建了二级指针吗?求大牛。。。我都快绕晕了,好几次遇到这个问题了。。。 能够正确执行的程序: ``` #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; }Node; typedef struct Q { Node *front; Node *rear; }Q; void push(Q*q, int e) { Node *node = (Node*)malloc(sizeof(Node)); //分配空间 node->data = e; //数据域 node->next = NULL; //指针域 q->rear->next = node; //添加到末尾 q->rear = node; //更新尾指针 } int pop(Q* q) { if (q->front == q->rear) return -1; Node *t = q->front->next; //获取队首元素 int e = t->data; //获取队首数据域 q->front->next = t->next; //更新队首指针 if (t == q->front) //如果队首与队尾相同,则将队尾指针指向队首 q->rear = q->front; free(t); //释放 return e; //返回队首数据域 } int main() { Q queue; queue.rear = (Node*)malloc(sizeof(Node)); queue.front = queue.rear; push(&queue, 1); push(&queue, 2); push(&queue, 3); int k = pop(&queue); printf("%d\n", k); k = pop(&queue); printf("%d\n", k); k = pop(&queue); printf("%d\n", k); return 0; } ``` 不能够正确执行的: ``` #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; }Node; void push(Node* rear, int e) { Node *node = (Node*)malloc(sizeof(Node)); //分配空间 node->data = e; //数据域 node->next = NULL; //指针域 rear->next = node; //添加到末尾 rear = node; //更新尾指针 } int pop(Node* rear, Node* front) { if (front == rear) return -1; Node *t = front->next; //获取队首元素 int e = t->data; //获取队首数据域 front->next = t->next; //更新队首指针 if (t == front) //如果队首与队尾相同,则将队尾指针指向队首 rear = front; free(t); //释放 return e; //返回队首数据域 } int main() { Node *rear = (Node*)malloc(sizeof(Node)); Node *front = rear; push(rear, 1); push(rear, 2); push(rear, 3); int k = pop(rear,front); printf("%d\n", k); k = pop(rear, front); printf("%d\n", k); k = pop(rear, front); printf("%d\n", k); return 0; } ```
MFC中view和Doc类关系中,在view里成功获取文档类指针,但是指针下的所有自设成员变量值为什么为空?
#### 如题,在某一次调试之前一切正常,上述问题不发生,而且可以保证源码正确。在其他地方写完代码调试后,从某一次开始突然出错,原因我只能定向到上述问题。在恢复了最后一次正确代码时,错误仍然不消散,重装vs2010无效,换用vs2017无效,重启无效......也就是之前没有的问题在同样情况下(至少表面目测),诡异地出现。能救救我...甚至我用完全没被我改动过的以前绝对能正常运行的初始代码都会出现这个问题。 ``` void CSDIC04View::OnDraw(CDC* pDC) { CSDIC04Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);//能通过 if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 CPen myPen; myPen.CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); CPen * pOldPen = pDC->SelectObject(&myPen); TRACE("从这里开始有问题%d\n",pDoc->m_ptx[0]); } ``` #### 比如说,这里trace一个文档里的变量,结果是随机初始化值。后边我需要用到这些变量的,变量为空让我很为难,后边导致报错触发中断。而且,以前在oninitialupdate里能够打断点调试,现在会直接跳过。oninitialupdate里也有类似的获取指针再获取变量以完成初始化的操作,同样根据变量和自动窗口发现变量为空。
学习C语言版数据结构(严蔚敏版)时,按位获取单链表的值失败,怎么解决。
#include <stdlib.h> #include <stdio.h> typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode, *LinkList; void createList(LinkList L, int n); int getElem(LinkList L, int i, ElemType *e); int main(){ LinkList L; createList(L, 4); ElemType *e; getElem(L, 2, e); printf("%d", e); return 0; } void createList(LinkList L, int n){ LinkList head, p, q; int i, a; head = NULL;//头指针初始为空 for(i=1; i<=n; i++){ scanf("%d",&a); p=(LinkList)malloc(sizeof(struct LNode)); p->data=a;//将数据存储到当前结点的data域中 p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空 if(head==NULL) head=p; else q->next=p; q=p; }//for }//createList int getElem(LinkList L, int i, ElemType *e){ LinkList p; int j = 1; p = L->next; while(p && j<i){ p = p->next; ++j; } if(!p || j>i) return -1; e = p->data; return 0; } ``` ``` 报错:48 4 F:\数据结构\作业\p29_2.8.c[Warning] assignment makes pointer from integer without a cast 输入: 1 2 3 4 输出:
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; } ```
在php中使用sql游标select将数据存入数组中
#这个用于处理游标到达最后一行的情况 DECLARE s int default 0; #声明游标cursor_name(cursor_name是个多行结果集) DECLARE cursor_name CURSOR FOR select NNF_ID,NNF_NAME,NNF_REALNAME,NNF_NOTICE_ID from t_notice_file; #设置一个终止标记 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1; #打开游标 OPEN cursor_name; #获取游标当前指针的记录,读取一行数据并传给变量a,b fetch cursor_name into a,b,c,d; #开始循环,判断是否游标已经到达了最后作为循环条件 while s <> 1 do insert into t_ehdnotice_file(id,name,original_name,create_time,ehdnotice_id,path) values(a,b,c,now(),d,'2014-04\\15'); #读取下一行的数据 fetch cursor_name into a,b,c,d; end while; #关闭游标 CLOSE cursor_name ; #语句执行结束 END 网上找到这段SQL使用游标的代码,不知道如何将读取的数据存入php数组中。 请大神赐教
两个窗口穿参数,指针数据丢失
在头文件里面声明了一个 struct Param { BITMAPINFO *pinfo; BYTE *pbit; DWORD h; DWORD w; };结构体 程序绝大部分如下 #include "stdafx.h" #include <windows.h> #include <windowsx.h> #include "resource.h" #include "MainDlg.h" #include "SHOWDLG.h" #include <stdio.h> #include <commdlg.h> BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); } return FALSE; } BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND chuli=GetDlgItem(hwnd,IDC_chuli); ComboBox_InsertString(chuli,-1,TEXT("傅里叶变换")); ComboBox_InsertString(chuli,-1,TEXT("什么二值化")); ComboBox_InsertString(chuli,-1,TEXT("获取边缘梯度图像")); ComboBox_InsertString(chuli,-1,TEXT("还有什么阈值")); return TRUE; } void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { HWND chuli=GetDlgItem(hwnd,IDC_chuli); int n; OPENFILENAME ofn; char szFile[MAX_PATH]; DWORD m_nHeight, m_nWidth; HWND h_static=GetDlgItem(hwnd,IDC_s); HDC hdc_static=GetDC(h_static); Param params; switch(id) { case IDC_OK://为什么不能开同一张图片两次? { ZeroMemory(&ofn,sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0BMP\0*.bmp\0JPG\0*.jpg"); ofn.lpstrFile = szFile; ofn.lpstrFile[0] = TEXT('\0');//艹,不加这一句还打不开,不明所以 ofn.nFilterIndex = 3; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.hwndOwner = hwnd; ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if(GetOpenFileName(&ofn)) { if(3==ofn.nFilterIndex) { MessageBox(hwnd,ofn.lpstrFile,TEXT("问好"),MB_OK); HANDLE Hbmp=CreateFile(ofn.lpstrFile,GENERIC_READ |GENERIC_WRITE, 0, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); HANDLE m_Hbmp=CreateFileMapping(Hbmp,NULL,PAGE_READWRITE,0,0x1400000,TEXT("maptest")); if( INVALID_HANDLE_VALUE==m_Hbmp) { MessageBox(hwnd,TEXT("映像创建失败"),TEXT("error"),MB_OK); return; } LPVOID lpBase = MapViewOfFile(m_Hbmp, FILE_MAP_ALL_ACCESS, 0, 0, 0); //params = lpBase; BITMAPFILEHEADER *pFileHeader; BITMAPINFO *pInfoHeader; pFileHeader = (BITMAPFILEHEADER*)lpBase; BYTE *pBits = (BYTE*)lpBase + pFileHeader->bfOffBits; pInfoHeader = (BITMAPINFO*)((BYTE*)lpBase + sizeof(BITMAPFILEHEADER)); m_nHeight = pInfoHeader->bmiHeader.biHeight; m_nWidth = pInfoHeader->bmiHeader.biWidth; HBITMAP hBitmap = CreateCompatibleBitmap(hdc_static, m_nWidth, m_nHeight); SelectObject(hdc_static, hBitmap); params.w = m_nWidth; params.h = m_nHeight; params.pinfo = pInfoHeader;//结构体指针的赋值有问题 params.pbit = pBits; int nRet = SetDIBitsToDevice(hdc_static,0,0,m_nWidth,m_nHeight,0,0,0,m_nHeight,pBits,pInfoHeader,DIB_RGB_COLORS); InvalidateRect((HWND)Hbmp, NULL, TRUE); DeleteObject(hBitmap); ReleaseDC(hwnd,hdc_static); //UnmapViewOfFile(lpBase); CloseHandle(m_Hbmp); } } } break; case IDC_DOIT: { n=ComboBox_GetCurSel(chuli); HINSTANCE hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); while(n<0) { MessageBox(hwnd,TEXT("请选择处理方式"),TEXT("提示"),MB_OKCANCEL); break; } if(n<0) { break; } switch(n) { //LPARAM *par; //par=(long*)&params; case 0: { DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,(long)&params); MessageBox(NULL,TEXT("傅里叶变换"),TEXT("你选择了"),MB_OK); } break; case 1: { MessageBox(NULL,TEXT("什么二值化"),TEXT("你选择了"),MB_OK); DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,300); } break; case 2: { MessageBox(NULL,TEXT("获取边缘梯度图像"),TEXT("你选择了"),MB_OK); DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,300); } break; case 3: { MessageBox(NULL,TEXT("还有什么阈值"),TEXT("你选择了"),MB_OK); DialogBoxParam(hinstance,MAKEINTRESOURCE(IDD_SHOWDLG),NULL,SHOWDLG_Proc,300); } break; default: break; } } break; default: break; } } void Main_OnClose(HWND hwnd) { EndDialog(hwnd, 0); } 然后在另一个窗口函数里面 BOOL SHOWDLG_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { Param * pa = (Param*)lParam ;//DC没有问题,传进来的指针指的地方不对 SetDIBitsToDevice(h_sdc,0,0,pa->w,pa->h,0,0,0,pa->h,pa->pbit,pa->pinfo,DIB_RGB_COLORS); return TRUE; } 调试发现在红色标记语句执行后params里面的数据丢失(之前调试看的数据都正常),这句UnmapViewOfFile(lpBase);不释放就好了,但是传递给另一个窗口的时候结构体里面的数据就全没了,定义全局变量也没用,现在想做的就是在两个窗口里面都显示同一个图片,以后再做图像处理,小弟都是自学的,MFC不太熟悉,想请各位大神指教一下,感激不尽!
使用Marshal.SizeOf(typeof(Brcomm.S_BR_FILE_INFO))获取大小调试失败
各位大家好,C#调用c++ Dll调试出错,希望大家能帮助我,急。。。。。谢谢 Dll中的原数据结构 注意:如下的结构必须以1 字节为单位对齐。请在自己使用的开发语言中注意对结构进行修饰。 struct S_BR_DATETIME { unsigned char cYear, cMonth, cDate; unsigned char cHour, cMin, cSec; }; struct S_BR_FILE_INFO {    unsigned int iFileLength; //文件长度    unsigned int iFileNo; //文件号    char szFileName[32]; //文件名    S_BR_DATETIME stCreateDateTime; //文件被创建的时间    S_BR_DATETIME stModifyDateTime; //文件被修改的时间 }; c#引用如下 [StructLayout(LayoutKind.Sequential)] public struct S_BR_DATETIME { public byte cYear; public byte cMonth; public byte cDate; public byte cHour; public byte cMin; public byte cSec; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct S_BR_FILE_INFO { public UInt32 iFileLength; public UInt32 iFileNo; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public string szFileName; [MarshalAs(UnmanagedType.LPStruct)] public S_BR_DATETIME stCreateDateTime; //对于结构体中的指针数组,一般采用IntPtr数组 [MarshalAs(UnmanagedType.LPStruct)] public S_BR_DATETIME stModifyDateTime; //对于结构体中的指针数组,一般采用IntPtr数组 } 使用Marshal.SizeOf(typeof(Brcomm.S_BR_FILE_INFO))获取大小调试失败 提示“类型“SeriaportEXR.Brcomm+S_BR_FILE_INFO”不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。” 怎么解决类,急。。。。
opencv实现边缘梯度直方图+meanshift实现框选物体跟踪,代码出错,不知道错在哪里?
``` #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/core/core.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<ctype.h> using namespace std; using namespace cv; Mat image; //当前帧图像 Mat imageCopy; //用于拷贝的当前帧图像 Mat rectImage; //子图像 Point beginPoint; //矩形框起点 Point endPoint; //矩形框终点 bool leftButtonDownFlag = false; //左键单击后视频暂停播放的标志位 int frameCount = 0; //帧数统计 int trackCount = 0; //等于1时初始化直方图 void onMouse(int event, int x, int y, int flags, void* ustc); //鼠标回调函数 int main(int argc, char* argv[]) { VideoCapture capture("1.AVI"); //VideoCapture capture(0); int capture_fps = capture.get(CV_CAP_PROP_FPS); //获取视频帧率 int capture_count = capture.get(CV_CAP_PROP_FRAME_COUNT); int capture_width = capture.get(CV_CAP_PROP_FRAME_WIDTH); int capture_height = capture.get(CV_CAP_PROP_FRAME_HEIGHT); cout << "视频帧率:" << capture_fps << endl; cout << "视频帧数:" << capture_count << endl; cout << "视频宽度:" << capture_width << endl; cout << "视频高度:" << capture_height << endl; int pauseTime = 1000 / capture_fps; //两幅画面中间间隔 namedWindow("Video"); setMouseCallback("Video", onMouse);//函数setMousecallback用于鼠标在图上做标记等作用 int hbinNum = 16;//每一维上直方图的个数,如果是一维直方图,就是竖条(bin)的个数 float hranges[] = { 40, 250 };//每一维数值的取值范围数组 const float* phranges = hranges;//const修饰phranges指针,指针phranges的指向可以修改,但是phranges指向的值不可以改;指针phranges指向的是hranges的首地址 bool backprojectMode = false; namedWindow("Video", 0); capture >> image; int rows = image.rows; int cols = image.cols; Mat image1 = image.clone(); Mat dst, edge, gray;//定义canny边缘检测所需的变量 Mat abs_grad_x, abs_grad_y;//定义sobel算子求方向梯度所需的变量 Mat grad_x(rows, cols, CV_8UC1, Scalar::all(0));//定义sobel算子求方向梯度所需的变量 Mat grad_y(rows, cols, CV_8UC1, Scalar::all(0));//定义sobel算子求方向梯度所需的变量 Mat theta(rows, cols, CV_32FC1, Scalar::all(0)); Mat gradient(rows, cols, CV_32FC1, Scalar::all(0));//梯度矩阵 Mat angle(rows, cols, CV_32FC1, Scalar::all(0));//梯度方向角度 Mat mask, hist, histImg = Mat::zeros(image.size(), image.type()), backproj;//初始化histImg存储直方图数据,使其规格与捕获的image相同 Rect trackWindow;//定义一个捕捉矩形窗口 //**********************读取视频******************************** while (true) { if (!leftButtonDownFlag) //鼠标左键按下绘制矩形时,视频暂停播放 { capture >> image;//读取当前帧 frameCount++; //帧数增加,视频向前增加 } if (!image.data || waitKey(pauseTime + 30) == 27) //当当前帧的数据为空或两帧画面的时间间隔不满足规定的数值时,退出播放 { break; } //***************camshiftdemo代码的脉络分析******************** //提取边缘梯度大小与幅值 if (trackCount > 0) { dst.create(image1.size(), image1.type()); dst = Scalar::all(0); cvtColor(image1, gray, COLOR_BGR2GRAY); GaussianBlur(gray, edge, Size(3, 3), 0, 0); Canny(edge, edge, 3, 9, 3);//canny算子获得边缘图 Sobel(gray, grad_x, CV_16S,1, 0, 3, 1, 1);//求X方向的梯度 Sobel(gray, grad_y, CV_16S,0, 1, 3, 1, 1);//求Y方向的梯度 cartToPolar(grad_x, grad_y, gradient, angle);//计算梯度方向与梯度幅值 convertScaleAbs(grad_x, grad_x); convertScaleAbs(grad_y, grad_y); //绘制直方图 if (trackCount == 1) { histImg = Scalar::all(0); Mat roi(angle, Rect(beginPoint, endPoint)), maskroi(mask, Rect(beginPoint, endPoint)); calcHist(&roi, 1, 0, maskroi, hist, 1, &hbinNum, &phranges);//掩膜maskroi是用来确定输入图像的哪些像素被计数;mask也设置ROI, 是要让hue中截取出来放在mask中的 区域大小位置都和hue中一致, 不要改变原来的位置这点很有用。 normalize(hist, hist, 0, 255, CV_MINMAX); trackCount++; trackWindow = Rect(beginPoint, endPoint); } calcBackProject(&angle, 1, 0, hist, backproj, &phranges);//直方图反向投影 backproj &= mask; meanShift(backproj, trackWindow, TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1));//CamshiftDemo //***画出跟踪区域的位置 if (backprojectMode) { cvtColor(backproj, image, CV_GRAY2BGR); } rectangle(image, Point(trackWindow.x, trackWindow.y), Point(trackWindow.x + trackWindow.width, trackWindow.y + trackWindow.height), Scalar(0, 0, 255), 1, CV_AA);//画跟踪矩形框 trackCount++; // writer << image; } imshow("Video", image); } waitKey(0); return 0; } //鼠标回调函数 void onMouse(int event, int x, int y, int flags, void *ustc) { if (event == CV_EVENT_LBUTTONDOWN) { leftButtonDownFlag = true; //标志位 beginPoint = Point(x, y); //设置左键按下点的矩形起点 endPoint = beginPoint; } if (event == CV_EVENT_MOUSEMOVE && leftButtonDownFlag) { imageCopy = image.clone(); endPoint = Point(x, y); if (beginPoint != endPoint) { //在复制的图像上绘制矩形 rectangle(imageCopy, beginPoint, endPoint, Scalar(0, 0, 255), 2); } imshow("Video", imageCopy); } if (event == CV_EVENT_LBUTTONUP) { leftButtonDownFlag = false; Mat subImage = image(Rect(beginPoint, endPoint)); //子图像 rectImage = subImage.clone(); trackCount = 1; //imshow("Sub Image", rectImage); } } ```
关于MFC从SQL Server 2008向DB2导数据的问题!
目前刚接触这些东西,憋得脑袋都大了。 ~~~导师都下催命书了...T_T 描述:两台服务器,一台是SQL,一台是DB2,把SQL中的一个表的数据导入DB2中已经建好的一张表中。我建了两个数据库类,一个是CSQL,一个是CDB2。 CDB2类代码: void CDB2::OnInitDB2Conn() { ::CoInitialize(NULL); m_pConnection.CreateInstance(__uuidof(Connection)); _bstr_t strConn = "Provider=IBMDADB2.DB2COPY1;Persist Security Info=False;User ID=db2admin;Data Source=BSMPWS1;Location="";Extended Properties="""; m_pConnection->Open(strConn,"db2admin","db2admin",adModeUnknown); } _RecordsetPtr & CDB2::GetRecordSet(_bstr_t strSQL) { if(m_pConnection == NULL) OnInitDB2Conn(); m_pRecordset.CreateInstance(__uuidof(Recordset)); //初始化Recordset指针 m_pRecordset->Open(strSQL,m_pConnection.GetInterfacePtr(), adOpenDynamic,adLockOptimistic,adCmdText); return m_pRecordset; } BOOL CDB2::ExecuteSQL(_bstr_t strSQL) { _variant_t RecordsAffected; if(m_pConnection==NULL) OnInitDB2Conn(); m_pConnection->Execute(strSQL,NULL,adCmdText); return true; } CSQL类同上 Dlg类中导数据部分: void CDatabaseDlg::OnBtnCopy() { CSQL sqlCopy; sqlCopy.OnInitSQLConn(); CDB2 db2Copy; db2Copy.OnInitDB2Conn(); _bstr_t DB2_delete = "delete * from bs_info_gather"; //清空DB2数据库表中的数据 db2Copy.ExecuteSQL(DB2_delete); _bstr_t SQL_AGENCY = "select * from bs_agency"; _RecordsetPtr agency_pRecordset; agency_pRecordset = sqlCopy.GetRecordSet(SQL_AGENCY); //打开并获取SQL的bs_agency记录集 _bstr_t DB2_AGENCY = "select * from bs_info_gather"; _RecordsetPtr db2_pRecordset; db2_pRecordset = db2Copy.GetRecordSet(DB2_AGENCY); //打开并获取DB2数据集 try { while(agency_pRecordset->adoEOF==0) { db2_pRecordset->AddNew(); ##############################1 //将SQL中AGENCY_TITLE字段数据传到DB2中BS_TITLE里 _bstr_t an1 = agency_pRecordset->GetCollect("AGENCY_TITLE"); db2_pRecordset->PutCollect("BS_TITLE",an1); _bstr_t an2 = agency_pRecordset->GetCollect("AGENCY_CONTENT"); db2_pRecordset->PutCollect("BS_CONTENT",an2); ... ... db2_pRecordset->MoveNext(); } db2_pRecordset->Update(); } ..... } 调试时在########1处抛出“当前记录集不支持更新。这可能是提供程序的限制,也可能是选定锁定类型的限制。”麻烦帮我分析分析哪里出问题了。
修改程序:信源编解码(c语言)
修改程序:问题1。源文件source文本空间太长汉字太多无法运行2,未按频度要求排序 问题描述: 信源编解码是通信系统的重要组成部分。本实验旨在通过程序设计实现基于哈夫曼编码的信源编解码算法。程序具备以下功能: 对于给定的源文档 SourceDoc.txt, 1) 统计其中所有字符的频度(某字符的频度等于其出现的总次数除以总字符数) , 包括字母(区分大小写) 、标点符号及格式控制符(空格、回车等) 。 2) 按频度统计结果生成哈夫曼编码码表。 3) 基于哈夫曼码表进行编码,生成对应的二进制码流,并输出到文件 Encode.dat。 4) 对二进制码流进行哈夫曼解码,把结果输出到文件 DecodeDoc.txt。 5) 判断DecodeDoc.txt与SourceDoc.txt内容是否一致,以 验证编解码系统的正确性。 要求: 1) 用 C 语言实现。 2) 用子函数实现各功能模块。 3) 输出文件 Statistic.txt,包含的信息有:按频度大小排序的字符表,及各字符出现 的次数、频度及哈夫曼编码。 4) 应至少包含链表、二叉树的数据结构。 5) 不能用冒泡排序算法。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #define N 10000 int count = 0; //每增加一个新的字符, count增加1, 可表示a中的字符种类数, 也即哈夫曼树叶子点个数 /*定义哈夫曼树结构体*/ typedef struct HuffmanTree{ int weight; int parent; int Lchild; int Rchild; }HuffmanTree[2*N]; /*定义储存字符及其出现次数的结构体*/ typedef struct DifferentCharacter{ char char_date; int num; //相同字符出现的次数 char a_code[100]; //每种字符对应的编码 }difcha[N]; /*在一定范围内选择两个weight最小的结点, 并将两个结点的序号赋给s1, s2*/ void select_two(HuffmanTree ht, int j, int *s1, int *s2) { int i = 1, temp; int min1 = 0, min2 = 0; while( (ht[i].parent != 0) && (i <= j) ) i++; *s1 = i; min1 = ht[i++].weight; while( (ht[i].parent != 0) && (i <= j) ) i++; *s2 = i; min2 = ht[i++].weight; if(min1 > min2){ temp = min1; min1 = min2; min2 = temp; } for(; i <= j; i++){ //遍历parent不为0的结点 if(ht[i].parent != 0) continue; if(ht[i].weight <= min1){ min2 = min1; min1 = ht[i].weight; *s2 = *s1; *s1 = i; } else if( (ht[i].weight < min2) && (ht[i].weight > min1) ) { min2 = ht[i].weight; *s2 = i; } } } /*建哈夫曼树*/ void EstHuffmanTree(HuffmanTree ht, int *w, int n){ int i; int s1 = 0, s2 = 0; for(i = 1; i <= n; i++){ //初始化哈夫曼树, 前n个单元存放叶子点 ht[i].weight = w[i]; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ //后n-1个单元存放非叶子点 ht[i].weight = 0; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ select_two(ht, i-1, &s1, &s2); //创建非叶子点, 建立哈夫曼树, 每次在ht[1]~ht[i-1]范围内选两个最小的weight结点,并将其序号赋给s1, s2 ht[i].weight = ht[s1].weight + ht[s2].weight; ht[i].Lchild = s1; ht[i].Rchild = s2; ht[s1].parent = i; ht[s2].parent = i; } //哈夫曼树建立完毕 } /*求哈弗曼编码*/ void CrtHuffmanCode(HuffmanTree ht, char **hcd, int n){ int start = 0, c = 0, p = 0, i; char *cd = (char*)malloc(n*sizeof(char)); //分配求当前编码的工作空间 cd[n-1] = '\0'; //从左向右存放编码 for(i = 1; i <= n; i++) { start = n-1; //初始化编码起始指针 c = i; p = ht[i].parent; while(p != 0){ start--; if(ht[p].Lchild == c) cd[start] = '0'; //左分支标0 else cd[start] = '1'; //右分支标1 c = p; //向上倒推 p = ht[c].parent; } hcd[i] = (char*)malloc((n-start)*sizeof(char)); strcpy(hcd[i], &cd[start]); } free(cd); } /*自定义错误处理函数*/ void my_err(char *err_string, int line){ printf("Line %d:\n", line); perror(err_string); exit(1); } /*从 buf_read 中统计每个字符出现的次数,将次数作为该字符的权值*/ void Statistics(difcha a, char *buf_read){ int i, j = 0; for(i = 0; i < strlen(buf_read) ; i++){ //对buf_read中的字符遍历 for(j = 0; j < count; j++){ //检查是否是新的字符 if(a[j].char_date == buf_read[i]){ a[j].num++; //若是旧字符, 则num++; break; } } if(j == count){ //若是新字符, 则记录到a中, 且对应的num++ a[count].char_date = buf_read[i]; a[count].num++; count++; //更新count } } } /*从 SourceDoc.txt 读取数据到 buf_read */ void ReadFile(char *pathName, char *buf_read){ int fd_date; int len = 0; if( (fd_date = open(pathName, O_RDWR)) < 0) //以读写方式打开SourceDoc.txt文件 my_err("open SourceDoc.txt", __LINE__); if(lseek(fd_date, 0, SEEK_END) < 0) //获取文件长度,并保持文件读写指针在文件开始处 my_err("lseek", __LINE__); if( (len = lseek(fd_date, 0, SEEK_CUR)) < 0 ) my_err("lseek", __LINE__); if(lseek(fd_date, 0, SEEK_SET) < 0) my_err("lseek", __LINE__); if(read(fd_date, buf_read, len) > len) //从SourceDoc.txt中读取内容 my_err("read SourceDoc.txt", __LINE__); } /*将 buf_code 写入 Encode.dat 中*/ void WriteFile(char *pathName, char *buf_code){ int fd_code; if((fd_code = open(pathName, O_CREAT|O_TRUNC|O_RDWR, S_IRWXU)) < 0) //创建Encode.dat文件 my_err("open Encode.dat", __LINE__); if( write(fd_code, buf_code, strlen(buf_code)) != strlen(buf_code) ) //将 buf_code 写入Encode.dat my_err("write Encode.dat", __LINE__); } /*主函数*/ void main(){ char buf_read[N] = {'\0'}; char buf_code[N] = {'\0'}; char buf_yima[N] = {'\0'}; char *hcd[N]; char temp[50] = {'\0'}; difcha a; int i, j, n, k = 0, m = 0; int w[N] = {0}; HuffmanTree ht; ReadFile("SourceDoc.txt", buf_read); Statistics(a, buf_read); for(i = 0; i < count; i++) w[i+1] = a[i].num; EstHuffmanTree(ht, w, count); //建HuffmanTree CrtHuffmanCode(ht, hcd, count); //对树中字符进行编码 for(i = 1; i <= count; i++) //将每个字符对应的编码存入结构体 a 中 strcpy(a[i-1].a_code, hcd[i]); FILE *fp1; fp1=fopen("Statistic.txt","w"); for(i = 0; i < count; i++) //查看每个字符的权值和对应的编码 fprintf(fp1,"%c %d %s\n", a[i].char_date, a[i].num, a[i].a_code); fclose(fp1); for(i = 0; i < strlen(buf_read) ; i++){ //遍历 buf_read, 给 SourceDoc.txt 中每个字符匹配编码, 存入 buf_code 中 for(j = 0; j < count; j++){ if(buf_read[i] == a[j].char_date){ strcat(buf_code, a[j].a_code); break; } } if(j == count) //匹配异常 printf("Unknown Character: %c\n", buf_read[i]); } WriteFile("Encode.dat", buf_code); //将 buf_code 写入 Encode.dat 中 ReadFile("Encode.dat", buf_read); //从 Encode.dat 中读取全部编码 n = strlen(buf_read); for(i = 0; i < n; i++){ //为 Encode.dat 中的编码匹配字符 temp[k++] = buf_read[i]; for(j = 0; j < count; j++){ if(strcmp(temp, a[j].a_code) == 0){ buf_yima[m++] = a[j].char_date; break; } } if(j < count){ //匹配成功, 对 temp 初始化 for(;k > 0; k--) temp[k] = '\0'; } } FILE *fp2; fp2=fopen("DecodeDoc.txt","w"); fprintf(fp2,"%s", buf_yima); fclose(fp2); }
静态链表为什么实现不了数据反转,哪里错了,具体的代码如何实现?
``` //vc6.0实现的C++版 //功能:静态链表实现线性表的基本功能 #include <iostream.h>//读入必须包含的头文件 #include <windows.h>//清屏和颜色设置需要 #include <iomanip.h> enum returninfo{success,fail,overflow,underflow,range_error};//定义返回信息清单 #define NULLP -1//静态链表的空地址模拟 const int MAXSIZE=10;//静态链表的总空间大小 class node { public: int data;//数据域 int next;//指针域 }; /* 定义一个线性表类staticlinklist */ class staticlinklist { private: node dataarray[MAXSIZE];//定义静态链表的数组 int freep,headp;//freep管理空闲空间,headp管理实际线性表空间 int count;//计数器 统计结点个数即线性表的长度 public: staticlinklist();//构造函数 ~staticlinklist();//析构函数 int getnewnode(void);//申请一个新的可用空间 returninfo create(int number);//静态链表的初始化 bool empty(void) const;//判断是否空链 int size(void) const;//求静态链表的长度 void deletenode(int position);//把某个空间地址归还给空闲空间 returninfo traverse(void);//遍历静态链表所有元素 returninfo retrieve(int position,int &item) const;//读取一个结点 returninfo replace(int position,const int &item);//修改一个结点 returninfo insert(int position,const int &item);//插入一个结点 returninfo remove(int position);//删除一个结点 returninfo invertlist(void);//静态链表所有数据反转 void showinfo(void);//显示静态链表相关信息 }; staticlinklist::staticlinklist()//构造函数 { //静态链表初始化,约定开始时地址域为从小到大顺序挂链,最后一个为NULLP(即-1) int i; for(i=0;i<MAXSIZE;i++) dataarray[i].next=i+1; dataarray[MAXSIZE-1].next=-1; freep=0;//设置空闲区的指针 count=0;//计数器清零,表明开始时没有实际数据 headp=NULLP; } staticlinklist::~staticlinklist()//析构函数 { } staticlinklist::getnewnode(void) { int tempaddress;//定义一个临时地址指针 tempaddress=freep;//保存目前可用空间的第一个地址 freep=dataarray[freep].next;//可用空间头指针后移 return tempaddress; } returninfo staticlinklist::create(int number)//静态链表的初始化 { int tempaddress,tempp; cout<<"请依次输入数据(用空格隔开):"; for(int i=1;i<=number;i++) { tempaddress=getnewnode(); cin>>dataarray[tempaddress].data; dataarray[tempaddress].next=NULLP; count++; if(i==1)//挂第一个结点 { headp=tempaddress; tempp=headp; } else//挂其他结点 { dataarray[tempp].next=tempaddress; tempp=tempaddress; } } return success; } bool staticlinklist::empty(void) const//判断是否空链 { if(headp==NULLP) return true; else return false; } int staticlinklist::size(void) const//求静态链表的长度 { return count; } void staticlinklist::deletenode(int position) { dataarray[position].next=freep; freep=position; } returninfo staticlinklist::traverse(void)//遍历静态链表中的所有元素 { int searchp;//启用搜索指针 if(empty()) return underflow;//空表的处理 searchp=headp; cout<<"静态链表中的全部数据为:Headp->";//提示显示数据开始 while(searchp!=NULLP)//循环显示所有数据 { cout<<"["<<dataarray[searchp].data; if(dataarray[searchp].next==NULLP) cout<<"|^]"; else cout<<"|-]->"; searchp=dataarray[searchp].next; } cout<<endl;//最后有一个回车的控制 return success;//本次操作成功 } returninfo staticlinklist::retrieve(int position,int &item) const//读取一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp;//定义搜索指针,初始化 for(int i=1;i<position&&searchp!=NULLP;i++)//提示:注意小于号 searchp=dataarray[searchp].next;//顺序访问方式,用循环,算法复杂度是O(n) item=dataarray[searchp].data;//返回读取的数据 return success;//本次操作成功 } returninfo staticlinklist::replace(int position,const int &item)//修改一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp;//定义搜索指针,初始化 for(int i=1;i<position&&searchp!=NULLP;i++)//提示:注意小于号 searchp=dataarray[searchp].next;//顺序访问方式,用循环,算法复杂度是O(n) dataarray[searchp].data=item;//实际修改数据的语句 return success;//本次操作成功 } returninfo staticlinklist::insert(int position,const int &item)//插入一个结点 { if(position<=0||position>=count+2) //处理意外,范围不正确 return range_error; int newnodep,searchp=headp,followp=NULLP; newnodep=getnewnode();//此处需要申请新的一个可用空间,地址赋给newnodep if(newnodep==NULLP) return overflow; dataarray[newnodep].data=item;//给数据赋值 if(position==1) { dataarray[newnodep].next=headp; headp=newnodep; count++; return success; } for(int i=1;i<position&&searchp!=NULLP;i++)//以下为查找插入位置 { followp=searchp; searchp=dataarray[searchp].next; } //以下开始修改链表,完成插入数据 dataarray[newnodep].next=dataarray[followp].next;//注意此处的次序相关性 dataarray[followp].next=newnodep; count++;//计数器加1 return success; } returninfo staticlinklist::remove(int position)//删除一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp,followp=NULLP;//这里两个指针的初始值设计一前一后 if(position==1) { searchp=headp; headp=dataarray[headp].next; deletenode(searchp);//释放该结点空间 count--;//计数器减1 return success; } for(int i=1;i<position&&searchp!=NULLP;i++) { followp=searchp; searchp=dataarray[searchp].next; } dataarray[followp].next=dataarray[searchp].next;//删除结点的实际语句 deletenode(searchp);//释放该结点 count--;//计数器减1 return success; } returninfo staticlinklist::invertlist(void)//静态链表所有数据反转 { int nowp,midp,lastp;//启用多个辅助指针 if(empty()) return underflow; nowp=dataarray[headp].next; midp=NULLP; while(nowp!=NULLP) { lastp=midp; midp=nowp; nowp=dataarray[nowp].next; dataarray[midp].next=lastp; } dataarray[headp].next=midp; return success; } void staticlinklist::showinfo(void)//显示静态链表相关信息 { int searchp; cout<<"目前静态链表总空间:"<<setw(3)<<MAXSIZE<<"地址为(0--"<<MAXSIZE-1<<")"<<endl; cout<<"其中自由空间大小为:"<<setw(3)<<MAXSIZE-count<<"编号为:"; searchp=freep; while(searchp!=NULLP) { cout<<" "<<searchp; searchp=dataarray[searchp].next; } cout<<endl; cout<<"线性表的已用空间为:"<<setw(3)<<count<<"编号为:"; searchp=headp; while(searchp!=NULLP) { cout<<" "<<searchp; searchp=dataarray[searchp].next; } cout<<endl; } /* 定义一个实现静态链表功能的菜单处理类interfacebase */ class interfacebase { private: staticlinklist listonface; public: void clearscreen(void);//清屏 void showmenu(void);//显示菜单函数 int userchoice(void);//用户的选项 returninfo processmenu(int menuchoice);//菜单函数 }; void interfacebase::clearscreen(void) { system("cls"); } void interfacebase::showmenu(void) { cout<<"静态链表基本功能菜单"<<endl; cout<<"=================="<<endl; cout<<"1.输入数据(键盘输入)"<<endl; cout<<"2.显示数据(遍历全部数据)"<<endl; cout<<"3.修改数据(要提供位置和新值)"<<endl; cout<<"4.插入数据(要提供位置和新值)"<<endl; cout<<"5.删除数据(要提供位置)"<<endl; cout<<"6.读取数据(要提供位置)"<<endl; cout<<"7.求表长度"<<endl; cout<<"8.数据反转(全部数据逆序存储)"<<endl; cout<<"9.静态链表相关信息"<<endl; cout<<"0.退出程序"<<endl; cout<<"=================="<<endl; } int interfacebase::userchoice(void) { int menuchoice; cout<<"请输入您的选择:"; cin>>menuchoice; return menuchoice; } returninfo interfacebase::processmenu(int menuchoice) { int position,item,returnvalue; switch(menuchoice)//根据用户的选择进行相应的操作 { case 1: cout<<"请问你要输入数据的个数,注意要在"<<MAXSIZE<<"个以内:"; cin>>item; if(item>MAXSIZE) cout<<"对不起,输入数据超限,操作已取消!请按任意键继续..."<<endl; else { returnvalue=listonface.create(item); if(returnvalue==success) cout<<"建立静态链表操作成功!请按任意键继续..."<<endl; } break; case 2: returnvalue=listonface.traverse(); if(returnvalue==underflow) cout<<"静态链表目前为空,没有数据可以显示!请按任意键继续..."<<endl; else cout<<"静态链表遍历操作成功!请按任意键继续..."<<endl; break; case 3: cout<<"请输入要修改数据的位置:"; cin>>position; cout<<"请输入要修改的新数据:"; cin>>item; returnvalue=listonface.replace(position,item); if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续..."<<endl; else if(returnvalue==range_error) cout<<"对不起,修改的位置超出了范围!请按任意键继续..."<<endl; else cout<<"修改操作成功!请按任意键继续..."<<endl; break; case 4: cout<<"请输入要插入数据的位置:"; cin>>position; cout<<"请输入要插入的新数据:"; cin>>item; returnvalue=listonface.insert(position,item);//注意这个位置的参数 if(returnvalue==overflow) cout<<"对不起,静态链表溢出,无法插入新数据!请按任意键继续..."<<endl; else if(returnvalue==range_error) cout<<"对不起,插入的位置超出了范围!请按任意键继续..."<<endl; else cout<<"插入操作成功!请按任意键继续..."<<endl; break; case 5: cout<<"请输入要删除数据的位置:"; cin>>position; returnvalue=listonface.remove(position);//注意这个位置的参数 if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续......"<<endl; else if(returnvalue==range_error) cout<<"对不起,删除的位置超出了范围!请按任意键继续..."<<endl; else cout<<"删除操作成功!请按任意键继续..."<<endl; break; case 6: cout<<"请输入要读取数据的位置:"; cin>>position; returnvalue=listonface.retrieve(position,item); if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续......"<<endl; else if(returnvalue==range_error) cout<<"对不起,读取的位置超出了范围!请按任意键继续..."<<endl; else cout<<"读取的数据为:"<<item<<endl<<"读取操作成功!请按任意键继续..."<<endl; break; case 7: cout<<"静态链表目前的长度为:"<<listonface.size()<<endl; cout<<"求静态链表长度操作成功!请按任意键继续..."<<endl; break; case 8: returnvalue=listonface.invertlist(); if(returnvalue==underflow) cout<<"对不起,链表已空!请按任意键继续......"<<endl; else cout<<"链表所有元素反转操作成功!请按任意键继续..."<<endl; break; case 9: listonface.showinfo(); break; case 0: exit(0); default: cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl; break; } return success; } /* 程序主入口 */ void main(void) { int menuchoice;//定义变量,菜单选单项的选择 interfacebase interfacenow; staticlinklist linklistnow; system("color f0");//修改屏幕的背景色和字的颜色 interfacenow.clearscreen();//清屏 while(1)//永真循环 { interfacenow.showmenu();//显示菜单 menuchoice=interfacenow.userchoice();//获取用户的选择 interfacenow.processmenu(menuchoice);//处理用户的选择 system("pause");//暂停 interfacenow.clearscreen();//清屏 } }//主函数结束 ```
为什么函数中的L*new报错,后面的p->next=new也不行?
![图片说明](https://img-ask.csdn.net/upload/201911/27/1574842402_80124.png) ![图片说明](https://img-ask.csdn.net/upload/201911/27/1574842280_696087.png) 为什么VS2019上报错? #include"1.h" typedef struct slist { int id; struct slist* next; }L; //创建一个节点 L* create_node(int data) { //给每个节点分配结构体一样的空间大小 L* p = (L*)malloc(sizeof(L)); if (NULL == p) { printf("malloc error!\n"); return NULL; } //由于结构体在未初始化的时候一样是脏数据,所以要清 memset(p, 0, sizeof(L)); //初始化第一个节点 p->id = data; //将节点的后继指针设置为NULL p->next = NULL; } //链表的尾插 void tail_insert(L* pH, L*new) { //获取当前的位置 L* p = pH; //如果当前位置的下一个节点不为空 while (NULL != p->next) { //移动到下一个节点 p = p->next; } //如果跳出以上循环,所以已经到了NULL的这个位置 //此时直接把新插入的节点赋值给NULL这个位置 p->next =new; }
未声明标识符?强制转化也不行
#include "stdafx.h" #include "afxmt.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "Porject1.h" #endif #include "Porject1Doc.h" #include "Porject1View.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CPorject1View IMPLEMENT_DYNCREATE(CPorject1View, CFormView) BEGIN_MESSAGE_MAP(CPorject1View, CFormView) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() ON_BN_CLICKED(IDC_DATA_LINE, &CPorject1View::OnDataLine) ON_BN_CLICKED(IDC_END_DATA_LINE, &CPorject1View::OnEndThread) ON_WM_PAINT() ON_STN_CLICKED(IDC_DATA_ON_TIME, &CPorject1View::OnDataOnTime) ON_STN_CLICKED(IDC_DATA_ON_TIME_thread, &CPorject1View::OnStnClickedDataOnTimethread) END_MESSAGE_MAP() // CPorject1View 构造/析构 CPorject1View::CPorject1View() : CFormView(CPorject1View::IDD) { // TODO: 在此处添加构造代码 } CPorject1View::~CPorject1View() { } void CPorject1View::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); } BOOL CPorject1View::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CFormView::PreCreateWindow(cs); } void CPorject1View::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } void CPorject1View::OnRButtonUp(UINT /* nFlags */, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void CPorject1View::OnContextMenu(CWnd* /* pWnd */, CPoint point) { #ifndef SHARED_HANDLERS theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif } // CPorject1View 诊断 #ifdef _DEBUG void CPorject1View::AssertValid() const { CFormView::AssertValid(); } void CPorject1View::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } CPorject1Doc* CPorject1View::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPorject1Doc))); return (CPorject1Doc*)m_pDocument; } #endif //_DEBUG // CPorject1View 消息处理程序 CEvent EndPaintLine;//用来控制绘制线程结束的事件 POINT polyLine[31];//存放动态数据曲线数据值的数组 DWORD pLinePoints;//当前需绘制曲线的点数 int TimeSpan_GetData;//绘制动态曲线的时间间隔,具体系统中可在界面上加一微调按钮调整 CBrush * pBrushBlack = new CBrush; void CPorject1View::OnDataLine() { // TODO: 在此添加控件通知处理程序代码 //启动工作线程并画出绘制动态曲线的子窗口的背景矩形框 CWnd*pWnd = GetDlgItem(IDC_DATA_ON_TIME_thread); //获取绘制曲线文本框窗口指针 CDC * pDC = pWnd->GetDC(); CGdiObject * pOldBursh = pDC->SelectObject(pBrushBlack); pDC->Rectangle(0, 0, 300, 200); //用黑色绘制显示动态数据曲线的子窗口 pDC->SelectObject(pOldBursh); CWinThread * pThreadDataOnTime = AfxBeginThread(DataLineThread,(LPVOID )GetSafeHwnd(), THREAD_PRIORITY_NORMAL); } void CPorject1View::OnEndThread() { // TODO: 在此添加控件通知处理程序代码 EndPaintLine.SetEvent(); } void CPorject1View::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CFormView::OnPaint() CWnd * pWnd = GetDlgItem(IDC_DATA_ON_TIME_thread); //获取绘制曲线的文本框指针 pWnd->Invalidate(); pWnd->UpdateWindow(); CDC * pDC = pWnd->GetDC(); CGdiObject * pOldBrush = pDC->SelectObject(pBrushBlack); pDC->Rectangle(0, 0, 300, 200); //绘制图曲线的矩形区域 pDC->SelectObject(pOldBrush); } void CPorject1View::OnDataOnTime() { // TODO: 在此添加控件通知处理程序代码 } UINT DataLineThread(LPVOID lp) { CPen * pPenGreen = new CPen; CPen * pPenBlack = new CPen; CPen * pPenBKcolor = new CPen; CPen * pPenRed = new CPen; CPen * pPenBlue = new CPen; CBrush * pBrushBlack = new CBrush; pPenRed->CreatePen(PS_DOT, 1, RGB(255, 0, 0)); pPenBlue->CreatePen(PS_DOT, 1, RGB(10, 150, 255)); pPenBlack->CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); pPenGreen->CreatePen(PS_SOLID, 1, RGB(0, 255, 0)); pPenBKcolor->CreatePen(PS_SOLID, 1, RGB(190, 190, 190)); pBrushBlack->CreateSolidBrush(RGB(0, 0, 0)); CWnd * pMainWnd = AfxGetMainWnd(); CWnd * pClient = pMainWnd->GetWindow(GW_CHILD); CWnd * pData = pClient->GetDlgItem(IDC_DATA_ON_TIME_thread); CDC * pDC = pData->GetDC(); BOOL runThread = TRUE; while (runThread) { CWnd * pWnd =pClient-> GetDlgItem(IDC_DATA_ON_TIME); CDC * pDC = pWnd->GetDC(); CGdiObject * pOldPen = pDC->SelectObject(pPenBlue); static int count_T = 0; pDC->SetBkColor(RGB(0, 0, 0)); for (int i = 0; i <= 30; i += 5) { if (300 - 10 * (i + count_T) >= 0) { pDC->MoveTo(300 - 10 * (i + count_T), 200); pDC->LineTo(300 - 10 * (i + count_T), 0); if ((i + count_T - 1) >= 0) { CGdiObject * pPenT = pDC->SelectObject(pPenBlack); pDC->MoveTo(300 - 10 * (i + count_T - 1), 200); pDC->LineTo(300 - 10 * (i + count_T - 1), 0); pDC->SelectObject(pPenT); } } pDC->SelectObject(pOldPen); count_T++; if (count_T == 5) count_T = 0; char tm[20]; _strtime(tm); pDC->SetBkColor(RGB(190, 190, 190)); pDC->TextOut(280, 205,_T("tm")); for (i = 0; i <= 20; i += 5) { pOldPen = pDC->SelectObject(pPenRed); pDC->SetBkColor(RGB(0, 0, 0)); pDC->MoveTo(0, i * 10); pDC->LineTo(300, i * 10); pDC->SelectObject(pOldPen); } if (pLinePoints >= 2) { pOldPen = pDC->SelectObject(pPenBlack); pDC->Polyline(polyLine, pLinePoints); pDC->SelectObject(pOldPen); } static int col = 0; int m_OnData; char mC[40]; if (col < 31) { for (int j = 0; j <= col; j++) polyLine[j].x = 300 - (col - j) * 10; m_OnData = rand()%200; polyLine[col].y = m_OnData; col++; pLinePoints++; } else { pLinePoints = 31; for (int t = 0; t < 30; t++) polyLine[t].y = polyLine[t + 1].y; m_OnData = rand()%200; polyLine[30].y = m_OnData; } itoa(m_OnData, mC, 10); pDC->SetBkColor(RGB(190, 190, 190)); pDC->TextOut(310, 35, _T("实时数据")); if (pLinePoints >= 2) { pOldPen = pDC->SelectObject(pPenGreen); pDC->Polyline(polyLine, pLinePoints); pDC->SetTextColor(RGB(0, 0, 0)); pDC->SelectObject(pOldPen); } int retCode = ::WaitForSingleObject(EndPaintLine.m_hObject, 0); if (retCode == WAIT_OBJECT_0) runThread = FALSE; ::Sleep(TimeSpan_GetData); } delete pPenRed; delete pPenBlue; delete pPenGreen; delete pPenBlack; delete pPenBKcolor; delete pBrushBlack; return 0; } } void CPorject1View::OnStnClickedDataOnTimethread() { // TODO: 在此添加控件通知处理程序代码 } error C2065: “DataLineThread”: 未声明的标识符
Qt里面使用sqlite3连接成功,但是对数据库操作无响应
操作环境是 macOS, Qt 5.8 在代码外,我建好了 myData.db 数据库文件,已经进行了建表。我想把在ui 界面的输入框里面获得到的数据插入到数据库里面,但是运行后点击相关的插入按钮却插入不成功。 我是连上了数据库的,但是不能把获取到的数据插入到数据库,也没有报错什么的,不知道是否是我的数据库环境配置问题还是代码上忘了什么。请大家帮我看看,十分感谢。 这个是主页面的 cpp文件 ```c++ #include "MainWindow.h" #include "ui_MainWindow.h" #include "NextWindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //创建出新窗口 nextWin = new NextWindow; connect(ui->switchLabel, &MyLabel::clicked, [=](){ this->hide(); nextWin->show(); }); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_signUp_clicked() { //连接到数据库 // myData = QSqlDatabase::addDatabase("QSQLITE"); QSqlDatabase myData; if(QSqlDatabase::contains("qt_sql_default_connection")) { myData = QSqlDatabase::database("qt_sql_default_connection"); //判断一下 } else { myData = QSqlDatabase::addDatabase("QSQLITE"); } myData.setHostName("localhost"); myData.setUserName("Root"); myData.setPassword(""); myData.setDatabaseName("myData.db"); if(myData.open()) { qDebug() <<"数据库连接成功"<<endl; //取出创建的用户名,密码和手机号 QString signName = ui->signNameBtn->text(); QString signPassword = ui->signPassBtn->text(); QString signPhone = ui->signPhoneBtn->text(); //插入到数据库里面 QSqlQuery sql; sql.prepare("INSERT INTO users (userName, password, email)" "VALUES (:uerName, :password, :email)"); sql.bindValue(":userName", signName); //之前取出来的 Qstring的signName sql.bindValue(":password", signPassword); sql.bindValue(":email", signPhone); //数据库里面的第三个写的是邮箱,不好改,下次得注意 //提示数据插入成功没有 if(sql.exec()) { QMessageBox::information(this, "Successful", "Insert data successful"); }else { QMessageBox::information(this, "Not Inserted", "Data is not inserted "); } }else { QMessageBox::information(this, "Not connected", "database is not conntected"); } } ``` --- 头文件 ``` #include <QString> #include<QSqlQuery> #include <QDebug> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); //下个页面的指针 NextWindow* nextWin; private slots: void on_logInBtn_clicked(); //登录按钮 void on_signUp_clicked(); //注册按钮 private: Ui::MainWindow *ui; QSqlDatabase myData; }; #endif // MAINWINDOW_H ``` ![图片说明](https://img-ask.csdn.net/upload/201903/14/1552520451_927725.jpg) --- 我把错误打印出来了,`QSqlError("", "Parameter count mismatch", "")` 说是参数错误,我输出了一下从输入框获取的值,是成功的。所以应该是插入那一段代码有问题吧。但是我仔细看了一下我的数据文件,都是匹配的啊。。 ![图片说明](https://img-ask.csdn.net/upload/201903/14/1552548572_810358.jpg) ![图片说明](https://img-ask.csdn.net/upload/201903/14/1552548589_73200.jpg) ![图片说明](https://img-ask.csdn.net/upload/201903/14/1552548631_785784.jpg)
代码没有错误,为什么程序没运行完就直接结束了?
![图片说明](https://img-ask.csdn.net/upload/201908/08/1565246195_162168.png) ![图片说明](https://img-ask.csdn.net/upload/201908/08/1565246218_224284.png) ``` //主要功能:实现带小数二进制和十进制之间数据的转换 #include <iostream.h> #include <windows.h> #include <fstream.h> #include <string> #include <math.h> using namespace std; const int TAILMAXLENTH=10;//定义十进制转换成二进制小数部分最大位数 const int DABAMAXLENTH=40;//定义原始数据的最大长度 const double ADDMENBERNUM=111.11;//定义一个加数用于检测数据真实可用 /********************************************************************************************************* *栈的部分 *********************************************************************************************************/ class Stack;//类Stack的声明 /* 定义一个链栈结点类Stacknode */ class Stacknode { friend class Stack;//申请友元类 private: Stacknode(Stacknode *nextp=NULL);//构造函数 Stacknode(int &newdata,Stacknode *nextp=NULL);//构造函数 int data;//数据元素 Stacknode *next;//递归定义指向后继结点的指针 }; /* Stacknode的实现部分 */ Stacknode::Stacknode(Stacknode *nextp)//构造函数 { next=nextp; } Stacknode::Stacknode(int &newdata,Stacknode *nextp)//构造函数 { data=newdata; next=nextp; } //结点类Stacknode的定义结束 /* 定义一个链栈类Stack */ class Stack { public: Stack();//创建一个空栈 ~Stack();//回收一个栈 void clear();//销毁一个栈 bool empty() const;//确定栈是否已空 bool push(int &item);//把数据压进栈 bool pop();//出栈 bool top(int &item) const;//取出栈顶元素 private: Stacknode *newnode(Stacknode *nextp=NULL); Stacknode *newnode(int &item,Stacknode *nextp=NULL);//创建新的结点 Stacknode *Stacktop; int Stacklength; }; /* Stack的实现部分 */ Stacknode *Stack::newnode(Stacknode *nextp)//创建新的结点,不带数据 { return new Stacknode(nextp); } Stacknode *Stack::newnode(int &item,Stacknode *nextp)//创建新的结点,数据域赋值 { return new Stacknode(item,nextp); } //以下为栈类Stack的函数定义 Stack::Stack()//创建一个空栈 { Stacktop=newnode();//创建一个栈顶指针初始化,相当于Stacktop=NULL;本链表没有用头结点 Stacklength=0; } Stack::~Stack()//回收一个栈 { clear(); delete Stacktop;//释放栈底 } void Stack::clear()//销毁一个栈 { //while(pop());//不停地出栈,而每次释放空间在出栈函数中完成 Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点 while(Stacktop->next!=NULL) { usednodep=Stacktop;//指向出栈的结点 Stacktop=Stacktop->next;//栈顶指针后移 delete usednodep;//释放空间 } } bool Stack::empty() const//确定栈是否已空 { return Stacklength<=0?true:false; } bool Stack::push(int &item)//数据进栈 { Stacknode *newnodep;//定义指针newnodep,准备指向申请的新结点 newnodep=newnode(item,Stacktop);//申请新结点,把数据存入,把指针域指向头指针 if(!newnodep)//如果没有申请到空间,返回失败 return false; Stacktop=newnodep;//改链,完成进栈 Stacklength++;//栈的长度增加 return true;//本次操作成功 } bool Stack::pop()//出栈,不要栈顶数据 { Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点 if(!empty())//判断是否栈空 { usednodep=Stacktop;//指向出栈的结点 Stacktop=Stacktop->next;//栈顶指针后移 // delete usednodep;//释放空间 Stacklength--;//栈的长度减少 return true;//本次操作成功 } return false;//否则本次操作失败 } bool Stack::top(int &item) const//取出栈顶数据返回去 { if(!empty())//如果栈不空,记录当前栈顶元素 { item=Stacktop->data;//通过item返回去 return true;//本次操作成功 } return false;//否则本次操作失败 } /********************************************************************************************************* *队列的部分 *********************************************************************************************************/ /* 定义一个结点类node */ class node { public: int data; node *next; }; /* 定义一个链队类Queue */ class Queue { private: node *rear; node *front; protected: int count;//计数器,统计结点个数即线性队列的长度 public: Queue();//构造函数 ~Queue();//析构函数 void clear(void);//清空链队 bool empty(void) const;//判断是否空队 bool retrieve(int &item) const;//读取队头 bool append(const int &item);//数据入队 bool serve();//数据出队 }; /* 类Queue的实现部分 */ Queue::Queue()//构造函数 { front=new node;//申请新结点,作为队头结点 front->next=NULL; rear=front;//队尾指针指向队头 count=0;//计数器清零,队列开始时没有实际数据 } Queue::~Queue()//析构函数 { clear();//删除所有数据,释放所有结点 delete front;//把头结点也释放掉 count=0;//计数器清零,队列开始时没有实际数据 } void Queue::clear(void)//清空链队 { node *searchp=front->next,*followp=front;//初始化两个指针 while(searchp!=rear) { followp=searchp; searchp=searchp->next; delete followp; } front->next=NULL;//保留了最后一个结点,就是头结点,并且链域置为空 rear=front; count=0;//计数器也清零 } bool Queue::empty(void) const//判断是否空链 { return count==0?true:false; } bool Queue::retrieve(int &item) const//读取队头 { if(empty())//处理意外 return false; item=front->next->data;//返回读取的数据 return true;//本次操作成功 } bool Queue::append(const int &item)//进队 { node *newnodep=new node; newnodep->data=item;//给数据赋值 rear->next=newnodep;//这一步可以看出有头结点 rear=rear->next;//改动队尾指针的位置 count++;//计数器加1 return true; } bool Queue::serve()//出队 { if(empty())//空队处理 return false; node *tempp=front->next; // item=tempp->data;//保存数据 front->next=tempp->next;//改变指针 delete tempp;//释放该结点 count--;//计数器减1 return true; } /********************************************************************************************************* *定义一个功能类NumSysConversion *********************************************************************************************************/ class NumSysConversion { private: int inter; float floater; Stack *stack; Queue *queue; public: NumSysConversion();//构造函数 ~NumSysConversion();//析构函数 bool check(char *array,int number);//检查输入数据是否符合要求 void change(char *array,int number);//将原始数据转化成数值 double change_to_aim(int tokind);//将原始数据转化成目标进制的数据 }; NumSysConversion::NumSysConversion()//构造函数 { stack=new Stack; queue=new Queue; inter=0; floater=0; } NumSysConversion::~NumSysConversion()//析构函数 { delete stack; delete queue; } bool NumSysConversion::check(char *array,int number)//检查输入数据是否符合要求 { bool flag=true; for(int i=0;array[i]!='\0';i++) { cout<<array[i]; if(array[i]-48>=number) { flag=false; break; } } return flag; } void NumSysConversion::change(char *array,int number)//将原始数据转化成数值 { int flag=0,j=0; for(int i=0;array[i]!='\0';i++) { if(array[i]=='.') { flag=1; continue; } if(flag==0)//取整数数据 inter=inter*number+array[i]-48; if(flag==1)//取小数数据 floater+=(float)(((int)array[i]-48)*(float)pow(number,--j)); } } double NumSysConversion::change_to_aim(int tokind)//将原始数据转化成目标进制的数据 { int count=0,temp,flag=0,num; double resnumb=0; //第一步:先将整数部分转换进制后的数据依次入栈 while(inter) { num=inter%tokind; stack->push(num); inter/=tokind; } //第二步:再将小数部分转换进制后的数据依次入队 while(floater&&count<TAILMAXLENTH) { queue->append(int(floater*tokind)); floater*=tokind; if(floater>=1) floater-=(int)floater; count++; } //第三步:显示栈和队中的数据并将其转换成可用数据 cout<<"数据转换后为:"; while(!stack->empty()) { stack->top(temp); stack->pop(); cout<<temp; resnumb=resnumb*tokind+temp; flag=1; } if(!queue->empty()) { if(flag==0) cout<<"0"; cout<<"."; count=-1; } while(!queue->empty()) { queue->retrieve(temp); queue->serve(); cout<<temp; resnumb+=temp*pow(tokind,count--); } cout<<endl; //第四步:清空栈和队中的数据 stack->clear(); queue->clear(); inter=0; floater=0; //第五步:将可用数据信息返回 return resnumb; } /* 定义一个实现进制转换功能的菜单处理类interfacebase */ class interfacebase { private: NumSysConversion NumSysConversiononface; public: void clearscreen(void);//清屏 void showmenu(void);//显示菜单函数 int userchoice(void);//用户的选项 void processmenu(int menuchoice);//菜单函数 }; /* 类interfacebase的实现部分 */ void interfacebase::clearscreen(void) { system("cls"); } void interfacebase::showmenu(void) { cout<<"进制转换功能菜单"<<endl; cout<<"================"<<endl; cout<<"1.十进制转换为二进制"<<endl; cout<<"2.二进制转换为十进制"<<endl; cout<<"0.结束程序"<<endl; cout<<"================"<<endl; } int interfacebase::userchoice(void) { int menuchoice; cout<<"请输入您的选择:"; cin>>menuchoice; return menuchoice; } void interfacebase::processmenu(int menuchoice) { switch(menuchoice)//根据用户的选择进行相应的操作 { case 1: { char array[10]={'0','.','1','2','5'}; int number=10; if(NumSysConversiononface.check(array,number)) cout<<"符合要求!"<<endl; else cout<<"不符合要求!"<<endl; NumSysConversiononface.change(array,number); cout<<NumSysConversiononface.change_to_aim(2)<<endl; cout<<"进制转换成功!"<<endl; } break; case 2: { char array[10]={'1','1','1','1'}; int number=2; if(NumSysConversiononface.check(array,number)) cout<<"符合要求!"<<endl; else cout<<"不符合要求!"<<endl; NumSysConversiononface.change(array,number); cout<<NumSysConversiononface.change_to_aim(10)<<endl; cout<<"进制转换成功!"<<endl; } break; case 0: exit(0); default: cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl; break; } } /* 程序主入口 */ void main(void) { int menuchoice;//定义变量,菜单选单项的选择 interfacebase interfacenow; system("color f0");//修改屏幕的背景色和字的颜色 interfacenow.clearscreen();//清屏 while(1)//永真循环 { interfacenow.showmenu();//显示菜单 menuchoice=interfacenow.userchoice();//获取用户的选择 interfacenow.processmenu(menuchoice);//处理用户的选择 system("pause");//暂停 interfacenow.clearscreen();//清屏 } }//主函数结束 ```
Spring mvc 空指针错误
LoginController ``` @Controller public class LoginController { @RequestMapping("test") public void login() { LoginServiceImp loginService = new LoginServiceImp(); loginService.loadUserInfo(); } } ``` LoginServiceImp ``` public class LoginServiceImp implements ILoginService { LoginDaoImp loginDao = new LoginDaoImp(); /* * (non-Javadoc) * * @see * com.sani.service.ILoginService#loadUserInfo(com.sani.bean.UserInfoBean) */ public List loadUserInfo() { return loginDao.loadUserInfo(); } } ``` LoginDaoImp ``` public class LoginDaoImp extends BaseDao implements ILoginDao { /* * (non-Javadoc) * * @see com.sani.dao.ILoginDao#loadUserInfo() */ public List<UserInfoBean> loadUserInfo() { String sql = "select NOW();"; List tmpList = this.getJdbcTemplate().queryForList(sql); System.out.println(tmpList.size()); return tmpList; } } ``` BaseDao ``` public class BaseDao extends JdbcDaoSupport { Logger log = Logger.getLogger(this.getClass().getName()); } ``` web.xml ``` <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 字符编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- 应用上下文配置文件 --> <!-- Spring 容器加载 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-db.xml</param-value> </context-param> <!-- 配置spring核心servlet --> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- url-pattern配置为/,不带文件后缀,会造成其它静态文件(js,css等)不能访问。如配为*.do,则不影响静态文件的访问 --> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- 欢迎页面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> ``` spring-servlet.xml ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射--> <mvc:annotation-driven /> <!-- 允许对静态资源文件的访问 --> <mvc:default-servlet-handler /> <!-- 启动包扫描功能,以便注册带有@Controller、@Service、@repository、@Component等注解的类成为spring的bean --> <context:component-scan base-package="com.sani.controller" /> <context:component-scan base-package="com.sani.service" /> <context:component-scan base-package="com.sani.dao" /> <!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 --> <!-- jsp视图解析器 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> <property name="order" value="1" /> </bean> </beans> ``` spring-db.xml ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:task="http://www.springframework.org/schema/task" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd" default-autowire="byName"> <!-- <context:property-placeholder location="classpath:jdbc.properties" /> --> <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" lazy-init="false"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/wms" /> <property name="user" value="root" /> <property name="password" value="123" /> <!--连接池中保留的最小连接数。 --> <property name="minPoolSize"> <value>5</value> </property> <!--连接池中保留的最大连接数。Default: 15 --> <property name="maxPoolSize"> <value>30</value> </property> <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize"> <value>10</value> </property> <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime"> <value>60</value> </property> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement"> <value>5</value> </property> <!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --> <property name="maxStatements"> <value>0</value> </property> <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod"> <value>60</value> </property> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAttempts"> <value>30</value> </property> <!-- 获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false --> <property name="breakAfterAcquireFailure"> <value>true</value> </property> <!-- 因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。Default: false --> <property name="testConnectionOnCheckout"> <value>false</value> </property> </bean> <!-- 配置Jdbc模板 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" lazy-init="false"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="baseDAO" class="com.sani.dao.imp.BaseDao" lazy-init="false"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean> </beans> ``` 现在只要调用action—test就会空指针 是什么原因?应该这么改?
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
这30个CSS选择器,你必须熟记(上)
关注前端达人,与你共同进步CSS的魅力就是让我们前端工程师像设计师一样进行网页的设计,我们能轻而易举的改变颜色、布局、制作出漂亮的影音效果等等,我们只需要改几行代码,不需...
国产开源API网关项目进入Apache孵化器:APISIX
点击蓝色“程序猿DD”关注我回复“资源”获取独家整理的学习资料!近日,又有一个开源项目加入了这个Java开源界大名鼎鼎的Apache基金会,开始进行孵化器。项目名称:AP...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
编写Spring MVC控制器的14个技巧
本期目录 1.使用@Controller构造型 2.实现控制器接口 3.扩展AbstractController类 4.为处理程序方法指定URL映射 5.为处理程序方法指定HTTP请求方法 6.将请求参数映射到处理程序方法 7.返回模型和视图 8.将对象放入模型 9.处理程序方法中的重定向 10.处理表格提交和表格验证 11.处理文件上传 12.在控制器中自动装配业务类 ...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
求小姐姐抠图竟遭白眼?痛定思痛,我决定用 Python 自力更生!
点击蓝色“Python空间”关注我丫加个“星标”,每天一起快乐的学习大家好,我是 Rocky0429,一个刚恰完午饭,正在用刷网页浪费生命的蒟蒻...一堆堆无聊八卦信息的网页内容慢慢使我的双眼模糊,一个哈欠打出了三斤老泪,就在此时我看到了一张图片:是谁!是谁把我女朋友的照片放出来的!awsl!太好看了叭...等等,那个背景上的一堆鬼画符是什么鬼?!真是看不下去!叔叔婶婶能忍,隔壁老王的三姨妈的四表...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
相关热词 如何提升c#开发能力 矩阵乘法c# c#调用谷歌浏览器 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天
立即提问

相似问题

4
c语言指针 指针数组 函数数组
6
c++指针数组,指向指针的指针
3
c# 调用c++ sdk 传结构体指针
6
能不能通过修改指针的指向来修改指针所指向的变量的值
0
调用CefSharp.Cef.Shutdown,再次调用CefSharp.Cef.Initialize出现异常【红包感谢】
3
C语言函数传参:如何实现指针参数引用传递
4
C#调用C++的dll,C++程序中给结构体中变量赋值this指针,对应C#中应该怎么写呢?
1
C#Hook子程设置只监视消息,或者修改消息,或者停止消息的前进。
2
C# 指向结构体的指针释放,那结构体里面的指针还需释放吗?
2
C++ DLL方式调用函数转为 C# 时,参数该怎么定义
3
请教一个关于c++DLL供C#调用的代码,是否会出现内存泄漏的问题
1
C# 调用C++ DLL 参数OpenCvSharp.Mat如何传递
2
c#中怎么样实现win10和游戏《消逝的光芒》中的一些按钮和窗口界面效果?
3
C语言链表头结点的数据域指针域都为NULL的时候头结点指针是NULL吗?
1
C#调用C++函数,参数为指针该怎么处理?
2
C语言通过指针修改原地址值时显示读取权限冲突。
2
一个指针指向一个结构体,然后怎么改变这个指针指向数据的值
2
MFC中view和Doc类关系中,在view里成功获取文档类指针,但是指针下的所有自设成员变量值为什么为空?
1
C++中将输入的值存入指针后如何正确存读输入值?
2
C++用ADO方式链接SQLserver数据库,如何扩容数据集?