我在C / C ++编程方面经验不足,所以我要求解释。
我将全局数组声明如下。 ASAK它位于进程内存上下文中初始化全局内存的单独内存部分。
Sensor sensorsArray[SENSORS_COUNT] = {dhtTempSensor, dhtHumSensor, dallasTempSensor, waterLevelSensor};
我需要在这个数组中找到元素并返回指向它的指针(因为我要更改它的值)。我写过这样的功能。
Sensor* getSensorById(uint32_t id) {
for (int i = 0; i < SENSORS_COUNT; i++) {
Sensor* current = &sensorsArray[i];
if (current->sensorId == id) {
return current;
}
}
}
它是否正常工作,我不确定current
指针,它是否在堆栈上分配,因此它在函数范围内,是否会在函数结束后从堆栈中跳出来?或者它会正常工作。
我的意思是不是指针(使用&amp; sensorsArray [i]取得的数组元素的地址),但是包含erray元素地址的当前指针变量是否会被加速。
请在这种情况下建议最佳方法。 THX。
答案 0 :(得分:3)
您没有涵盖函数的所有可能返回的情况,即id
与数组的id
中的任何Sensor* sensor_found = nullptr
不匹配的情况。
目前,如果没有匹配,指针将返回数组的最后一个元素。
您可以通过在for
循环外定义指针nullptr
来纠正这种情况,这样如果找不到传感器,则返回值仍然有效,即current
并指定找到的值只有在匹配时才会sensor_found
到Sensor* getSensorById(uint32_t id) {
Sensor* sensor_found = nullptr;
for (int i = 0; i < SENSORS_COUNT; i++) {
Sensor* current = &sensorsArray[i];
if (current->sensorId == id) {
sensor_found = current;
break;
}
}
return sensor_found;
}
。
id
如果找到current
返回nullptr
,否则,如果没有匹配则返回linker command failed with exit code 1 (use -v to see invocation)
。
答案 1 :(得分:1)
您希望确保该函数在其每个执行路径上都有一个有效的return语句。在当前实现中,如果id不匹配,则不设置Sensor *的返回值,并且将包含随机字节。处理这种情况的一个问题是返回nullptr以指示未找到Sensor。除此之外,该功能将正常工作。
Sensor* getSensorById(uint32_t id) {
for (int i = 0; i < SENSORS_COUNT; i++) {
Sensor* current = &sensorsArray[i];
if (current->sensorId == id) {
return current;
}
}
return nullptr; // id not matched
}
答案 2 :(得分:0)
您的代码很好(正如评论所示)。您不必担心code
指针变为无效的原因是因为它指向的内存(即全局数组)在函数范围之外保持有效。只是因为你碰巧创建了一个指针(并且记住,指针实际上只是一个对应于内存中某个位置的数字)并不意味着它在其他地方使用时会变得无效。
当您说library(XML)
doc <- xmlParse("C:/Path/To/XML/File.xml")
# RETRIEVE FRAME ATTRS DATA FOR EACH OBJECT CHILD
timestamp <- c()
timecode <- c()
numberofobjs <- length(xpathSApply(doc, "//Object"))
for (i in (1:numberofobjs)) {
timestamp <- c(timestamp, xpathSApply(doc, sprintf("//Object[%s]/ancestor::Frame", i),
xmlGetAttr, "timestamp"))
timecode <- c(timecode, xpathSApply(doc, sprintf("//Object[%s]/ancestor::Frame", i),
xmlGetAttr, "timecode"))
}
# XPATH TO EACH ATTRIBUTE
type <- xpathSApply(doc, "//Object", xmlGetAttr, "type")
distance <- xpathSApply(doc, "//Object", xmlGetAttr,"DISTANCE")
volume <- xpathSApply(doc, "//Object", xmlGetAttr, "VOLUME")
id <- xpathSApply(doc, "//Object", xmlGetAttr, "id")
id <- sapply(id, function(x) ifelse(is.null(x), NA, x)) # REMOVE NULLS
code <- xpathSApply(doc, "//Object", xmlGetAttr, "code")
code <- sapply(id, function(x) ifelse(is.null(x), NA, x)) # REMOVE NULLS
# COMBINE LISTS INTO DATA FRAME
xmldf <- data.frame(timecode = unlist(timecode),
timestamp = unlist(timestamp),
type = unlist(type),
distance = unlist(distance),
volume = unlist(volume),
id = unlist(id),
code = unlist(code))
时,如果current
存储在内存中,比如位置Sensor *current = &sensorArray[i];
,那么sensorArray[i]
,无论在何处使用, 0x10
仍将位于记忆位置current = 0x10
。当您为sensorArray[i]
分配值时,您没有从传感器复制值,而只是获取指向它的指针。