目前我们正在学习如何编程AVR微控制器(仅限Ansi C89标准).部分包含的驱动程序是一个标题,用于处理调度,即以不同的速率运行任务.我的问题是与文档中的引用有关:
"每个任务必须通过使用静态局部 变量来维护自己的状态."
那是什么意思呢?他们似乎传递void*给维持状态的功能但是不使用它?
看一下我收集的文件中的代码,这就是他们的意思:
{.func = led_flash_task, .period = TASK_RATE / LED_TASK_RATE, .data = 0}
/* Last term the pointer term */
Run Code Online (Sandbox Code Playgroud)
有一个函数在数组中使用上述参数运行,但它只作为调度程序.然后功能led_flash_task是
static void led_flash_task (__unused__ void *data)
{
static uint8_t state = 0;
led_set (LED1, state); /*Not reall important what this task is */
state = !state; /*Turn the LED on or off */
}
Run Code Online (Sandbox Code Playgroud)
并从标题
#define __unused__ __attribute__ ((unused))
Run Code Online (Sandbox Code Playgroud)
而传递void *data是为了维持任务的状态?这是什么意思?
谢谢您的帮助
我被迫使用第三方加密狗访问库,提供包含文件'sense4.h',其代码如下:
#if !defined _WINDOWS_
#define WINAPI
#define CONST const
typedef unsigned char UCHAR;
typedef unsigned short USHORT;
typedef unsigned int UINT;
typedef unsigned long ULONG;
typedef char CHAR;
typedef char TCHAR;
typedef void VOID;
...
#endif /* !defined _WINDOWS */
...
unsigned long WINAPI S4Startup(
VOID
);
unsigned long WINAPI S4Cleanup(
VOID
);
...
Run Code Online (Sandbox Code Playgroud)
问题是g ++ 4.6.1抱怨使用typedefed VOID的代码行:
sense4.h:375:9: error: ‘<anonymous>’ has incomplete type
sense4.h:376:1: error: invalid use of ‘VOID {aka void}’
sense4.h:383:9: error: ‘<anonymous>’ has incomplete type
sense4.h:384:1: error: …Run Code Online (Sandbox Code Playgroud) 我想知道为什么以下代码:
void foo(void);
void foo()
{
}
Run Code Online (Sandbox Code Playgroud)
在gcc中有效.在C中,没有重载和上面的声明(事实上,其中一个是定义)声明两个不同的函数(第一个不接受任何参数,第二个可以接受任何数量的参数)类型).
但是,如果我们为第一个函数提供定义:
void foo(void)
{
}
void foo()
{
}
Run Code Online (Sandbox Code Playgroud)
由于重新定义,此次编译失败.但是,第一个代码仍然是正确的,可能会令人困惑,如下所示:
void foo(void);
int main(void)
{
foo(); //OK
//foo(5); //Wrong, despite ->the definition<- allows it
}
void foo()
{
}
Run Code Online (Sandbox Code Playgroud)
另一方面,这样的事情是无效的:
void foo(int);
void foo() //error: number of arguments doesn't match prototype
{
}
Run Code Online (Sandbox Code Playgroud)
我认为与我的第一个前面的代码相比,编译器的行为有点奇怪.int是不等于(/*empty list*/),也不是void.
有谁能解释一下?
我正在编写一个基本的 C++ 程序来计算一条线的长度和斜率。用户输入一组 x 和 y 坐标点,然后程序会显示一个菜单,询问用户他/她是否只想计算斜率、仅计算长度,或同时计算斜率和长度。但是,我的 void Menu 函数出现错误,指出该变量具有不完整的类型“void”。我现在的代码如下。
#include <iostream>
#include <cmath>
void Menu (int& MenuNum);
void CalculateSlope (int& X1, int& X2, int& Y1, int& Y2);
void CalculateLength (int& X1, int& X2, int& Y1, int& Y2);
using namespace std;
int main(int argc, const char * argv[])
{
int X1;
int X2;
int Y1;
int Y2;
int MenuNum;
//Ask User for Points
cout << "Enter points (X1,Y1) and (X2,Y2) for the line." << endl;
cout << " " << …Run Code Online (Sandbox Code Playgroud) 我使用void指针在C中实现了一个基本的队列结构.程序如下:
memcpy()它有一个本地副本.结构本身看起来像这样:
struct queue
{
void* start; //pointer to the beginning of queue
void* end; //-||- to the end
size_t memsize; //size of allocated memory, in bytes
size_t varsize; //size of a single variable, in bytes
void* initial_pointer; //position of the start pointer before pop() operations
};
Run Code Online (Sandbox Code Playgroud)
start和end只是指向当前分配的内存块中某个位置的void指针.如果我在队列上推送元素,我将结束指针递增varsize.如果我pop(),我只是递减结束指针varsize.
我不认为我应该在这里发布功能代码,它超过100行.
问题:这被认为是好的还是坏的做法?为什么不)?
注意:我知道C中的队列还有很多其他选项.我只是询问这个的质量.
编辑:可以在这里获得实现:http:// 89.70.149.19 /stuff/queue.txt(删除空格)
我正在测试一个仅返回 void 的主函数,并且在使用以下命令运行位码时出现核心转储错误(信号 65 或 73)lli:
define void @main() {
entry:
ret void
}
Run Code Online (Sandbox Code Playgroud)
这是 LLVM 的限制lli还是完全非法?
我很清楚,在 C++ 中,返回类型为 void 的 main 函数的声明是不正确的。事实上,我已经用 Clang 尝试过这个(这只是一个警告),并得到几乎相同的代码(由于属性的原因并不完全相同#0,但足够接近,我相信这些差异不会导致这个问题):
; Function Attrs: nounwind
define void @main() #0 {
entry:
ret void
}
Run Code Online (Sandbox Code Playgroud) 我知道 void 不返回任何值。那么它是如何与函数结合使用的呢?
我的理解是,函数的目的是在对其进行处理后返回一条信息。
那么为什么我不想返回任何价值,这将如何成为受益者?
我试图std::enable_if在C++ 11中更好地理解并且一直在尝试编写一个最小的例子:一个A具有成员函数的类,void foo()它具有基于T类模板中的类型的不同实现.
下面的代码给出了期望的结果,但我还没有完全理解它.为什么版本V2有效,但不是V1?为什么U需要"冗余"类型?
#include <iostream>
#include <type_traits>
template <typename T>
class A {
public:
A(T x) : a_(x) {}
// Enable this function if T == int
/* V1 */ // template < typename std::enable_if<std::is_same<T,int>::value,int>::type = 0>
/* V2 */ template <typename U=T, typename std::enable_if<std::is_same<U,int>::value,int>::type = 0>
void foo() { std::cout << "\nINT: " << a_ << "\n"; }
// Enable this function if T …Run Code Online (Sandbox Code Playgroud) void f()
{}
void f(int)
{
return f(); // #1: ok
}
void g(auto fn)
{
f(fn());
}
int g1()
{
return 0;
}
void g2()
{}
int main()
{
g(g1); // #2: ok
g(g2); // #3: error
}
Run Code Online (Sandbox Code Playgroud)
C++ 允许显式返回一个空值,如 所示#1,我认为它是优雅和通用的。
但是,不能以#3相同的方式应用该规则。
为什么 C++ 不允许将 void 参数传递给具有零参数的函数?
所以我想创建一个Mono<Void>(或任何Mono<SomeIgnorableType>)实际发出元素的。为什么?因为我实际上想运行一个效果,而结果只是意味着该效果已运行,但是,它可以被忽略。
在 Haskell 中,Void 是一种不适宜居住的类型……就像NothingScala 中的一样。在 Java 中,Void 也是不适宜居住的,但它的使用方式更像是UnitScala 中的类型或()Haskell 中的 (0 arity tuple)。一种只有一个居民的类型。
好吧,理论太多了。到目前为止我的选择:
Mono.just((Void) null)抛出异常。
Mono.empty().single()(因为我实际上想发出一个事件),当有人订阅它时,最终会失败。和...
Mono.just("something").then()运行效果,但我无法将它与其他单声道链接,因为它只发出完整和错误事件。
又怎样???