小编thn*_*rks的帖子

C struct继承指针对齐

背景

我创建了一个主要用于学习目的的基本链表数据结构.该列表的一个目标是它可以处理不同的数据结构.因此,我已尝试在结构组合中模拟C中的"继承".以下是构成我的链表的基础的结构.

typedef struct Link {
    struct Link* next;
    struct Link* prev;
} Link;

typedef Link List;
Run Code Online (Sandbox Code Playgroud)

在我的实现中,我选择了一个作为列表头部和尾部的Sentinel节点(这就是Link == List的原因).

为了使列表实际处理数据,结构只包含Link结构作为第一个成员:

typedef struct {
    Link link;
    float data;
} Node;
Run Code Online (Sandbox Code Playgroud)

所以链表看起来像这样.

         ?????????????     ?????????     ?????????????     
... <--->? P ? N ? D ?<--->? P ? N ?<--->? P ? N ? D ?<---> ... 
         ?????????????     ?????????     ?????????????
         End Node          myList        First Node

List myList;
Node node1 = {{}, 1.024};
....
Node nodeN = {{}, 3.14};

list_init(&myList) // myList.next = &myList; myList.prev …
Run Code Online (Sandbox Code Playgroud)

c pointers linked-list data-structures

48
推荐指数
1
解决办法
2070
查看次数

为什么灵活数组成员的静态初始化有效?

我已经为菜单编写了以下基本代码:

typedef struct Menu {
    char* title;
    unsigned num_submenus;
    struct Menu *submenu[];
} Menu;

Menu sub1 = {"Submenu 1", 0, {NULL}};
Menu sub2 = {"Submenu 2", 0, {NULL}};
Menu Main = {"Main Menu", 2, {&sub1, &sub2}};   /* No Error?! */

int main()
{
    printf("%s\n", Main.title);
    printf("%s\n", Main.submenu[0]->title);
    printf("%s\n", Main.submenu[1]->title);
}
Run Code Online (Sandbox Code Playgroud)

浏览一些相关问题似乎是使用灵活数组成员的唯一方法是动态地为其分配内存.但是我的编译器非常乐意编译和运行代码而不会出现任何错误或警告.这是禁止的吗?

我正在使用MinGW gcc 4.6.1并根据C99规则进行编译.

c

14
推荐指数
1
解决办法
4383
查看次数

比特黑客:扩大比特

我试图将uint16_t输入转换为uint32_t位掩码.输入中的一位在输出位掩码中切换两位.以下是将4位输入转换为8位位掩码的示例:

Input    Output
ABCDb -> AABB CCDDb

A,B,C,D are individual bits

Example outputs:

0000b -> 0000 0000b
0001b -> 0000 0011b
0010b -> 0000 1100b
0011b -> 0000 1111b
....
1100b -> 1111 0000b
1101b -> 1111 0011b
1110b -> 1111 1100b
1111b -> 1111 1111b
Run Code Online (Sandbox Code Playgroud)

有没有一种方法来实现这种行为?

c bit-manipulation

11
推荐指数
2
解决办法
1566
查看次数

LINQ选择动态列和值

出于各种原因,我需要能够允许用户根据他们对列和值的选择从数据库中选择项目.例如,如果我有一张桌子:

Name   | Specialty       | Rank
-------+-----------------+-----
John   | Basket Weaving  | 12
Sally  | Basket Weaving  | 6
Smith  | Fencing         | 12
Run Code Online (Sandbox Code Playgroud)

用户可以请求1,2或更多列,并且他们请求的列可以是不同的.例如,用户可以请求的条目,其中Specialty == Basket WeavingRank == 12. What I do currently is gather the user's request and create a list ofKeyValuePair where the密钥is the column name and theValue`是列所需的值:

class UserSearch
{
    private List<KeyValuePair<string, string> criteria = new List<KeyValuePair<string, string>>();

    public void AddTerm(string column, string value)
    {
        criteria.Add(new KeyValuePair<string, string>(column, value); …
Run Code Online (Sandbox Code Playgroud)

c# linq wpf entity-framework

9
推荐指数
2
解决办法
2万
查看次数

C# MVVM 服务层在哪里?

我正在尝试开发一个小程序,它将与串行端口上的设备进行通信。该程序将负责格式化用户输入的数据以及读取和呈现设备接收到的值。我对 WPF 和 MVVM 还很陌生,并且已经对整个数据绑定/XAML 混乱有了基本的了解(我认为)。

目前我的理解是这样的:

  1. 视图:仅用于 UI 的东西。绑定到 ViewModel。
  2. ViewModel:获取模型或模型的各种属性,并以视图可以理解的方式呈现它们。还为视图提供了一种修改模型的方法。
  3. 模型:UI 呈现和修改的数据。

现在我不知道是什么为 ViewModel 提供了模型,以便整个应用程序都知道模型的变化。

该模型目前看起来类似于以下内容。我的设备获取校准记录并且可以回读所有校准记录。

public class Device : ObservableObject
{
    public ObservableCollection<CalibRecord> CalibRecords { get; set; }

    private SerialPort sp;

    public Device(SerialPort port)
    {
        this.sp = port;
        this.CalibRecords = new ObservableCollection<CalibRecord>();
    }

    public void WriteCalibration(CalibRecord record)
    {
        /* Write a calibration record to the device */
    }

    public void ReadCalibration()
    {
        /* Read all calibration records from the device and update CalibRecords */
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在努力寻找一个放置这个人的地方,以便整个应用程序都可以访问它。目前我在主窗口的 …

c# wpf mvvm

6
推荐指数
1
解决办法
5580
查看次数

Matlab:帮助理解正弦曲线拟合

我有一个未知的正弦波,有一些我试图重建的噪音.最终目标是提出一个C算法来找到正弦波的幅度,直流偏移,相位和频率,但我首先在Matlab(实际上是Octave)中进行原型设计.正弦波的形式

y = a + b*sin(c + 2*pi*d*t)
a = dc offset
b = amplitude
c = phase shift (rad)
d = frequency
Run Code Online (Sandbox Code Playgroud)

我找到了这个例子,John D'Errico在评论中提出了一种使用最小二乘法将正弦波拟合到数据的方法.这是一个简洁的算法,效果非常好,但我很难理解一个方面.算法如下:

算法

假设你有一个形式的正弦波:

(1) y = a + b*sin(c+d*x)
Run Code Online (Sandbox Code Playgroud)

使用身份

(2) sin(u+v) = sin(u)*cos(v) + cos(u)*sin(v)
Run Code Online (Sandbox Code Playgroud)

我们可以重写(1)as

(3) y = a + b*sin(c)*cos(d*x) + b*cos(c)*sin(d*x)
Run Code Online (Sandbox Code Playgroud)

由于b*sin(c)b*cos(c)是常量,这些可以包装成常量b1b2.

(4) y = a + b1*cos(d*x) + b2*sin(d*x)
Run Code Online (Sandbox Code Playgroud)

这是用于拟合正弦波的等式.创建函数以生成回归系数和平方和残差.

(5) cfun = @(d) [ones(size(x)), sin(d*x), cos(d*x)] \ y;
(6) sumerr2 …
Run Code Online (Sandbox Code Playgroud)

c matlab linear-algebra curve-fitting

6
推荐指数
1
解决办法
978
查看次数

C++ Perincrement Undefined Operation vs C.

我有这行代码:

front = (++front) % size;
Run Code Online (Sandbox Code Playgroud)

在CI中没有警告但在C++中我收到警告operation on front may be undefined [-Wsequence-point].这个preincrement用法如何导致未定义的行为?在我看来,这条线非常明确,将被解释为:

  1. 增量前
  2. mod正面尺寸
  3. 为前面分配新值.

我的编译器只是抛出一个警告吗?

PS我理解警告,如果我做的事情front = front++;或天堂禁止front = front++ + front++;.

编辑:此警告是在Windows 64上的CodeBlocks中使用GCC(tdm-1)4.6.1生成的

c++

2
推荐指数
1
解决办法
161
查看次数

为什么编译器不优化中断代码?

我最近遇到了一个只在中断处理程序中被修改的变量的问题.变量本身并未声明为volatile,因此在更高的优化级别下,编译器会破坏代码.但是,编译器足够聪明,可以编译中断代码,因为中断仍会触发.

所以这是我的问题:

  1. 如果编译器足够聪明以编译中断代码,为什么它不够聪明才能意识到变量在该中断内被改变了?

  2. 在更高的优化级别,未调用的函数会被优化.由于没有代码调用中断处理程序,因此它应该被优化掉.什么原因导致编译器编译中断代码?

c optimization cortex-m3 interrupt-handling

1
推荐指数
1
解决办法
649
查看次数