C 通用数组实现

2024-01-03

我正在尝试在 C 中实现通用数组列表。但是,当数据类型是 int 以外的任何类型时,列表将不会包含正确的数据。例如,像 123.1234 作为双精度数,当将双精度数传递到列表中时,它将变成 000.0000。一、当数据类型为int时,它将有正确的值。我不知道哪部分代码是错误的,有人可以给我提示吗?谢谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "genericADT.h"

struct list_type {
   void *data;
   int elementSize;
   int size;
   int capacity;
};

ListType create(int elementSize) {
   ListType listptr = malloc(sizeof(struct list_type));

   if (listptr != NULL) {
      listptr->size = 0;
      listptr->capacity = 10;
      listptr->elementSize = elementSize;
      listptr->data = malloc(10 * (listptr->elementSize));
      if (listptr->data == NULL) {
         free(listptr);
         listptr = NULL;
      }
   }
   return listptr;
}

void push(ListType listptr, void *item) {
   if (listptr->size >= listptr->capacity) {
      void *temp = realloc(listptr->data, listptr->elementSize * (listptr->capacity + 100));
      if (temp != NULL) {
         listptr->capacity += 100;
         listptr->data = temp;

         memcpy(listptr->data + (listptr->size) * (listptr->elementSize), item, sizeof(listptr->elementSize));
         listptr->size++;
      }
   } else {
      memcpy(listptr->data + (listptr->size) * (listptr->elementSize), item, sizeof(listptr->elementSize));
      listptr->size++;
   }
}

void *get(ListType listptr, int index) {
   return listptr->data + index * (listptr->elementSize);
}

int size_is(ListType listptr) {
   return listptr->size;
}

您的代码中存在一些小问题,但它可以正确处理双精度值。

首先,正如 @n.m. 注意到的,你真的想使用listptr->elementSize代替sizeof(listptr->elementSize)

接下来,当您想要进行指针算术时,您应该将数据声明为char *并不是void *

最后作为基本优化,您在容量测试后提取实际的插入代码,而不是在两个分支中复制它。

但在这些修复之后,这个 main 正确地存储和提取双精度:

int main() {
    ListType ls = create(sizeof(double));
    double f1=1.5, f2=3.6;
    push(ls, &f1);
    push(ls, &f2);
    printf("Got %f %f\n", *((double *) get(ls, 0)), *((double *) get(ls, 1)));
    return 0;
}

它按预期打印:

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

C 通用数组实现 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 如何将我的图例组织成子组?

    我的条形图的图例当前在一个长列表中列出了图中的所有项目 我希望每列都有图例组 列数是动态的 因此图例必须能够相应调整 library phyloseq packageVersion phyloseq library ggplot2 libr
  • 如何在 Perl 中将简单数组编码为 JSON?

    我见过的所有在 Perl 中将对象编码为 JSON 字符串的示例都涉及哈希 如何将简单数组编码为 JSON 字符串 use strict use warnings use JSON my arr this is my array my js
  • 从 NSInspiration 获取参数值

    有人可以解释一下如何将值传递给使用时被拦截的不存在的方法 void forwardInvocation NSInvocation anInvocation NSMethodSignature methodSignatureForSelect
  • getLocationOnScreen/getLocationInWindow 中的坐标不正确

    致电getLocationOnScreen or getLocationInWindow 都给我一个top Y坐标大约 30px 状态 通知栏的高度 太低了 这left X坐标完全正确 正如我上面所暗示的 我相信差异是因为状态 通知栏 我可
  • 有没有一种简单的方法将 Swing 接口与数据源绑定

    我正在使用 WindowBuider 对 Swing 应用程序的管理部分进行编程 它基本上是充满了我需要对其进行 CRUD 操作的项目的表格 数据来自MySQL数据库 我可以手动完成 但是需要很长时间 有没有一种简单的方法可以做到这一点 使
  • 有人可以解释 Javascript 中 .indexOf() 的逻辑吗?

    function vowelsAndConsonants s var vowels a e i o u for let i 0 i
  • win32gui 获取当前活动应用程序名称

    我刚刚学习Python 对它来说相对论还很陌生 我创建了以下脚本 它将获取当前活动窗口标题并将其打印到窗口 import win32gui windowTile while True newWindowTile win32gui GetWi
  • Rails - 查看日志文件中生成的 SQL 查询

    有没有一种方法可以像在开发中一样在生产环境中查看 Rails 生成的所有查询 是的你可以 如果您进入 config environments production rb 文件 会有这样的部分 See everything in the lo
  • CSRF 令牌在登录期间过期

    我正在开发 Spring Web 应用程序 我需要避免登录页面上的 csrf 令牌过期问题 因为如果用户等待太长时间并尝试登录 解决 csrf 问题的唯一方法是重新加载页面并尝试再次登录 但这对用户不友好 我想避免这种情况 第一个问题 一般
  • 有什么方法可以以编程方式选择 TextView 中的文本吗?

    我有一个TextView我希望允许用户搜索特定的字符串 如果找到该字符串 它应该突出显示 使用背景跨度太慢而且很尴尬 所以我想弄清楚是否可以让它选择字符串 我知道与EditText这可以使用setSelection 但我不希望用户能够编辑文
  • 富文本框到字符串

    我有一个绑定到菜单项的富文本框 以允许粗体 斜体和下划线以及剪切 复制和粘贴 但是如何获取 RichTextBox 内容并将其从代码隐藏转换为字符串哪个将带有粗体 斜体等
  • 使用 Alamofire 处理超时

    是否可以为 Alamofire 请求添加超时处理程序 在我的项目中 我这样使用 Alamofire init let configuration NSURLSessionConfiguration defaultSessionConfigu
  • 我需要将 constexpr 放在 else-if 之后吗?

    灵感来自这个答案 https stackoverflow com a 52355930 7151494 我尝试复制并粘贴 并在中添加测试main 这段代码 template
  • Perl 5 中存在哪些伪运算符?

    我目前正在记录 Perl 5 的所有运算符 请参阅佩洛普夫 http github com cowens perloprefGitHub 项目 我决定也包含 Perl 5 的伪运算符 对我来说 Perl 中的伪运算符是任何看起来像运算符的东
  • C - 取消引用空指针

    我正在尝试创建自己的交换函数 但遇到了麻烦 为什么我收到 取消引用空指针 void ft swap void a void b size t nbytes unsigned char cur a unsigned char cur b si
  • IBM Worklight - 页面碎片

    我正在尝试将现有的phonegap 项目迁移到worklight 中 Phonegap 应用程序使用 mobile changePage 进行页面导航 这个函数会重新加载现有的 DOM 还是创建一个新的 DOM 由于worklight建议使
  • yii2详细视图条件行类

    我想根据条件更改详细视图中单个属性的类 如果我不想让它成为有条件的 它会像这样工作 attribute gt ungueltig format gt boolean contentOptions gt class gt danger 我希望
  • 无法调试 dotnet core GenericHost docker 容器

    我在最新的 Windows 版本 Windows 10 2004 上使用 Linux 容器 并启用了 WSL 2 和 Docker Desktop 2 3 0 3 45519 我右键单击 docker compose 文件 然后选择Set
  • Android:将数组保存到应用程序数据

    是否可以将整个数组 甚至ArrayList 保存到android应用程序数据中 据我所知 你只能做像 putInt putBoolean 或 putString 这样的事情 但是更复杂的数据类型呢 有没有办法做到这一点 或者我是否必须先将整
  • C 通用数组实现

    我正在尝试在 C 中实现通用数组列表 但是 当数据类型是 int 以外的任何类型时 列表将不会包含正确的数据 例如 像 123 1234 作为双精度数 当将双精度数传递到列表中时 它将变成 000 0000 一 当数据类型为int时 它将有