我创建了一个主要用于学习目的的基本链表数据结构.该列表的一个目标是它可以处理不同的数据结构.因此,我已尝试在结构组合中模拟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) 我已经为菜单编写了以下基本代码:
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规则进行编译.
我试图将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)
有没有一种方法来实现这种行为?
出于各种原因,我需要能够允许用户根据他们对列和值的选择从数据库中选择项目.例如,如果我有一张桌子:
Name | Specialty | Rank
-------+-----------------+-----
John | Basket Weaving | 12
Sally | Basket Weaving | 6
Smith | Fencing | 12
Run Code Online (Sandbox Code Playgroud)
用户可以请求1,2或更多列,并且他们请求的列可以是不同的.例如,用户可以请求的条目,其中Specialty == Basket Weaving
和Rank == 12. What I do currently is gather the user's request and create a list of
KeyValuePair where the
密钥is the column name and the
Value`是列所需的值:
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) 我正在尝试开发一个小程序,它将与串行端口上的设备进行通信。该程序将负责格式化用户输入的数据以及读取和呈现设备接收到的值。我对 WPF 和 MVVM 还很陌生,并且已经对整个数据绑定/XAML 混乱有了基本的了解(我认为)。
目前我的理解是这样的:
现在我不知道是什么为 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算法来找到正弦波的幅度,直流偏移,相位和频率,但我首先在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)
是常量,这些可以包装成常量b1
和b2
.
(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) 我有这行代码:
front = (++front) % size;
Run Code Online (Sandbox Code Playgroud)
在CI中没有警告但在C++中我收到警告operation on front may be undefined [-Wsequence-point]
.这个preincrement用法如何导致未定义的行为?在我看来,这条线非常明确,将被解释为:
我的编译器只是抛出一个警告吗?
PS我理解警告,如果我做的事情front = front++;
或天堂禁止front = front++ + front++;
.
编辑:此警告是在Windows 64上的CodeBlocks中使用GCC(tdm-1)4.6.1生成的
我最近遇到了一个只在中断处理程序中被修改的变量的问题.变量本身并未声明为volatile,因此在更高的优化级别下,编译器会破坏代码.但是,编译器足够聪明,可以编译中断代码,因为中断仍会触发.
所以这是我的问题:
如果编译器足够聪明以编译中断代码,为什么它不够聪明才能意识到变量在该中断内被改变了?
在更高的优化级别,未调用的函数会被优化.由于没有代码调用中断处理程序,因此它应该被优化掉.什么原因导致编译器编译中断代码?