我已经看到以下代码片段重复用于Linux hwmon设备:
return sprintf(buf, "%d\n", in_input);
Run Code Online (Sandbox Code Playgroud)
哪里buf是烧焦的指针char *buf,并in_input通常是一个int或u16.目的是将从设备读回的值复制到为此设备属性创建的sysfs文件.
举个例子,你可以看看Linux/drivers/hwmon/mcp3021.c(或4.9内核以前的任何hwmon设备).您可以看到第81行的函数返回a u16,而第99行的代码将其存储u16到char *buf.
81 static inline u16 volts_from_reg(struct mcp3021_data *data, u16 val)
82 {
83 return DIV_ROUND_CLOSEST(data->vdd * val, 1 << data->output_res);
84 }
85
86 static ssize_t show_in_input(struct device *dev, struct device_attribute *attr,
87 char *buf)
88 {
89 struct i2c_client *client = to_i2c_client(dev);
90 struct mcp3021_data *data = i2c_get_clientdata(client);
91 int reg, in_input; …Run Code Online (Sandbox Code Playgroud) 我一直在使用struct数组的概念遇到很多麻烦.我把一些基本代码放在一起.这段代码的输出不是我预期的.我想知道是否有人可以解释为什么这段代码的行为方式.
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
struct DataRow
{
std::string word1;
std::string word2;
std::string word3;
};
void getRow( std::string line, DataRow** dataRowPointer, int index )
{
std::stringstream sline(line);
std::string word;
int wordIndex = 0;
*dataRowPointer = new DataRow[3];
while( sline >> word )
{
if ( wordIndex == 0 )
{ (*dataRowPointer)[index].word1 = word; }
else if ( wordIndex == 1 )
{ (*dataRowPointer)[index].word2 = word; }
else
{ (*dataRowPointer)[index].word3 = word; }
wordIndex++;
}
}
int …Run Code Online (Sandbox Code Playgroud) 当我尝试将字符串值分配给结构的成员时,我的程序崩溃了.我怀疑结构中的成员(字符串类型)从未在内存中正确分配.
这是我的代码供参考:
#include <string>
#include <sstream>
struct DataRow
{
std::string result;
float temp;
struct DataRow* next;
};
int main( )
{
DataRow* node = (DataRow*)malloc(sizeof(DataRow)); // Allocation of memory for struct here
int currentLoc = 0;
std::string dataLine = "HUUI 16:35:58 54.4 25.1 PDJ 1 MEME PPP PS$% sc3 BoomBoom SuperPower P0 123 25.86 0 11.1 1.0 50.0 W [2.0,0.28] 1.15 [5,6,100]";
std::string dataWord;
std::stringstream sDataLine( dataLine );
while ( sDataLine >> dataWord )
{
if( currentLoc == 0 ) …Run Code Online (Sandbox Code Playgroud) 我正在计划一个关于主动噪声消除的微控制器项目。
这个想法是:
我的问题是:
C中是否有任何函数可以进行原子读 - 修改 - 写?我想在一个原子块中读取一个值,然后设置为0.
对于C++,有std :: atomic :: exchange(),这正是我正在寻找的.C中有相应的东西吗?
这是代码:
void interruptHandler(void) {
/* Callback attached to 3rd party device driver, indicating hardware fault */
/* Set global variable bit masked flag to indicate interrupt */
faultsBitMask |= 0x1;
}
void auditPoll(*faults) {
*faults = faultsBitMask;
/* !!! Need to prevent interrupt pre-empt here !!! */
/* Combine these two lines to a single read-modify-write? */
faultsBitMask = 0;
}
Run Code Online (Sandbox Code Playgroud)
目标架构是PowerPC.
谢谢您的帮助!
我是C++的新手所以请耐心等待.
当没有有效值分配给成员时,是否有最佳实践来初始化构造函数中的成员?
例如:
device_123::device_123(data_struct_t * initData)
{
if(initData==NULL)
{
print_error(0);
// what to initialize foo/bar to?
}
else
{
foo = initData->foo;
bar = initData->bar;
}
}
Run Code Online (Sandbox Code Playgroud)
在"initData == NULL"的情况下,是否有一种干净的方式来初始化foo和bar说:"嘿,我们实际上没有得到分配给我们的正确值".
我知道这个问题可能听起来特定于我的代码实现应如何解释foo/bar,但我只是想知道是否有最佳实践.
我用这段代码得到了Concurrent Modification Exception错误:
Iterator iterateBids = bidders.iterator();
Person nextBidder;
bidders.add(bid.getBidder());
if (highestBid == null) {
// There is no previous bid.
highestBid = bid;
while (iterateBids.hasNext()) {
//nextBidder = (Person) iterateBids.next();
((Person) iterateBids.next()).bidUpdate(this, bid);
}
return true;
} else if (bid.getValue() > highestBid.getValue()) {
// The bid is better than the previous one.
highestBid = bid;
while (iterateBids.hasNext()) {
nextBidder = (Person) iterateBids.next();
nextBidder.bidUpdate(this, bid);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
bidders是一个包含Person的HashSet.错误发生在"nextBidder =(Person)iterateBids.next();" 该代码会查找高于当前出价的出价.如果更高,则迭代设置的投标人并执行bidUpdate()方法.
我如何同时修改和迭代?