假设我要初始化一个变量:
float f = 1.0f;
在这里只会让我生气f
我知道最初 1.0 应该是一些类型double
,但是如果1.0
它仍然适合有什么区别float
?如果没有它们一切正常,为什么我们需要这些后缀?编译器不为我做类型转换吗?
假设我要初始化一个变量:
float f = 1.0f;
在这里只会让我生气f
我知道最初 1.0 应该是一些类型double
,但是如果1.0
它仍然适合有什么区别float
?如果没有它们一切正常,为什么我们需要这些后缀?编译器不为我做类型转换吗?
情况是这样的:客户端通过tcp协议连接到服务器,但这是一个连接,我需要在客户端程序运行时改变连接数。假设我想同时以不同的流向服务器发送数据,同时还从服务器接收其他数据,有很多客户端,所以在主套接字中创建一个新连接是不可行的,新连接必须具有在服务器和客户端上都具有与旧版本相同的特征。
给定:从服务器建立的连接(套接字)
查找:将这个连接分解为许多其他连接
解决方案: ???
假设我在服务器上拨打了 3 次电话send
send(sock,"I",sizeof("I"),0);
send(sock,"Y",sizeof("Y"),0);
send(sock,"X",sizeof("X"),0);
在客户端,我打了 3 次电话recv
recv(sock,buf,sizeof(buf),0);
recv(sock,buf,sizeof(buf),0);
recv(sock,buf,sizeof(buf),0);
有时会发生三个 send 调用的执行速度比数据到达客户端的速度要快,所以第一个 recv 调用读取了三个 send 调用发送的所有数据,而第二个 recv 在预期中冻结,你必须做“安全网”:
客户端收到第一次send调用的数据,然后向服务器发送一个肯定响应,服务器上的下一个send调用只有在收到客户端的肯定响应后才执行,这非常集体农场,所以如果你知道一个正常的方式 - 写一个答案
假设我在服务器上拨打了 3 次电话send
send(sock,"I",sizeof("I"),0);
send(sock,"Y",sizeof("Y"),0);
send(sock,"X",sizeof("X"),0);
在客户端,我打了 3 次电话recv
recv(sock,buf,sizeof(buf),0);
recv(sock,buf,sizeof(buf),0);
recv(sock,buf,sizeof(buf),0);
我不是网络专家:( tcp控制数据包的有序传递,这是否意味着服务器发送3次的数据将按照我发送它们的顺序到达?
在 windows 上安装程序时,我得到一个窗口,要求我阅读许可协议,如果您同意,请选中该框,但是当我在 debian 系列的 linux 发行版上安装程序时,我什么都没有,我只是输入命令apt install имяпакета
,程序安装在 PC 上,许可协议存储在一个文件中/usr/share/doc/имякаталога/copyright
。
这有多正确,以这种方式建立的许可协议是否具有法律效力?
我已经用我的程序编译了一个 deb 包,我需要以某种方式分发它。我需要用户能够使用一个命令安装我的程序,apt install
如果我需要添加存储库,可能需要两个命令。我该怎么做?
我创建了一个在后台更新页面的线程(删除小部件并插入新的小部件),但它的工作非常不可预测 - 有时分段错误飞出,然后 gtk 使程序崩溃,我同时使用了 POSIX 线程和 GLib。谷歌搜索,我意识到 gtk 是狗屎(线程不安全),那么我该如何使用线程呢?
找到一篇文章,但所有函数都已过时(编译器发誓),并且码头自己说应该从主线程调用所有 GDK 和 GTK 函数 https://subscribe.ru/archive/comp.soft.prog.gtk/ 201110/07074453.html 它可以工作,但编译器会发出关于已弃用功能的警告,敲击螺栓还是我可以以某种方式修复它?
我将我的处理程序连接到press-key-event
小部件信号:TextView
void event_return(GtkWidget *widget,GdkEventKey *event,sig_data *data)
{
if(event->keyval==GDK_KEY_Return){
printf("\nEVENT_RETURN\n");
}
}
也就是说,如果我按下一个键,Enter
那么我的处理程序将工作,并且TextView
该键不会进入小部件缓冲区(以及按下任何键)。就是这样,但是如果我添加sleep(1)
到代码中:
void event_return(GtkWidget *widget,GdkEventKey *event,sig_data *data)
{
if(event->keyval==GDK_KEY_Return){
printf("\nEVENT_RETURN\n");
sleep(1);
}
}
然后换行符将进入缓冲区。为什么会发生这种情况,如何完全拦截此信号而不将其跳过到缓冲区中?
据我了解,这类似于gtk_widget_hide
and gtk_widget_show
,它仅通过动画隐藏或显示其子小部件。
我有一个GtkRevealer
按钮所在的小部件,使用gtk_revealer_set_reveal_child(GTK_REVEALER(Revealer),FALSE);
我尝试隐藏按钮的功能,但什么也没有出现,我不明白什么?
Gtk 版本 3.24.18
for(int i =0;i<14;++i){
gtk_box_pack_start(GTK_BOX(MessagesBox),gtk_label_new("метка"),0,0,0);
gtk_widget_show_all(MainWindow);
sleep(1);
}
理论上,每次迭代后,应该显示一个更新的新窗口,但它仅在调用后显示gtk_main()
,为什么会发生这种情况,如何动态添加新标签到屏幕?
假设一个物体有坐标 (x, y) 和一个角度,如果角度是 0 度,那么物体直线运动,如果是 90,那么向右,向后 180,向左 270 和 360 - 直线,但是如果角度不是90度,还有40?那怎么搬?
struct sockaddr_in* addr;
struct addrinfo *hints;
struct addrinfo servinfo;
memset (&servinfo, 0, sizeof (servinfo));
servinfo.ai_family=AF_INET;
servinfo.ai_socktype=SOCK_STREAM;
int i=getaddrinfo("www.google.com","80",&servinfo,&hints);
addr=(struct sockaddr_in*)hints->ai_addr;
printf("ip: %s\r\n",inet_ntoa(addr->sin_addr));
我正在尝试显示主机(Google)的 ip,但出现分段错误,我也尝试像这样输出它:
printf("ip: %s\r\n",hints->ai_addr->sa_data);
但同样的错误发生在这里。
为了可读性,这里我删除了所有错误检查,但它们存在于我的代码中,没有错误出现,getaddrinfo 正常工作,可能错误在最后两行:
addr=(struct sockaddr_in*)hints->ai_addr;
printf("ip: %s\r\n",inet_ntoa(addr->sin_addr));
我做错了什么?所有代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <netdb.h>
void sendall(int socket,char*buf,int size);
int recvall(int socket,char*buf,int size);
int main(int argc, char const *argv[])
{
int sock=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in* addr;
addr->sin_family=AF_INET;
addr->sin_port=htons(80);
struct addrinfo *hints;
struct addrinfo servinfo;
memset (&servinfo, 0, sizeof (servinfo));
servinfo.ai_family=AF_INET;
servinfo.ai_socktype=SOCK_STREAM;
int i=getaddrinfo("www.google.com","80",&servinfo,&hints);/*servinfo
задает параметры возвращаемых адресов
т.е если мы сделаем так servinfo.ai_socktype=SOCK_STREAM;, то нам
вернутся
адреса хостов работающих на tcp сокетах*/
//в hints записывается вся информация о хосте
if(i!=0){
perror("getaddrinfo");
printf("%d\n",i );
}
switch(i){
case EAI_FAMILY:printf("EAI_FAMILY\n");break;
case EAI_SOCKTYPE:printf("EAI_SOCKTYPE\n");break;
case EAI_BADFLAGS:printf("EAI_BADFLAGS\n");break;
case EAI_NONAME:printf("EAI_NONAME\n");break;
case EAI_SERVICE:printf("EAI_SERVICE\n");break;
//case EAI_ADDRFAMILY:printf("EAI_ADDRFAMILY\n");break;
//case EAI_NODATA:printf("EAI_NODATA\n");break;
case EAI_MEMORY:printf("EAI_MEMORY\n");break;
case EAI_FAIL:printf("EAI_FAIL\n");break;
case EAI_AGAIN:printf("EAI_AGAIN\n");break;
case EAI_SYSTEM:printf("EAI_SYSTEM\n");break;
}
//addr.sin_addr.s_addr=htonl(getipaddr.h_name);
addr=(struct sockaddr_in*)hints->ai_addr;
printf("ip: %s\r\n",inet_ntoa(addr->sin_addr));
return 0;
}
void sendall(int socket,char*buf,int size)
{
short int len,total=0;
do{
if((len=send(socket,&buf[total],size-total,0))==-1){
perror("sendall");
exit(1);
}
total+=len;
}while(total!=len);
}
int recvall(int socket,char*buf,int size)
{
short int total=0,len;
do{
len=recv(socket,&buf[total],size-total,0);
fprintf(stderr, "asdasdasdasdasd,total%dlen%d\n",total,len );
switch(len){
case -1:
perror("recv2");
exit(1);
case 0:
return 0;
}
total=total+len;
}while(buf[total-1]!='\0');
return total;
}
我写REVOKE GRANT OPTION ON DELETE ON FROM 'dimalox'@'localhost';
了,mysql输出这个-
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'DELETE FROM 'dimalox'@'localhost'' 附近使用正确的语法
书中查询是这样写的,网上也有,但是mysql报错,怎么回事?
伙计们,我开始用 C 语言做我的第一个独立的小项目,在终端上做一个信使,在 Linux 和 Windows 上,我知道怎么做,但是如何让这个聊天在 android 的终端上工作,请解释一下我能学到什么,也许有任何适用于 android 的库,或者通常为 linux 编写的代码适用于 android(它也是基于 linux 内核构建的)?我将非常感谢您的回答。
在这里,我正在创建一个处理程序:
struct sigaction act;
act.sa_handler=handler;
sigaction(SIGINT,&act,NULL);
处理函数本身handler
:
void handler()
{
reset_canonical_mode();
system("clear");
exit(1);
}
当我按CTR + C,理论上应该调用函数handler
,调用,但是我不明白它是如何工作的,reset_canonical_mode();
根本没有调用函数。为什么会这样?请解释如何响应 SIGINT 信号清除终端、显示消息并关闭进程?