我制作了两个程序,其中一个名为generator,每秒打印一些文本
int main(int argc, char** argv) {
for(int i = 0; i < 10 ; i++) {
printf("something\n");
sleep(1);
}
return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
然后有一个第二个程序现在称它为消费者,它应该从一个标准输入中读取一些其他文本并重新打印它.让它看起来像这样:
int main(int argc, char** argv) {
char line[BUFSIZ];
while(scanf("%s",line) != -1){
printf("you entered %s \n",line);
}
return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
当我编译它们并尝试只运行像./generator这样的生成器时,它按预期工作.每一秒都有东西打印到控制台.但是当我尝试像./generator一样运行它们时 ./consumer它没有像我预期的那样工作.我等了10秒,然后你得到了10行你 想要打印的东西"你输入的东西"每一秒.
你能解释一下为什么会这样,甚至更好地告诉我如何实现预期的行为?
以下代码源自此处的一个问题。(我知道代码有几个逻辑问题,但我不明白它们是如何导致这个问题的。)
编辑: 我在 Windows 上使用 CLANG,并显示常见的编译警告。
它产生在所指示的线被零除故障(第一循环中的语句。),但也有没有明显的分歧。任何人都可以提供一些有关为什么会发生此错误的见解吗?
编辑 2:每评论:将函数中的第三个参数sepia从
void sepia(int height, int width, RGBTRIPLE image[height][width])
Run Code Online (Sandbox Code Playgroud)
到
void sepia(int height, int width, RGBTRIPLE image[3][4])
Run Code Online (Sandbox Code Playgroud)
消除除以零误差。为什么?
typedef struct {
double rgbtRed;
double rgbtGreen;
double rgbtBlue;
}RGBTRIPLE;
RGBTRIPLE image[3][4];
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
double sepiaRed = 0.0;
double sepiaGreen = 0.0;
double sepiaBlue = 0.0;
// over height
for (int h = 0; h < height; h++)
{
// over width …Run Code Online (Sandbox Code Playgroud) 我已经阅读了链接,回答了是否有64位版本的Visual Studios( Visual Studio 64位?)的问题.简单的答案是没有,但32位的Visual Studio开发环境可以产生64位可执行文件.
问题:
1)是否有64位版本的Microsoft可再发行库msvcr80.dll?我在我的Windows 7,64位机器上安装了可再发行程序包,winsxs子目录中的所有副本(共7个)在其标题部分中指示它们是32位.
2)不是这样的:
a)32位可执行文件无法加载64位dll?
b)64位可执行文件无法加载32位dll?
c)如果确实所有版本的msvcr80.dll都是真正的32位,如每个版本的标题部分所示,使用Visual Studio构建的64位应用程序如何使用此可再发行组件的任何功能?
如果有人找到了这个文件的真正64位版本(msvcr80.dll),即标题部分实际上声明它是64位库,请指向链接.
新增:添加了BeyondCompare Viewer的图像以显示msvcr80.dll标题部分的内容,表示dll的目标是32位使用...
我已经在 SO 上查看了this和this,但它们处理的是同一问题的非 C 变体。
使用带有以下代码的 GNU GCC 编译器(Code::Blocks,在 Windows 中):
int main(void)
{
time_t rawtime;
struct tm *info;
char timeStr[80];
time( &rawtime );
info = localtime( &rawtime );
strftime(timeStr,80,"%a %b %d %H:%M:%S %Z %Y", info);
printf("%s", timeStr);
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到这个时间字符串:
2016 年 8 月 30 日星期二 14:55:08 太平洋夏令时
除了时区,一切都很好。我更喜欢缩写,例如:
2016 年 8 月 30 日星期二 14:55:08 PDT
在strftime() 的每个手册页或 Windows 文档中,我都可以找到格式说明符 %Z 的描述,例如: Timezone name or abbreviation。(例如。这里。)
将时区格式化为缩写的技巧是什么?
同一变量的这两种形式,当在功能块的范围内定义时,我认为应该具有相同的范围,即在{...}定义它们的功能块内:
char str1[] = "int_1 < int_2";
char *str1 = "int_1 < int_2";
Run Code Online (Sandbox Code Playgroud)
但我的观察是,char *生命超出了功能范围,而char []不再存在。str1两种情况下的符号名称都指向变量在内存中创建的位置,那么为什么一个似乎存在于函数之外,而另一个却没有呢?以下代码可用于测试此行为:(#define从0为1 选择一种形式而不是另一种形式以进行说明。)
另请注意,尽管static修饰符可用于修改范围,但此处故意不使用它来观察没有它的行为。
#define DO (1) //define as either 1 or 0
char * compare_int(int x1, int x2);
int main(void)
{
int a = 0;
int b = 0;
int c = '\n';
srand(clock()/CLOCKS_PER_SEC);
while(c != 'q')
{
a = rand()%3;
b = rand()%3;
printf("%s\n( enter 'q' to …Run Code Online (Sandbox Code Playgroud) 我正在寻找某种尽可能简约C但具有内置类支持的 C 方言。C因此,我可以(并鼓励)使用宏、指向数组的指针和手动内存管理,还可以创建类、向它们添加字段和成员函数等。当我尝试在andtypedef struct和函数指针中实现某种 OOP 时,出现了这个问题与我想要的类似,但是“成员函数”需要手动将指向对象的指针作为参数传递给它们,而这不是我想要做的。C++我知道我可以像“带有类的 C”一样写,但是我C++会鼓励不同的编程风格,我很好奇是否有一些东西正是我想要的。
我正在搜索“带有类的 C”,但我只C++在结果中看到,所以我希望答案是“只使用 C++”,我对此表示同意,但我只是好奇。
我malloc()/calloc()创建内存的方式概念一直是创建一个项目后,对象的地址保持不变.但是我经常用来创建一个字符串数组的函数,以及一个似乎一直运行良好的函数,最近让我质疑我的理解,也就是说,对象的内存地址可以简单地通过调用来移动calloc/malloc.
为了说明,这里是我用来为字符串数组创建内存的函数 - char **:
char ** CreateArrayOfStrings(char **a, int numWords, int maxWordLen)
{
int i;
a = calloc(numWords, sizeof(char *)); //create array of pointers
if(!a) return a; //required caller to check for NULL
for(i=0;i<numWords;i++)
{
a[i] = calloc(maxWordLen + 1, 1); //create memory for each string
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
在我的系统上,(Win7,32bit编译,ANSI C)该行:
a = calloc(numWords, sizeof(char *)); //create array of pointers
Run Code Online (Sandbox Code Playgroud)
创建一个连续内存块,大小为numWords char *,在本例中为7,产生28个字节:
内存跨度从地址0x03260080 + 1C(0x0326009C)
或:
a[0] …Run Code Online (Sandbox Code Playgroud) 我编写了代码来创建动态创建对象的链接列表:
#include <iostream>
using namespace std;
struct X {
int i;
X* x;
};
void birth(X* head, int quant){
X* x = head;
for(int i=0;i<quant-1;i++){
x->i = i+1;
x->x = new X;
x = x->x;
}
x->i = quant;
x->x = 0;
}
void kill(X* x){
X* next;
while(1==1){
cout << x->i << endl;
cout << (long)x << endl;
next = x->x;
delete x;
if(next == 0){
break;
} else {
x = next;
}
}
}
int main(){
cout …Run Code Online (Sandbox Code Playgroud) 我正在使用Code::Blocks版本 13.12 和 GNU GCC 编译器。我最近在 Windows 7 上安装并开始使用这些工具。尽管我不认为语言是一个促成因素,但我使用此环境来创建 C 和 C++ 应用程序。
在获得调试或发布目标可执行文件的干净构建后,然后单击绿色“运行”或红色“调试/运行”工具栏按钮,我看到控制台弹出窗口闪烁(出现,然后关闭),即使对于以下代码不向 写入任何内容stdout。例如...
int main(void)
{
int a = 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...产生一个控制台弹出窗口。
谁能描述如何设置 Code::Blocks IDE 来抑制控制台弹出窗口?
注意:我已经在此处和此处查看了与此问题相关的答案。这些帖子是相关的,其中一个帖子作为另一个帖子的重复项被关闭,但两者的答案都没有解决这个问题。(即因为我的系统不使用Avast,Avast 与该问题完全无关)
当我运行第一个代码时,它在每个打印语句末尾带有“\n”,它给出了num==情况下的预期输出35
The generated sequence:
35
106
53
160...
Run Code Online (Sandbox Code Playgroud)
生成 collatz 序列的代码:
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
int main(int argc, char* argv[])
{
int fd[2], fd1[2], num = atoi(argv[1]), id = getpid();
printf("\nRecieved number: %d\n", num);
if(num > 0)
{
printf("The generated sequence: \n");
while(num > 1)
{
pipe(fd);
pipe(fd1);
if(fork()) //parent process
{
printf("%d \n", num);
int n;
close(fd[0]); //closing read end..
close(fd1[1]); //closing write end..
write(fd[1], &num, sizeof(num));
wait(NULL);
read(fd1[0], &n, sizeof(n));
num = n;
close(fd[1]); …Run Code Online (Sandbox Code Playgroud)