用 C 语言实现 FIFO 队列

2024-04-10

对于嵌入式应用程序,我尝试使用 ANSI C 实现先进先出 (FIFO) 结构队列。最直接的方法似乎是通过实现链表,以便每个结构包含指向队列中下一个的指针。因此我将结构本身定义为:

typedef enum { LED_on, LED_off, etc } Action;
typedef struct Queued_Action QueuedAction;

struct Queued_Action
{
    Action       action;
    int          value;
    QueuedAction *nextAction;
};

到目前为止,一切都很好。如果我将指向队列中第一个和最后一个项目的指针定义为:

QueuedAction *firstAction;
QueuedAction *lastAction;

...然后我希望能够通过说明(例如)将新操作添加到队列中:

if (!add_action_to_queue(LED_on, 100, &lastAction))
     printf("Error!\n);

...所以返回时,lastAction 将是指向队列中新创建的最后一个操作的指针。因此,将操作添加到队列的例程如下所示:

int add_action_to_queue(Action newAction, int newValue, QueuedAction **lastAction)
{
    QueuedAction *newQueuedAction;

    // Create a new action in memory
    if ((newQueuedAction = (QueuedAction *)malloc(sizeof(QueuedAction))) == NULL)
        return 0;

    // Make the old 'lastAction' point to the new Action, 
    // and the new Action to point to NULL:
    *lastAction -> nextAction = newQueuedAction;
    newQueuedAction -> nextAction = NULL;
    newQueuedAction -> action = newAction;
    newQueuedAction -> value = newValue;

    // Designate the new Action as the new lastAction:
    *lastAction = newQueuedAction;
    return 1;
}

一切都会好起来的,除了这段代码无法编译。错误是在行说

*lastAction -> nextAction = newQueuedAction;

...编译器声称“->”左侧的项目不是有效的结构。然而,确实必须如此。如果事实上我做了应该完全多余的转换:

fakeAction = (QueuedAction *)(*lastAction);
fakeAction -> nextAction = newQueuedAction;

...那么编译器就很高兴了。然而,我担心错误消息暗示着我可能在这里做错了一些微妙的事情。所以(言归正传),谁能告诉我为什么编译器不高兴,以及是否有更好的方法来完成我在这里尝试做的事情。


你有没有尝试过:

(*lastAction) -> nextAction = newQueuedAction;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 C 语言实现 FIFO 队列 的相关文章

  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • C# 中四舍五入到偶数

    我没有看到 Math Round 的预期结果 return Math Round 99 96535789 2 MidpointRounding ToEven returning 99 97 据我了解 MidpointRounding ToE
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • 导出类时编译器错误

    我正在使用 Visual Studio 2013 但遇到了一个奇怪的问题 当我导出一个类时 它会抛出 尝试引用已删除的函数 错误 但是 当该类未导出时 它的行为会正确 让我举个例子 class Foo note the export cla
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 我可以仅在少数情况下关闭模拟吗

    我有一个始终使用模拟的应用程序 但是 当用户以管理员身份登录时 一些操作需要他们写入服务器本身 现在 如果这些用户在实际服务器上没有权限 有些用户没有 则不会让他们写入 我想做的是关闭几个命令的模拟 有没有办法做这样的事情 using Ho
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 使用 AdHocWorkspace 会导致“不支持语言‘C#’”。

    在VS2015中使用Microsoft CodeAnalysis CSharp Workspaces的RC2 这段代码会抛出异常 var tree CSharpSyntaxTree ParseText var workspace new A
  • 系统错误 124 - SHFileOperation 的 ERROR_INVALID_LEVEL

    我在使用时遇到问题SHFileOperation SHFileOperation SHFILEOPSTRUCT https stackoverflow com questions 9191415 shfileoperation shfile
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t

随机推荐

  • 企业库验证块的 Asp.Net MVC 2 客户端验证实现

    我找到了一个非常好的文章 http bradwilson typepad com blog 2009 10 enterprise library validation example for aspnet mvc 2 html关于如何在 M
  • TCP 代理:在后端不可用时保持连接

    在 Docker 设置的上下文中 我想使用类似大使的模式来允许某些容器 例如数据库服务器 正常重新启动 而不必重新启动所有依赖的容器 例如 Web 服务器 并且没有错误消息 因为 数据库服务器不可用 因此 我想知道 是否有一个 TCP 代理
  • Android - 在运行时更改自定义标题视图

    我在应用程序中为每个活动使用自定义标题视图 在其中一项活动中 根据按钮点击 我需要更改自定义标题视图 现在 每次我调用 setFeatureInt 时 这都可以正常工作 但是 如果我尝试更新自定义标题中的任何项目 例如更改标题上的按钮文本或
  • Swift 3 需要更多信息来推断参数?

    我有一个向上冒泡的延伸部分 但在 Swift 3 中 无法推断通用参数 T public extension UIResponder public func next
  • QCustomPlot - 在 QCPAxisRect 上显示 customPlot 下方的项目

    在一个类似的项目中QCustomPlot 财务演示 http qcustomplot com index php demos financialchartsdemo我不仅想在图表区域中绘制一个 QCPItemRect 还想在图表下方的区域中
  • django:在多表继承中遵循向后到子类的关系

    我欢迎任何有关我的问题的帮助 我试图在多表继承情况下将关系向后跟踪到子类 IE 我想要一个特定州所有餐馆的查询集 这是我的问题的一个简化示例 对 django 文档中的eg进行修改 from django db import models
  • 如何获取 PHP 中的 Subversion 修订号?

    我想让我的 PHP 应用程序标有它使用的修订号 但我不想使用巡航控制 http en wikipedia org wiki CruiseControl或每次更新文件并上传 我该怎么做呢 SVN关键字并不是一个好的解决方案 正如其他人指出的那
  • 使用 javascript 创建一个新的空文档

    我正在使用一些非常不直观的 xml 所有标签都是 TX H VC 我想复制这些数据 但将所有标签重命名为它们的实际含义 我可以创建一个新的空文档来放入新的 命名良好的标签吗 我试过这个 doc new DOMParser parseFrom
  • Android:如何将先前的 Activity Intent 传递到列表视图中

    我有两项活动 Activity A Activity B In Activity A我有一个EditText Button and Image View And in 活动B我有一个Listview和 listView 视图包含 Custo
  • Sql 优化:Xml 或分隔字符串

    希望这只是一个简单的问题 涉及 Sql 2008 中的查询时的性能优化 我曾在一些公司工作过 这些公司在 ETL 流程以及一些网站中大量使用存储过程 我见过这样的场景 他们需要根据一组有限的键值检索特定记录 我已经看到它以 3 种不同的方式
  • Firebase 在服务器配置中不断抛出 OAuth2 客户端 ID 未找到

    我正在尝试使用 Firebase 将我的 Google 用户登录到我的应用程序 但每次使用以下方法时 都会收到此错误 An internal error has occured OAuth2 client id in server conf
  • 将 aar 文件发布到 Maven Central,Gradle 不起作用

    将 aar 文件发布到 Maven Central Gradle 仍然无法工作 好吧 让我们重复我遵循的所有步骤来设法 使用 Gradle 将 aar 文件发布到 Maven Central 我主要遵循这个guide https githu
  • 是否可以重定向用户以启动扫描仪应用程序?

    我正在编写一个应用程序来显示上传的文档python3 django 1 8 1 我们还希望允许用户扫描文档 如您所知 javascript 中有一个打印对话框 window print 浏览器是否支持扫描文档 是否可以使用 javascri
  • 在 C++ 中检查向量的所有元素是否相等

    如果我有一个值向量并且想要检查它们是否都相同 那么在 C 中有效执行此操作的最佳方法是什么 如果我用其他语言 例如 R 进行编程 我的想法是仅返回容器的唯一元素 然后如果唯一元素的长度大于 1 我知道所有元素不可能相同 在 C 中 可以这样
  • 如何使用 PHP 创建 .gz 文件?

    我想使用 PHP 在我的服务器上 gzip 压缩文件 有人有一个输入文件并输出压缩文件的例子吗 这段代码可以解决问题 Name of the file we re compressing file test txt Name of the
  • 非常简单的文件附加器日志记录不起作用

    这是我的 web config 信息
  • ScrollView 中的 ViewPager

    我需要有一个ViewPager里面一个ScrollView but ViewPager只是在进入时不会出现ScrollView 当我不使用时一切正常ScrollView 我在 stackoverflow 或其他网站上看到了一些类似的问题 所
  • BASH:如何在循环中创建动态数组名称

    这是我尝试过的 n 0 for i in aaa bbb ccc do array i n date N n done n 0 for i in aaa bbb ccc do echo array i n n done 有什么想法如何使动态
  • 找不到命名空间错误

    我有以下设置 enums ts export enum DocumentType Email 0 Unknown 1 remote ts
  • 用 C 语言实现 FIFO 队列

    对于嵌入式应用程序 我尝试使用 ANSI C 实现先进先出 FIFO 结构队列 最直接的方法似乎是通过实现链表 以便每个结构包含指向队列中下一个的指针 因此我将结构本身定义为 typedef enum LED on LED off etc