小编Jab*_*cky的帖子

链表头双指针传递

我在一些书/教程中看到过这个。

当您将(链表的)头指针传递给函数时,您需要将其作为双指针传递。

例如: // 这是反向链表,其中 head 指向第一个节点。

void nReverse(digit **head)
{
    digit *prev=NULL;
    digit *curr=*head;
    digit *next;

    while(curr!=NULL)
    {
        next=curr->next;
        curr->next=prev;
        prev=curr;
        curr=next;
    }
    *head=prev;
    return;
}
Run Code Online (Sandbox Code Playgroud)

这工作正常。

当我使用单指针时它也有效,

void nReverse(digit *head)
{
    digit *prev=NULL;
    digit *curr=head;
    digit *next;

    while(curr!=NULL)
    {
        next=curr->next;
        curr->next=prev;
        prev=curr;
        curr=next;
    }
    head=prev;
    return;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用头指针打印列表。这两个功能都可以正常工作。

我错过了什么吗?

谢谢,

c c++ reverse linked-list double-pointer

3
推荐指数
1
解决办法
6111
查看次数

识别工作表而不是其名称

可以通过名称来标识工作表,例如:

Dim mysheet As Worksheet
Set mysheet = ThisWorkbook.Sheets("My Sheetname")
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否可以通过名称识别工作表,例如通过某些唯一ID或某些属性或其他任何东西.

我的问题如下:

请参阅上面的代码段:如果用户更改工作表的名称(例如,从"我的工作表名称"更改为"您的工作表名称"),则该代码段显然将不再起作用.

excel vba excel-vba

3
推荐指数
1
解决办法
499
查看次数

写入视频内存(0xB8000)和易失性指针

我正在尝试用C编写自己的小内核,实际上我想写一个print函数来显示字符串.因此,我想写入视频内存(0xB8000).

所以,我试过这样的:

unsigned char *video = (unsigned char *)0xB8000;

*video = 'A';
Run Code Online (Sandbox Code Playgroud)

这实际上有效,但以下不是:

char x = 0;
unsigned char *video = (unsigned char *)(0xB8000 + x);

*video = 'A';
Run Code Online (Sandbox Code Playgroud)

经过一些研究,我认为原因可能是编译器的优化,OSDev给我解决方案:使用volatile关键字.所以我对这个关键字做了一些研究.OSDev建议:

char x = 0;
volatile unsigned char *video = (volatile unsigned char *)(0xB8000 + x);

*video = 'A';
Run Code Online (Sandbox Code Playgroud)

这样,它应该工作.编译器假定video指针指向的值可以更改,然后不进行优化.但是,如果以后我想改变它,比如:

video = (volatile unsigned char *)(video + 2);
Run Code Online (Sandbox Code Playgroud)

我不应该将指针定义为volatile,像unsigned char * volatile video?那么编译器知道地址可以改变吗?

c memory pointers volatile

3
推荐指数
1
解决办法
787
查看次数

IsWindows10OrGreater()在Windows 10上失败

我编写了一段代码来使用GetVersionEx函数检索Windows主要版本和次要版本,但此函数始终返回主要版本6和次要版本2.

MSDN说要使用Version Helper API来查找当前的操作系统.我在Windows 8.1中构建了该项目,并引用了Windows 8.1工具包路径以包含VersionHelpers头文件.VersionHelpers头文件中没有可用的IsWindows10OrGreater()函数.

所以我从GitHub下载了VersionHelper头文件并添加到我的项目中.编译错误消失但IsWindows10OrGreater功能失败.

我做错了吗?

c++ windows winapi visual-c++

3
推荐指数
1
解决办法
3367
查看次数

所有者绘制仅在报表模式下用于ListView吗?

当ListView处于图标模式时,我想在ListView项周围绘制一个矩形,因此我开始阅读有关所有者绘制的文章,我认为这将解决我的问题。

但是,我还读到所有者绘图仅适用于报告模式!在较新版本的Windows(Windows XP和更高版本)下是否仍然如此?

如果仍然如此,那么还有另一种方法可以在ListView项周围绘制矩形吗?

c winapi listview ownerdrawn

3
推荐指数
1
解决办法
107
查看次数

如何“取消提升”流程

我有一个提升的进程,在用户在 UAC 对话框中回答“是”后启动。

该过程开始顺利,一切都按预期进行。

现在我需要在某个时刻“取消提升”该进程,换句话说,该进程不应完全提升,就像用户正常启动它一样。

示例场景

  • 用户A已登录
  • 用户 A 启动进程 P1,该进程将通过 UAC 提升
  • 提升的进程 P1 启动进程 P2,并且 P2 不应提升,而应在用户 A 下再次运行。

有没有办法做到这一点?

c++ winapi

3
推荐指数
1
解决办法
1040
查看次数

c中“argv['A']”是什么意思?

我找到了以下代码,但我不明白它是什么或它是如何工作的。我以前只在 C 中见过argv[n](argv with an integer index) ,从来没有见过像argv['A'].

if(argc != 100) return 0;
if(strcmp(argv['A'],"\x00")) return 0;
if(strcmp(argv['B'],"\x20\x0a\x0d")) return 0;
printf("Stage 1 clear!\n");
Run Code Online (Sandbox Code Playgroud)

这是做什么的?你能解释一下为什么它有效吗?

c

3
推荐指数
1
解决办法
878
查看次数

Reading a WORD variable from a CArchive and casting to int at the same time

This might sound basic but:

WORD wSong = 0;
CArchive ar;
...
ar >> wSong;
m_sPublicTalkInfo.iSongStart = static_cast<int>(wSong);
Run Code Online (Sandbox Code Playgroud)

At the moment I read the WORD into a specific variable and the cast it.

Can I read it in and cast at the same time?

Please note I can't serialize a int. It must be a WORD and cast to int. Or

ar >> wSong;
m_sPublicTalkInfo.iSongStart = static_cast<int>(wSong);
Run Code Online (Sandbox Code Playgroud)

mfc casting carchive

3
推荐指数
1
解决办法
56
查看次数

“大多数 C 系统提供逻辑上无限的浮动值”是什么意思?

最初我将变量 x 和 y 声明为 int 类型:

#include<stdio.h>   

     int main(){
        int x, y = 0 ;
        x = 1 / y;
        printf("%d", x);

        return 0;    
    }
Run Code Online (Sandbox Code Playgroud)

程序崩溃(原因很明显)。

现在我将变量 x 和 y 声明为 double:

#include<stdio.h>   

 int main(){
    double x, y = 0 ;
    x = 1 / y;
    printf("%d", x);

    return 0;    
}
Run Code Online (Sandbox Code Playgroud)

但是输出:0。(为什么?)

然后我在 printf 中将 %d 更改为 %f:

#include<stdio.h>   

 int main(){
    double x, y = 0 ;
    x = 1 / y;
    printf("%f", x);

    return 0;    
}
Run Code Online (Sandbox Code Playgroud)

输出:1.#INF00

我不明白这里发生了什么。 …

c precision divide-by-zero format-specifiers

3
推荐指数
1
解决办法
71
查看次数

面试题-如何连续读取缓冲区而不丢失数据

我是一名嵌入式工程师,经验不多。我在接受采访时被问到了一个问题,我想这并不新鲜,并且已经有了答案:

您有一个不断接收来自外部世界的输入的外设,该外设有一个缓冲区。输入的速率时不时地发生变化。外设需要读取输入缓冲区并对其进行处理。它检查输入消息并查看其是否与配置的过滤器匹配。如果匹配则转发,否则丢弃。

问题如下:

  1. 你如何处理这个问题?
  2. 如果缓冲区满了怎么办?您的缓冲区大小有限?外设仅具有一定的处理缓冲消息的速度。
  3. 如何使缓冲区适应不同的输入速度?

感谢你的帮助。谢谢。

c can-bus spi i2c embedded-linux

3
推荐指数
1
解决办法
378
查看次数