javascript

java

python

c#

node.js

reactjs

android

php

c++

ruby-on-rails

html

jquery

git

css

ios

sql

.net

c

<img src="//i.stack.imgur.com/bk9VA.png" alt="" class="sponsor-tag-img" width="18" height="16"/>android

string

如何在C中使用Linux共享内存

我的一个项目有点问题。

我一直试图找到一个记录良好的使用共享内存fork()的例子,但没有成功。

基本上情况是,当用户启动程序时,我需要在共享内存中存储两个值:current_path是char *,file_name也是char *。

根据命令参数,新进程将以fork()启动,并且该进程需要读取和修改存储在共享内存中的current_path变量,而file_name变量是只读的。

是否有一个很好的共享内存教程和示例代码(如果可能的话),你可以指导我?

谢谢,bleepzter

trans by 2019-08-19T06:32:04Z

include - 在另一个中包含一个C源文件?

#include .c文件在另一个.c文件中是否可以(或者甚至是推荐/良好实践)? 将它们包含在项目文件中会发生什么?

trans by 2019-08-19T05:03:46Z

C#vs C - 性能差异很大

我发现C anc C#中类似代码之间存在巨大的性能差异。

C代码是:

#include <stdio.h>
#include <time.h>
#include <math.h>

main()
{
    int i;
    double root;

    clock_t start = clock();
    for (i = 0 ; i <= 100000000; i++){
        root = sqrt(i);
    }
    printf("Time elapsed: %f\n", ((double)clock() - start) / CLOCKS_PER_SEC);   

}

而C#(控制台应用程序)是:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime startTime = DateTime.Now;
            double root;
            for (int i = 0; i <= 100000000; i++)
            {
                root = Math.Sqrt(i);
            }
            TimeSpan runTime = DateTime.Now - startTime;
            Console.WriteLine("Time elapsed: " + Convert.ToString(runTime.TotalMilliseconds/1000));
        }
    }
}

使用上面的代码,C#在0.328125秒(发布版本)完成,C运行11.14秒。

使用mingw将c编译为可执行的Windows。

我总是假设C / C ++更快或至少与C#.net相当。 究竟是什么导致C运行速度慢了30多倍?

编辑:看来C#优化器正在删除root,因为它没有被使用。我将根分配更改为root + =并在结尾处打印出总计。我还使用cl.exe编译了C,其中/ O2标志设置为最大速度。

结果现在是:C为3.75秒C#2.61秒

C仍然需要更长的时间,但这是可以接受的

trans by 2019-08-18T10:50:02Z

c ++ - “未定义的行为”是否真的允许*发生任何事情?

这个问题在这里已有答案:

  • 未定义,未指定和实现定义的行为                                     9个答案

编辑:这个问题并不是一个讨论未定义行为的(de)优点的论坛,而是它的成果。 在任何情况下,这个关于假设的C编译器没有未定义行为的线程可能对那些认为这是一个重要主题的人更感兴趣。


&#34;未定义行为的典型假冒例子&#34; 当然是&#34;鼻子恶魔&#34; - 无论C和C ++标准允许什么,物理上都是不可能的。

因为C和C ++社区倾向于强调未定义行为的不可预测性以及允许编译器在遇到未定义行为时使程序完全做任何事情的想法,所以我假设标准没有任何限制 关于行为,以及未定义的行为。

但C ++标准中的相关引用似乎是:

[C++14: defns.undefined]: [..]允许的未定义行为包括完全忽略不可预测的结果,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止翻译或 执行(发出诊断消息)。[..]

这实际上指定了一小组可能的选项:

  • 忽略这种情况 - 是的,标准继续说这会产生&#34;不可预测的结果&#34;,但这与编译器插入代码不同(我认为这是先决条件 ,你知道,鼻子恶魔)。
  • 以文件化的方式表现环境 - 这实际上听起来相对温和。 (我当然没有听说过有任何记录的鼻腔恶魔病例。)
  • 终止翻译或执行 - 使用诊断,不能少。 那个UB会表现得那么好吗?

我假设在大多数情况下,编译器选择忽略未定义的行为; 例如,当读取未初始化的内存时,可能是插入任何代码以确保一致行为的反优化。 我认为陌生人类型的未定义行为(例如&#34;时间旅行&#34;)将属于第二类 - 但这需要记录这些行为并且&#34;环境的特征&#34; (所以我猜鼻腔恶魔只能由地狱计算机产生?)。

我误解了这个定义吗? 这些仅仅是可能构成未定义行为的例子,而不是一个全面的选项列表吗? 声称&#34;任何事情都可能发生&#34; 仅仅意味着忽视这种情况的意外副作用?

编辑:两个小问题澄清:

  • 我认为从原始问题中可以清楚地看出,我认为对大多数人来说都是如此,但无论如何我都会说出来:我确实意识到了这一点,并且#34;鼻子恶魔&#34; 是诙谐的。
  • 请不要写一个(其他)答案,解释UB允许特定于平台的编译器优化,除非您还解释了它如何允许实现定义的行为不允许的优化。
trans by 2019-08-18T09:41:11Z

c - 硬浮点数和软浮点数之间有什么区别?

当我用我的交叉工具链编译C代码时,链接器打印警告页面,说我的可执行文件使用硬浮动,但我的libc使用软浮动。 有什么区别?

trans by 2019-08-14T12:39:13Z

c - 将结构初始化为0

如果我有这样的结构:

typedef struct
{
    unsigned char c1;
    unsigned char c2;
} myStruct;

将此结构初始化为0的最简单方法是什么?以下是否足够?

myStruct _m1 = {0};

或者我需要将每个成员显式初始化为0吗?

myStruct _m2 = {0,0};
trans by 2019-08-14T09:17:48Z

strtok()如何将字符串拆分为C中的标记?

请解释一下str函数的工作原理。手册说它把字符串分成了令牌。 我无法从手册中了解它实际上是做什么的。

我在str*pch上添加了手表以检查其工作情况,当第一个while循环发生时,str的内容仅为&#34;这个&#34;。 如何在屏幕上显示下面显示的输出?

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

输出:

Splitting string "- This, a sample string." into tokens:
This
a
sample
string
trans by 2019-08-14T06:38:54Z

c - 我什么时候应该使用perror(“...”)和fprintf(stderr,“......”)?

阅读手册页和一些代码并没有真正帮助我了解之间的差异 - 或更好,何时应该使用 - perror("...")fprintf(stderr, "...")

trans by 2019-08-13T18:57:18Z

为什么C在使用三元运算符时不允许连接字符串?

以下代码编译没有问题:

int main() {
    printf("Hi" "Bye");
}

但是,这不编译:

int main() {
    int test = 0;
    printf("Hi" (test ? "Bye" : "Goodbye"));
}

这是什么原因?

trans by 2019-08-13T14:09:59Z

C / C ++程序的最大堆栈大小

我想在100 X 100阵列上进行DFS。 (假设数组的元素代表图形节点)因此,假设最坏的情况,递归函数调用的深度可以达到10000,每个调用占用20个字节。 那么可行的方法是否存在stackoverflow的可能性?

C / C ++中堆栈的最大大小是多少?

请为两者指定gcc
1)Windows上的cygwin
2)Unix

一般限制是什么?

trans by 2019-08-13T05:58:25Z

c# - 一起计算sin和cos的最快方法是什么?

我想一起计算一个值的正弦和正弦值(例如创建一个旋转矩阵)。 当然我可以像sincos一样一个接一个地计算它们,但我想知道在需要两个值时是否有更快的方法。

编辑:总结到目前为止的答案:

  • 弗拉德说,有asm命令sincos计算它们(几乎与单独调用sincosf的时间相同)

  • 像Chi注意到的那样,这种优化有时已经由编译器完成(当使用优化标志时)。

  • caf指出,功能sincossincosf可能是可用的,只需包括math.h即可直接调用

  • 讨论使用查找表的tanascius方法存在争议。 (但是在我的计算机和基准测试场景中,它运行速度比sincos快3倍,而32位浮点的精度几乎相同。)

  • Joel Goodwin与一种非常快速逼近技术的有趣方法相关联,具有非常好的准确性(对我来说,这比查表更快)

trans by 2019-08-13T03:54:44Z

Eclipse CDT for C标准库头文件中存在“未解决的包含”错误

我为eclipse设置了CDT并编写了一个简单的hello world C程序:

#include <stdio.h>

int main(void){
    puts("Hello, world.");
    return 0;
}

该程序正确构建和运行,但是当我把鼠标放在它上面时,eclipse一直在包含语句旁边显示这个黄色问号,该句号是"Unresolved inclusion: <stdio.h>"

它不会影响程序的运行,但我觉得它很烦人。

有谁知道如何删除它?

trans by 2019-08-12T17:27:22Z

用C或C ++打印调用堆栈

有没有办法在每次调用某个函数时在C或C ++中正在运行的进程中转储调用堆栈? 我的想法是这样的:

void foo()
{
   print_stack_trace();

   // foo's body

   return
}

其中register_stack_trace_function与Perl中的register_stack_trace_function类似。

或类似的东西:

int main (void)
{
    // will print out debug info every time foo() is called
    register_stack_trace_function(foo); 

    // etc...
}

其中register_stack_trace_function放置某种内部断点,只要调用foo,就会打印堆栈跟踪。

在某些标准C库中是否存在类似的内容?

我正在使用GCC在Linux上工作。


背景

我有一个测试运行,根据一些不应该影响这种行为的命令行开关,行为不同。 我的代码有一个伪随机数生成器,我假设它是基于这些开关被不同地调用的。 我希望能够使用每组开关运行测试,并查看随机数生成器是否针对每个开关进行不同的调用。

trans by 2019-08-12T10:28:59Z

c ++ - 什么是uint_fast32_t以及为什么要使用它来代替常规int和uint32_t?

因此uint_fast32_t:ed原始数据类型的原因是抽象低级表示并使其更容易理解(typedef而不是uint32_t类型,即8字节)。

但是,有uint_fast32_ttypedef具有相同的typedef。将使用&#34; fast&#34; 版本使程序更快?

trans by 2019-08-11T11:54:53Z

c - 缩进#defines

我知道#defines等通常不会缩进。 为什么?

我现在在一些代码中工作,其中包含#defines,#ifdefs,#defines,#endifs等的可怕混合物。所有这些通常与普通的C代码混合在一起。 #defines的非缩进使它们难以阅读。 缩进代码与非缩进#defines的混合是一场噩梦。

不缩进#defines有什么好处? 如果我缩进它会不会让我成为一个坏人? 这不是更好吗?

#ifdef SDCC
    #if DEBUGGING == 1
        #if defined (pic18f2480)
            #define FLASH_MEMORY_END 0x3DC0
        #elif defined (pic18f2580)
            #define FLASH_MEMORY_END 0x7DC0
        #else
            #error "Can't set  up flash memory end!"
        #endif
    #else
        #if defined (pic18f2480)
            #define FLASH_MEMORY_END 0x4000
        #elif defined (pic18f2580)
            #define FLASH_MEMORY_END 0x8000
        #else
            #error "Can't set  up flash memory end!"
        #endif
    #endif
#else
    #if DEBUGGING == 1
        #define FLASH_MEMORY_END 0x7DC0
    #else
        #define FLASH_MEMORY_END 0x8000
    #endif
#endif
trans by 2019-08-11T03:55:09Z

这个1988 C代码有什么问题?

我试图从书中编写这段代码&#34; The C Programming Language&#34; (K&amp; R)。 它是UNIX程序main的简单版本:

#include <stdio.h>

#define IN   1;     /* inside a word */
#define OUT  0;     /* outside a word */

/* count lines, words and characters in input */
main()
{
    int c, nl, nw, nc, state;

    state = OUT;
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if (state == OUT) {
            state = IN;
            ++nw;
        }
    }
    printf("%d %d %d\n", nl, nw, nc);
}

我收到以下错误:

$ gcc wc.c 
wc.c: In function ‘main’:
wc.c:18: error: ‘else’ without a previous ‘if’
wc.c:18: error: expected ‘)’ before ‘;’ token

本书的第2版是从1988年开始的,我对C来说很新。也许它与编译器版本有关,或者我只是在胡说八道。

我在现代C代码中看到了main功能的不同用法:

int main()
{
    /* code */
    return 0;
}

这是一个新标准还是我仍然可以使用无类型的主要?

trans by 2019-08-10T21:11:39Z

C和C ++中+ =的结果是什么?

我有以下代码:

#include <stdio.h>
int main(int argc, char **argv) {
    int i = 0;
    (i+=10)+=10;
    printf("i = %d\n", i);
    return 0;
}

如果我尝试使用gcc将其编译为C源代码,则会出现错误:

error: lvalue required as left operand of assignment

但是,如果我使用g ++将其编译为C ++源代码,我将得到没有错误,当我运行可执行文件时:

i = 20

为什么不同的行为?

trans by 2019-08-10T12:54:01Z

c - 在哪里放置包含声明,标题或来源?

我应该将包含在头文件或源文件中吗? 如果头文件包含include语句,那么如果我在源代码中包含该头文件,那么我的源文件是否包含我头文件中包含的所有文件? 或者我应该只将它们包含在我的源文件中?

trans by 2019-08-10T05:02:02Z

c ++ - 有没有办法使用printf()指定要打印的字符串的字符数?

有没有办法指定要打印的字符串的字符数(类似于Here are the first 8 chars: A strings中的小数位)?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

想要打印:Here are the first 8 chars: A string

trans by 2019-08-08T23:39:58Z

c ++ - #include在.h或.c / .cpp中?

当用C或C ++编码时,我应该在哪里获得#include

callback.h:

#ifndef _CALLBACK_H_
#define _CALLBACK_H_

#include <sndfile.h>
#include "main.h"

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data);
void on_button_cancel_clicked(GtkButton* button, struct user_data_s* data);

#endif

callback.c:

#include <stdlib.h>
#include <math.h>

#include "config.h"

#include "callback.h"
#include "play.h"

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data) {
  gint page;
  page = gtk_notebook_get_current_page(GTK_NOTEBOOK(data->notebook));

  ...

是否所有包括在.h或.c / .cpp中,或两者都像我在这里做的那样?

trans by 2019-08-08T23:29:41Z

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 下一页 共53页