我基本上了解了缓冲区是什么。
缓冲区是存储流数据直到其他人需要它为止的临时位置。但我也读到,只有完全填满它才能提供数据。
int setvbuf(FILE *stream, char *buf, int mode, size_t size)
据我所知,这是 setvbuf 函数的参数,用于为流在内存中分配缓冲区。但是我刚刚学习 C,我不明白为什么这里需要一个名为 buf 的指向 char 的指针。事实证明,我需要有一个缓冲区才能创建缓冲区。据我所知,指向 char 的指针可以是指向字符、字符串、数字或多个数字的指针,而且似乎如果您只需要将某些内容传递给函数,那么您就可以编写指向 char 的指针。你能向我解释一下缓冲区如何工作以及为什么我需要一个缓冲区来创建缓冲区吗?
我正在用 C 语言编写一个小型控制台游戏。该游戏是一个 3D 扫雷游戏,可以沿轴线调整场地的长度。我将游戏字段存储在一个变量中field
,该变量是一个动态数组,其元素是字符串(即长度为 3 的字符数组)。因此该字段是一个二维字符数组(如果我对指针/数组逻辑的理解是正确的)。
在编写程序的过程中,我决定按照“一个功能-一个文件”的原则将代码拆分到多个文件中。我将负责内存分配的那段代码原封不动地移到了函数中int mem(char** field, size_t field_size)
。
代码本身:
int mem(char** field, size_t field_size)
{
size_t i;
field = malloc(field_size * sizeof(field[0]));
if (field == NULL) {
free(field);
return 1;
}
for (i = 0; i < field_size; i++)
field[i] = NULL;
for (i = 0; i < field_size; i++) {
field[i] = malloc(3 * sizeof(field[0][0]));
}
for (i = 0; i < field_size; i++) {
if (field[i] == NULL) {
free_field(field, field_size);
return 2;
}
}
return 0;
}
函数free_field(field, field_size)
——一个手写函数,用于释放在字段中分配的内存。
问题是,将此逻辑移至单独的文件后,field
调用该函数后,默认的 NULL 仍保留在变量中。而且检查发现,函数内部的内存分配是正确的(函数本身内部肯定是被调用的main()
,所以问题不在于我忘记写它的调用)。所以我怀疑问题在于field
它开始被视为函数本身的内部变量,并且内部的任何更改都不会影响field
主程序中的原始变量。
我是否正确理解了这种情况?纠正它的最佳方法是什么?我是否应该重写该函数以便它接收的不是自身field
而是对它的引用?
需要从程序(用 C 编写)获取 UEFI/BIOS 制造/组装日期。
该程序设计专门在 Windows 10/11 下运行。
我已经使用下面的代码获得了 UEFI/BIOS 版本。在注册表中手动搜索后,我没有找到“Date BIOS”的单独键。 Windows注册表中是否有这样的信息?或者 WinAPI 工具(至少是最简单的工具)还不够吗?
#include <stdio.h>
#include <Windows.h>
int main(int argc, char* argv[])
{
HKEY rKey;
TCHAR Reget[256];
DWORD RegetPath = sizeof(Reget);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\BIOS", NULL, KEY_QUERY_VALUE, &rKey);
RegQueryValueEx(rKey, L"BIOSVersion",NULL,NULL, (LPBYTE)&Reget,&RegetPath);
printf("%ls", Reget);
getchar();
return 0;
}
(代码不是我的;由 stackoverflow 用户 @Marchosias 发布)
尝试调试 RP2040(R-Pi Pico)上的固件时,OpenOCD 给出错误“错误:未知闪存设备(ID 0x00184068)”
该板有一个存储芯片“BY25Q128ES - 128M BIT SPI NOR FLASH”
在Raspberry Pi 论坛上,他们讨论了修补文件src/flash/nor/spi.c 的必要性
我找到了内存芯片的数据表,但我不太明白我需要在其中查找哪些参数才能正确填写FLASH_ID
宏本身创建该类型的对象flash_device
并具有签名:
/// @file: src/flash/nor/spi.h
/* data structure to maintain flash ids from different vendors */
struct flash_device {
const char *name;
uint8_t read_cmd;
uint8_t qread_cmd;
uint8_t pprog_cmd;
uint8_t erase_cmd;
uint8_t chip_erase_cmd;
uint32_t device_id;
uint32_t pagesize;
uint32_t sectorsize;
uint32_t size_in_bytes;
};
#define FLASH_ID(n, re, qr, pp, es, ces, id, psize, ssize, size) \
{ \
.name = n, \
.read_cmd = re, \
.qread_cmd = qr, \
.pprog_cmd = pp, \
.erase_cmd = es, \
.chip_erase_cmd = ces, \
.device_id = id, \
.pagesize = psize, \
.sectorsize = ssize, \
.size_in_bytes = size, \
}
/// @file: src/flash/nor/spi.c
// ....
/* Shared table of known SPI flash devices for SPI-based flash drivers. Taken
* from device datasheets and Linux SPI flash drivers. */
const struct flash_device flash_devices[] = {
/* Note: device_id is usually 3 bytes long, however the unused highest byte counts
* continuation codes for manufacturer id as per JEP106xx.
*
* All sizes (page, sector/block and flash) are in bytes.
*
* Guide to select a proper erase command (if both sector and block erase cmds are available):
* Use 4kbit sector erase cmd and set erase size to the size of sector for small devices
* (4Mbit and less, size <= 0x80000) to prevent too raw erase granularity.
* Use 64kbit block erase cmd and set erase size to the size of block for bigger devices
* (8Mbit and more, size >= 0x100000) to keep erase speed reasonable.
* If the device implements also 32kbit block erase, use it for 8Mbit, size == 0x100000.
*/
/* name read qread page erase chip device_id page erase flash
* _cmd _cmd _prog _cmd* _erase size size* size
* _cmd _cmd
*/
FLASH_ID("st m25pe10", 0x03, 0x00, 0x02, 0xd8, 0x00, 0x00118020, 0x100, 0x10000, 0x20000),
//....
FLASH_ID("st m25p05", 0x03, 0x00, 0x02, 0xd8, 0xc7, 0x00102020, 0x80, 0x8000, 0x10000),
//...
FLASH_ID("sp s25fl512s", 0x13, 0x00, 0x12, 0xdc, 0xc7, 0x00200201, 0x200, 0x40000, 0x4000000),
在这种情况下,什么是“pagesize
和” sectorsize
?
在闪存芯片的数据表中它应该叫什么?
简介:
我不是专家,现在我需要编程来解决一个应用问题:用 C 编程语言创建简单物理模型的动态可视化。我在互联网上发现有一个流行的图形渲染库:SDL3 - 我想使用它
我在 VSCode 中编写代码,通过 cl 进行编译
网上的所有指南要么是针对其他 IDE,要么是针对其他编译器(例如 mingw64),使用 chatGPT 提示手动安装失败
因此,我需要一个非专业人员也能理解的程序来将这个库连接到项目中。