RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-185348

eanmos's questions

Martin Hope
eanmos
Asked: 2020-05-25 03:03:40 +0000 UTC

是否可以将悬停伪类分配给伪元素?

  • 0

我有一些元素textarea。我用伪元素设置了它的滚动条-webkit-scrollbar-*。将鼠标悬停在滚动条上时,如何将光标更改为抓取?换句话说,我需要类似的东西

#questionBodyTextArea::-webkit-scrollbar-thumb:hover {
    cursor: grab;
}

甚至可能吗?

#questionBodyTextArea::-webkit-scrollbar {
    background-color: transparent;
    width: 10px;
}

#questionBodyTextArea::-webkit-scrollbar-thumb {
    background: #ccc;
}

#questionBodyTextArea::-webkit-scrollbar-thumb {
    cursor: grab;
}

#questionBodyTextArea::-webkit-scrollbar-track {
    background: #f5f5f5;
}
<textarea id="questionBodyTextArea">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nec metus sagittis lectus semper commodo. Donec dignissim felis vitae iaculis consequat. Proin rhoncus placerat quam ut condimentum. Proin scelerisque odio id nisi malesuada, in viverra libero placerat. Aliquam at viverra nibh. Ut lacinia gravida lorem, non fermentum dui pellentesque vitae. Suspendisse eget est nec turpis rutrum euismod ac nec erat. Suspendisse vestibulum, elit sit amet maximus gravida, dolor risus cursus massa, vitae vulputate nibh purus et urna. Duis non maximus elit, ut sagittis mauris.Nam fringilla sed tortor quis placerat. Mauris velit enim, suscipit sit amet tincidunt et, mollis eu magna. Nam vel sodales risus. Donec convallis vitae leo ornare accumsan. Cras sed commodo justo, eget posuere nisi. Nullam suscipit commodo laoreet. Aenean malesuada ac odio efficitur ornare. Vestibulum auctor elit at sagittis lacinia. Morbi vel est nec tortor vulputate porttitor. Praesent convallis commodo porta. Donec justo lorem, porta quis tincidunt eu, venenatis vitae turpis. Nulla facilisi. Suspendisse vitae aliquam orci. Ut malesuada nisi neque, sit amet faucibus leo volutpat eu. Proin pulvinar dui sed dolor posuere, et feugiat mi congue.Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum vel lectus fringilla, ullamcorper ipsum ut, sollicitudin dolor. Phasellus pulvinar interdum mollis. Aliquam accumsan, eros sed tincidunt fermentum, nulla magna porta purus, vel ultricies velit orci sit amet velit. Quisque sit amet ex nec erat imperdiet vulputate. Pellentesque iaculis id mauris et hendrerit. Nam egestas tristique dolor, id sagittis sem molestie non. Morbi sodales non metus tincidunt aliquam. Pellentesque nec est nec sapien hendrerit vulputate eget sit amet ipsum. Suspendisse potenti.</textarea>

html
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-12-21 01:05:33 +0000 UTC

如何更改键盘布局?

  • 4

Ilya Birman 的排版布局仅适用于 Mac 和 Windows。对我来说只有四个字符就足够了:

  • Ctrl+ Alt+ -: - (em dash, &mdash);
  • Ctrl+ Alt+ m: - (减号);
  • Ctrl++ Alt: <" (左引号, &laquo;);
  • Ctrl++ Alt: >"(右引号,&raquo;)。

左边是组合键,右边是结果字符。

目前,我在俄语和英语布局之间切换如下:

setxkbmap -model pc105 -layout us,ru -variant , -option grp:alt_shift_toggle

如何更改键盘布局(和us和ru)以便在按下相应的组合键时打印所需的字符?

我重新阅读了一堆mana,包括键盘配置和X键盘扩展,但我仍然不明白如何做到这一点。

linux
  • 2 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-12-19 02:05:11 +0000 UTC

如何在 Verilator 上的 RISC-V 模拟中输出一行文本?

  • 1

我有以下工作:

  1. 根据任务选项更改项目:

    一个。编辑 RISC-V ISA 测试列表 ./sim/tests/riscv-isa/rv32_tests.inc,只留下作业中指定的测试;

    湾。编辑./Makefile以使目标tests仅构建选定的 RISC-V ISA 测试;

    C。修改文件 RVTEST_PASS中的宏。RVTEST_FAIL./sim/tests/common/riscv_macros.h

我的作业选项表的摘录:

+--------+-------------------+--------------+-----+-----------------------------------+
| Вар. 1 |        Тест       | RESET VECTOR | BUS |        Результат теста            |
+--------+-------------------+--------------+-----+-----------------------------------+
|      1 | isa/rv32ui.addi.S |    0x400     | AXI | RVTEST_PASS выводит строку "ok",  |
|        |                   |              |     | RVTEST_FAIL выводит строку "fail" |
+--------+-------------------+--------------+-----+-----------------------------------+

我不知道如何执行点 C,即如何输出一行文本。

我的假设

宏本身RVTEST_PASS看起来RVTEST_FAIL 像这样(链接到riscv_macros.hGitHub 上存储库中的文件行),如下所示:

//-----------------------------------------------------------------------
// Pass/Fail Macro
//-----------------------------------------------------------------------

#define RVTEST_PASS                                                     \
        fence;                                                          \
        mv a1, TESTNUM;                                                 \
        li  a0, 0x0;                                                    \
        ecall

#define TESTNUM x28
#define RVTEST_FAIL                                                     \
        fence;                                                          \
        mv a1, TESTNUM;                                                 \
        li  a0, 0x1;                                                    \
        ecall

该目录sim/tests/common/包含文件sc_print.h,sc_print.c其中包含函数sc_printf。

此函数用于hello仅输出一行文本的测试:

// sim/tests/hello/hello.c

#include "sc_print.h"

int main()
{
    sc_printf("Hello from SCR1!\n");
    return 0;
}

我是否正确理解我需要将函数调用sc_printf插入宏RVTEST_PASS和RVTEST_FAIL?如果是,如何做到这一点?

c
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-07-25 03:06:14 +0000 UTC

为什么程序员称计算机为“机器”?

  • 0

自从进入软件开发行业以来,我就养成了在提到计算机时说“机器”的习惯。看起来我的大多数同事都这样做。然而,在日常讲话中使用这个成语会让人感到困惑。

显然,计算机是一台机器。但是,大多数机器不是计算机。因此,这样的习惯(相对于计算机说“机器”)有点不明显。

那么这种做法是从哪里来的呢?

翻译来自 SoftwareEngineering的问题。

терминология
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-06-07 04:08:15 +0000 UTC

短信隐写程序

  • 1

一个简单的程序允许您在文本文件中隐藏文本消息,如下所示:

  1. 短信被翻译成二进制代码;
  2. 在文件的每一行末尾,如果当前消息位等于 1,则在换行符之前写入一个空格字符,否则不写入任何内容。

假定文件中的行数足以包含该消息。还假设文件中最初没有以空格结尾的单行(用于明确解码)。

关于代码的一些注释:

  1. 代码中没有错误处理以简化程序。没有错误处理,而是使用了很多断言;
  2. strdup我为and编写了自己的对应物strrev,因为它们都不包含在标准中。我分别命名了我的实现duplicateString,reverseString因为名称str*是由标准保留的;
  3. 我检查输入参数的有效性以防止使用内部 API 出错;
  4. 所有函数都被声明为静态的,因为它们在同一个翻译单元中。
  5. 输入文件以文本模式打开,而临时文件始终以二进制模式 ( w+b) 打开。这会导致一些问题吗?

编译器

我正在使用带有以下键的 Clang:

-std=c11
-Weverything
-Wpedantic
-fsanitize=address
-D_CRT_SECURE_NO_WARNINGS

编译器只发出一个警告:

warning: implicit conversion turns floating-point number into integer: 'double' to 'size_t' (aka 'unsigned int') [-Wfloat-conversion]
        const size_t newCapacity = ceil(s->capacity * DYNAMIC_STRING_GROW_FACTOR);

我看不出修复它的意义。

静态代码分析器

我还用 CppCheck 分析器检查了代码,它给出了一个错误:“内存泄漏:函数 stringToBinary 中的 ret ”:

char *stringToBinary(const char *s)
{
    assert(s);
    assert(strlen(s) > 0);

    char *ret = calloc((strlen(s) + 1) * CHAR_BIT + 1, 1);
    assert(ret);

    for (size_t i = 0; s[i] != '\0'; i++)
        strcat(ret, charToBinary(s[i]));

    return strcat(ret, charToBinary('\0'));
}

但这似乎是一个误报,因为它res是在函数中释放的hideMessage:

char *msgBinary = stringToBinary(msg);
...
free(msgBinary);

实际上,代码是:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <assert.h>

#define DYNAMIC_STRING_GROW_FACTOR 1.5

typedef struct DynamicString {
    char *s;
    size_t capacity;
    size_t length;
} DynamicString;

static void  createDynamicString(DynamicString *, size_t);
static void  destroyDynamicString(DynamicString *);
static void  increaseDynamicStringCapacity(DynamicString *);
static void  appendCharToDynamicString(DynamicString *, char);
static void  hideMessage(FILE *, const char *);
static char *extractMessage(FILE *);
static void  copyFile(FILE *, FILE *);
static char *stringToBinary(const char *);
static char *charToBinary(char);
static char  charFromBinary(const char *);
static char *reverseString(char *);
static char *duplicateString(const char *s);

int main(void)
{
    FILE *file = fopen("file.txt", "r+");
    assert(file);

    hideMessage(file, "hello, world");

    char *msg = extractMessage(file);
    assert(msg);
    puts(msg);

    free(msg);
    fclose(file);
}

/* The HIDEMESSAGE function
 *
 * The function hides text message into the file by that way: 1) the message
 * converts to binary; 2) each bit of the converted message writes at the end
 * of each file's line (right before the new-line character): if the bit
 * is 1 then a space (' ') appends to the line otherwise it's nothing appends
 * to the line.
 *
 * Assumes the the file does not contain any spaces right before new-line
 * characters. Also assumes that the file has enough lines for storing
 * the message.
 */
void hideMessage(FILE *f, const char *msg)
{
    assert(f);
    assert(msg);
    assert(strlen(msg) > 0);

    char *msgBinary = stringToBinary(msg);
    assert(msgBinary);

    FILE *tempFile = tmpfile();
    assert(tempFile);

    for (int ch, i = 0; (ch = fgetc(f)) != EOF;) {
        if (msgBinary[i] && (ch == '\n'))
            if (msgBinary[i++] == '1')
                fputc(' ', tempFile);

        fputc(ch, tempFile);
    }

    copyFile(f, tempFile);

    free(msgBinary);
    fclose(tempFile);
}

/* The EXTRACTMESSAGE function
 *
 * The function extracts message hidden by the HIDEMESSAGE function from
 * the input file and returns a pointer to heap-allocated string which
 * contains the message.
 */
char *extractMessage(FILE *f)
{
    assert(f);

    DynamicString msgBuffer;
    createDynamicString(&msgBuffer, 128);

    char charInBinary[CHAR_BIT + 1] = {0};

    for (int prevCh = 0, ch, i = 0; (ch = fgetc(f)) != EOF; prevCh = ch) {
        if (ch == '\n')
            charInBinary[i++] = (prevCh == ' ') ? '1' : '0';

        if (i % CHAR_BIT == 0 && i != 0) {
            if (!strcmp(charInBinary, charToBinary('\0')))
                break;

            i = 0;
            appendCharToDynamicString(&msgBuffer, charFromBinary(charInBinary));
        }
    }

    char *ret = duplicateString(msgBuffer.s);
    assert(ret);

    destroyDynamicString(&msgBuffer);
    return ret;
}

/* The CREATEDYNAMICSTRING function
 *
 * The function initializes a DynamicString passing by the first argument.
 * The initial capacity of the string is passing by the second argument.
 * Capacity is the max length of the string. At the same time length is
 * current length of the string. Thus the function allocates capacity + 1
 * bytes for the string (considering the null-character).
 *
 * The input pointer to DynamicString struture should be a valid pointer and
 * capacity should be greater than 0.
 */
void createDynamicString(DynamicString *ret, size_t capacity)
{
    assert(ret);
    assert(capacity > 0);

    ret->s = malloc(capacity + 1);
    assert(ret->s);

    ret->length = 0;
    ret->capacity = capacity;
}

/* The APPENDCHARTODYNAMICSTRING function
 *
 * The function appends a character to the input DynamicString. If capacity of
 * the string is not enough the function increases it.
 *
 * The input pointer to a DynamicString should be a valid pointer as well as
 * its string buffer.
 */
void appendCharToDynamicString(DynamicString *s, char c)
{
    assert(s);
    assert(s->s);

    if (s->length == s->capacity)
        increaseDynamicStringCapacity(s);

    s->s[s->length++] = c;
    s->s[s->length] = '\0';
}

/* The INCREASEDYNAMICSTRINGCAPACITY function
 *
 * The function increases capacity of the input DynamicString. Grow factor
 * is sets by a macro constant DYNAMIC_STRING_GROW_FACTOR.
 *
 * The input pointer to a DynamicString struture should be a valid pointer
 * as well as its string buffer.
 */
void increaseDynamicStringCapacity(DynamicString *s)
{
    assert(s);
    assert(s->s);

    const size_t newCapacity =  ceil(s->capacity * DYNAMIC_STRING_GROW_FACTOR);

    s->s = realloc(s->s, newCapacity + 1);
    assert(s->s);

    s->capacity = newCapacity;
}

/* The DESTROYDYNAMICSTRING function
 *
 * The function destroys the input DynamicString. It frees the string buffer
 * of the input DynamicString.
 *
 * The input pointer to a DynamicString should be a valid pointer as well as
 * its string buffer.
 */
void destroyDynamicString(DynamicString *s)
{
    assert(s);
    assert(s->s);

    free(s->s);
}

/* The COPYFILE function
 *
 * The function copies all the contents of src to dest. Both arguments should
 * be valid pointers. dest should be open for writing, src should be open
 * for reading. The function does not close the files. The both file cursor
 * position sets to the beginning.
 */
void copyFile(FILE *dest, FILE *src)
{
    assert(dest);
    assert(src);

    rewind(dest);
    rewind(src);

    for (int ch; (ch = fgetc(src)) != EOF;)
        fputc(ch, dest);

    rewind(dest);
    rewind(src);
}

/* The CHARFROMBINARY function
 *
 * The function converts the input string returned by the CHARTOBINARY function
 * to a character.
 *
 * The input string should be a valid null-terminated string and its length
 * should be greater 0.
 *
 * charFromBinary(charToBinary(c)) == c
 */
char charFromBinary(const char *s)
{
    assert(s);
    assert(strlen(s) > 0);

    char ret = 0;
    unsigned int p = 1;

    for (size_t i = strlen(s); i-- > 0; p *= 2)
        if (s[i] == '1')
            ret += p;

    return ret;
}

/* The STRINGTOBINARY function
 *
 * The function converts the input string to binary form and returns a pointer
 * to heap-allocated null-terminated string. Null-terminator of the input
 * string also converts to binary form and appends to the result. The caller
 * should free memory allocated for the output string.
 *
 * The input string should be a valid null-terminated string and its length
 * should be greater 0.
 *
 * stringToBinary("cat") => "01100011011000010111010000000000"
 * stringToBinary("dog") => "01100100011011110110011100000000"
 * stringToBinary("R\0") => "0101001000000000"
 */
char *stringToBinary(const char *s)
{
    assert(s);
    assert(strlen(s) > 0);

    char *ret = calloc((strlen(s) + 1) * CHAR_BIT + 1, 1);
    assert(ret);

    for (size_t i = 0; s[i] != '\0'; i++)
        strcat(ret, charToBinary(s[i]));

    return strcat(ret, charToBinary('\0'));
}

/* The CHARTOBINARY function
 *
 * The function converts value of the input character to binary form and
 * returns a pointer to the static null-terminated string which contains
 * the result. The result contains leading zeroes.
 *
 * charToBinary(100) => "01100100"
 * charToBinary('A') => "01000001"
 * charToBinary('\0') => "00000000"
 */
char *charToBinary(char c)
{
    static char ret[CHAR_BIT + 1];

    memset(ret, '0', sizeof ret);
    ret[sizeof ret - 1] = '\0';

    for (size_t i = 0; c; i++) {
        ret[i] = (c % 2) ? '1' : '0';
        c /= 2;
    }

    return reverseString(ret);
}

/* The REVERSESTRING function
 *
 * The input string should be a valid pointer to a null-terminated string.
 * If the input string is empty the function does noting.
 *
 * reverseString("hello") => "olleh"
 * reverseString("a") => "a"
 * reverseString("") => "a"
 */
char *reverseString(char *s)
{
    assert(s);

    char *begin = s;
    char *end = s + strlen(s) - 1;

    for (; begin < end; begin++, end--) {
        const char t = *begin;
        *begin = *end;
        *end = t;
    }

    return s;
}

/* The DUPLICATESTRING function
 *
 * The function returns a pointer to a heap-allocated string, which is a
 * duplicate of the input string. The returned pointer can be passed to the
 * free function.
 */
char *duplicateString(const char *s)
{
    assert(s);
    assert(strlen(s) > 0);

    char *copy = malloc(strlen(s) + 1);
    assert(copy);

    return strcpy(copy, s);
}

更新

重写版本(Github Gist)(由CodeReview的 @avp 和 @Edward 审查)。

PS我用蹩脚的英文写评论,我希望至少有些东西会很清楚:)

c
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-06-04 23:54:16 +0000 UTC

为什么在 printf 系列函数中为格式说明符选择百分号 (%)?

  • 1

每个人都知道,至少在 C 中,printf. 这些函数使用百分号(%)来指示格式说明符的开始。例如,表示“打印”,表示“打印”。如果您不熟悉函数和格式说明符的工作原理,请从这篇 Wikipedia 文章开始。%dint%uunsigned intprintf

我的问题是,最初选择百分号来标记格式说明符的开头是否有充分的理由?我们应该继续坚持这个“规则”吗?

很明显,这个决定是很久以前做出的(很可能甚至是 C 语言的前身),从那时起,人们可能会说,它已经成为一种“标准”(不仅在 C 语言中,而且在许多其他语言中)已经在某种程度上继承了它的语法的语言),所以现在改变任何东西都为时已晚。但我仍然想知道为什么首先做出这个决定,以及我们将来是否应该坚持下去。

例如,在 C#(以及 .NET 家族中的其他语言)中,微软的开发人员采取了稍微不同的方法来格式化字符串。他们选择在参数索引中使用花引号:

string output = String.Format("In {0}, the temperature is {1} degrees Celsius.",
                              "Texas", 37);
Console.WriteLine(output);

// Output:
//     In Texas, the temperature is 37 degrees Celsius.

该方法的文档String.format有更多信息,关于一般复合格式的文章也有,但现在细节并不是特别重要。开发人员放弃使用%格式说明符来指示开始是很重要的。当然,由于类型安全,我们不需要提供任何关于相应参数类型的信息,这与printfC 不同,但在 C 中可以只使用{d}and {u}。有谁知道为什么做出不同的决定?我们应该继续遵循这个“传统”吗?

显然,没有一个转义字符不能单独使用,但是这个问题已经通过使用两个字符作为转义序列来解决。还有其他考虑吗?

从 SoftwareEngineering翻译这个问题。

c
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-04-16 12:45:27 +0000 UTC

如何理解和解决浮点数归一化的任务?

  • 3

在附录 B 的结构化计算机组织一书中有这样一个任务。浮点数:

4 . 以下二进制浮点数由符号位、超过 64、基数 2 指数和 16 位小数组成。标准化它们。

一个。
0 1000000 0001010100000001 0 0111111
0000001111111111 0 1000011 1000000000000000

我的决定

我这样理解这个任务:

我们有以下格式:1 个符号位,7 个指数位,偏移量为 64,尾数为 16 位。

我们需要标准化以这种格式表示的数字 0 1000000 0001010100000001。如果一个数的尾数的最左边为 1,则该数称为归一化。因此,我们需要将尾数的所有位向左移动 3 位。如果我们将一个数字向左移动三位,那么我们将它乘以 2³。因此,为了使数字不变,我们需要将指数减少 3。

如果将原数(0 1000000 0001010100000001)转化为十进制形式,那么我们得到:

+ 2^(64 - 64) × (2^(-4) + 2^(-6) + 2^(-8) + 2^(-16)) = +1 × 0.0820465087890625 = +0.0820465087890625

如果我们翻译相同的数字,由我标准化,(0 0111101 1010100000001000),我们得到:

+ 2^(61 - 64) × (2^(-1) + 2^(-3) + 2^(-5) + 2^(-13)) = +2^(-3) × 0.6563720703125 = 0.125 × 0.6563720703125 = +0.0820465087890625

也就是同一个号码。

作者的决定

在这里找到解决方案。据我了解,这些是发布者提供的官方答案。

4 . 为了标准化,一次左移 1 位,在每一步将指数加 1,直到分数的最左边为 1。结果是

(a) 0 1000011 1010100000001000
(b) 0 1000101 1111111111000000
(c) 0 1000011 1000000000000000

第三个已经正常化了。

@avp 解决方案

由于我的回答和作者的回答有出入,决定在C、C++聊天中求助:

…我对这个例子的理解不同。给出符号 0 - 正数,指数为 1000000 == 0x40 == 64(即,考虑到偏移量 64,这是 0)和 16 位整数 0x1501 == 5377。就是这样,你需要转换它只是一小部分

@eanmos 一般来说,您对问题的看法可能更正确(从指数中减去 3)。在我的解释中,这个问题的提法看起来太自命不凡了。而我的解释中的答案(我在书中没有找到答案)将是 - 将 12 添加到指数(因为 5377 必须除以 4096 才能转换为分数),这显然与您要问的答案不符关于。

— @avp

那么正确答案是什么?如何正确解决这个任务?

математика
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-04-12 23:19:28 +0000 UTC

浮点数的归一化

  • 2

E. Tanenbaum 的书“计算机体系结构”有一节“附录 B.浮点数”。从那里引用:

在此处输入图像描述

我不明白第一种情况下数字是如何计算的,特别是尾数是如何计算的。

作者这样计算尾数: 1×16 -3 + B×16 -4。但毕竟,位 -3 和 -4 都是用零填充的:0000 和 0000。

我认为尾数是0x16 -1 + Bx16 -2 + 0x16 -3 + 0x16 -4 = Bx16 -2 = 0.04296875 10。因此,整数为 +(16 5 × 0.04296875 10 ) = +45056 10。不是这样吗?

而且我们仍然不清楚为什么我们将尾数向左移动两个十六进制数字以进行标准化。毕竟,第二个数字 (16 -2 ) 是非零的。

математика
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-10-13 14:53:11 +0000 UTC

如何理解 C11 标准的 6.10.2 段源文件包含\5

  • 4

请帮我理解C11标准的要点之一:

6.10.2 源文件包含

  1. 实现应为由一个或多个非数字或数字 (6.4.2.1) 后跟句点 (.) 和单个非数字组成的序列提供唯一映射。第一个字符不能是数字。该实现可以忽略字母大小写的区别,并将映射限制为句点前的八个有效字符。

ISO/IEC 9899:2011

我是否正确理解:

  1. 头文件名不能以数字开头;
  2. 点(.)后只能有一个非数字字符(即头文件扩展名只能是一个字符长);
  3. 实现可以忽略大小写(大小写字母);
  4. 一个实现可能只考虑到句点的前八个字符(即,文件名的长度可能限制为八个字符);

我有疑问,因为至少 GCC 6.3.0 与第一点和第二点不匹配。

c
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-10-06 16:29:53 +0000 UTC

在这些函数中是否必须使用“return”和“void”?

  • 2

示例:

void foo(int number) {
   /* code */

   return;
}

是否必须return在每个功能的末尾使用?

示例 2:

void bar(void) {
    /* code */
}

如果函数什么都不带,是否必须void在参数列表中使用bar?

有人说是,有人说不是。为了更好地理解编译器的代码,什么是正确的,在 C 中使用什么通常更正确?

这个问题来自 enSO的翻译。

c
  • 2 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-08-19 00:01:35 +0000 UTC

GCC(MinGW)忽略“打包”属性

  • 1

我有代码:

#define PACKED __attribute__((packed))

struct PACKED TgaHeader {
    uint8_t  id_length;
    uint8_t  color_map_type;
    uint8_t  image_type;

    /* Color Map Specification (5 bytes) */
    uint16_t first_entry_index;
    uint16_t color_map_length;
    uint8_t  color_map_entry_size;

    /* Image Specification (10 bytes) */
    uint16_t x_origin;
    uint16_t y_origin;
    uint16_t width;
    uint16_t height;
    uint8_t  pixel_depth;
    uint8_t  image_descriptor;
};

typedef struct TgaHeader TgaHeader;

如果将结构的每个字段的大小分别相加,应该得到 18,但是:

printf("%zu\n", sizeof(TgaHeader)); /* —→ 20 */

编译器:gcc version 6.3.0 (MinGW.org GCC-6.3.0-1).
我这样编译gcc si.c -o si.exe -lgdi32 -std=c11 -Wall -Wextra -Wpedantic -pedantic:

c
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-08-03 19:33:24 +0000 UTC

指针可以根据它指向的对象的类型来改变它的大小吗?

  • 2

我目前正在阅读“ C 中的指针和数组教程”,并在第二章末尾看到了这一段:

我们还了解到,在不同的系统上,指针的大小可能会有所不同。事实证明,指针的大小也可能会根据它指向的对象的数据类型而有所不同。因此,与整数一样,尝试将长整数分配给短整数类型的变量时可能会遇到麻烦,尝试将各种类型的指针的值分配给其他类型的指针变量时可能会遇到麻烦。

翻译:

“我们还了解到,在不同的系统上,指针的大小可以改变。事实证明,指针的大小也可以根据它指向的对象的数据类型而改变。因此,就像整数一样,在尝试将值分配给long int类型的变量时short int可能会遇到困难,而将一种类型的指针的值分配给另一种类型的指针时可能会遇到困难。”

我一直认为指针大小只取决于平台(x32,x64)。

我在 enSO 上发现了这个问题,它说数据指针和函数指针的大小可以不同。我这样对自己解释:代码段的大小小于数据段的大小或 RAM 的大小,因此代码段中的任何地址都可以放入 2 字节(例如)变量中,并且数据部分或 RAM 的地址仅在 4 中(也例如)。

所以两个问题:

  1. 我对数据指针和函数指针大小之间差异的原因是否正确?
  2. 对于不同的数据类型,指针大小可以不同,例如char *和int *?
c
  • 2 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-06-06 23:24:56 +0000 UTC

什么是陷阱表示?

  • 9

在对这个问题的答案的评论中。提到了术语“陷阱表示”:

“即使使用额外的代码,实现也可以保留值 -2 63作为陷阱表示。因此,即使在二进制补码中也不能保证 -2 63的形式可表示性”(@AnT)。

这是什么?

PS 我在 enSO 上找到了答案,但当然是英文的。

c
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-06-04 15:46:05 +0000 UTC

如何知道一个类型是否已经被声明过?

  • 3

假设我们有以下代码:

typedef int i32;

如何知道一个类型i32是否已经被声明过?也就是说,类似#ifdefonly for 的东西typedef。

c
  • 3 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-04-07 00:01:12 +0000 UTC

使用 _Generic 时的类型不匹配警告

  • 2

_Generic从C11处理,我写了一个简单的例子:

#include <stdio.h>

#define swap(a, b) _Generic((a), \
    int*: swap_int(a, b), \
    float*: swap_float(a, b) \
)

void swap_int(int* a, int* b) {
    int tmp = *a; *a = *b; *b = tmp;
}

void swap_float(float* a, float* b) {
    float tmp = *a; *a = *b; *b = tmp;
}

int main(int argc, char const *argv[]) {
    int a = 10, b = 40;
    float c = 3.14, d = 2.71;

    printf("a = %d    b = %d\n", a, b);
    swap(&a, &b);
    printf("a = %d    b = %d\n\n", a, b);

    printf("c = %.2f  d = %.2f\n", c, d);
    swap(&c, &d);
    printf("c = %.2f  d = %.2f\n", c, d);
}

程序运行正常,但编译时出现类型不匹配警告:

temp.c: In function 'main':
temp.c:819:10: warning: passing argument 1 of 'swap_float' from incompatible pointer type [-Wincompatible-pointer-types]
     swap(&a, &b);
          ^
temp.c:799:24: note: in definition of macro 'swap'
     float*: swap_float(a, b) \
                        ^
temp.c:808:6: note: expected 'float *' but argument is of type 'int *'
 void swap_float(float* a, float* b) {
      ^~~~~~~~~~
temp.c:819:14: warning: passing argument 2 of 'swap_float' from incompatible pointer type [-Wincompatible-pointer-types]
     swap(&a, &b);
              ^
temp.c:799:27: note: in definition of macro 'swap'
     float*: swap_float(a, b) \
                           ^
temp.c:808:6: note: expected 'float *' but argument is of type 'int *'
 void swap_float(float* a, float* b) {
      ^~~~~~~~~~
temp.c:823:10: warning: passing argument 1 of 'swap_int' from incompatible pointer type [-Wincompatible-pointer-types]
     swap(&c, &d);
          ^
temp.c:798:20: note: in definition of macro 'swap'
     int*: swap_int(a, b), \
                    ^
temp.c:802:6: note: expected 'int *' but argument is of type 'float *'
 void swap_int(int* a, int* b) {
      ^~~~~~~~
temp.c:823:14: warning: passing argument 2 of 'swap_int' from incompatible pointer type [-Wincompatible-pointer-types]
     swap(&c, &d);
              ^
temp.c:798:23: note: in definition of macro 'swap'
     int*: swap_int(a, b), \
                       ^
temp.c:802:6: note: expected 'int *' but argument is of type 'float *'
 void swap_int(int* a, int* b) {

如何删除它们?

编译器:gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)

c
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-01-16 01:29:20 +0000 UTC

Win API 项目未链接

  • 3

无法链接库comctl32。更准确地说,它连接,但是:

 undefined reference to `InitCommonControlsEx@4'
 collect2.exe: error: ld returned 1 exit status

标头连接正常:

#include <windows.h>
#define _WIN32_IE 0x0600
#include <commctrl.h>

图书馆本身在这里:

C:\MinGW\lib\libcomctl32.a

我是这样收集的:

gcc.exe -std=c11 -m32 -Wall -Wextra -Wpedantic -mwindows -lcomctl32 -lbass main.c -o main.exe

尝试更新 MinGW - 无济于事。

操作系统:Windows 10 x64

编译器:gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)

UPD

也许这会有所帮助:

nm C:\MinGW\lib\libcomctl32.a > nm_results.txt

dvbpbt.o:
00000000 I __libcomctl32_a_iname

dvbpbh.o:
00000000 i .idata$4
00000000 i .idata$5
00000000 I __head_libcomctl32_a
         U __libcomctl32_a_iname

dvbpbs00113.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp___TrackMouseEvent@4
00000000 T __TrackMouseEvent@4

dvbpbs00112.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__Str_SetPtrW@8
00000000 T _Str_SetPtrW@8

dvbpbs00111.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__Str_SetPtrA@8
00000000 T _Str_SetPtrA@8

dvbpbs00110.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__Str_GetPtrW@12
00000000 T _Str_GetPtrW@12

dvbpbs00109.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__Str_GetPtrA@12
00000000 T _Str_GetPtrA@12

dvbpbs00108.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ShowHideMenuCtl@12
00000000 T _ShowHideMenuCtl@12

dvbpbs00107.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__SetWindowSubclass@16
00000000 T _SetWindowSubclass@16

dvbpbs00106.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__SendNotifyEx@20
00000000 T _SendNotifyEx@20

dvbpbs00105.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__SendNotify@16
00000000 T _SendNotify@16

dvbpbs00104.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__RemoveWindowSubclass@12
00000000 T _RemoveWindowSubclass@12

dvbpbs00103.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ReAlloc@8
00000000 T _ReAlloc@8

dvbpbs00102.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__PropertySheetW@4
00000000 T _PropertySheetW@4

dvbpbs00101.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__PropertySheetA@4
00000000 T _PropertySheetA@4

dvbpbs00100.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__PropertySheet@4
00000000 T _PropertySheet@4

dvbpbs00099.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__MenuHelp@28
00000000 T _MenuHelp@28

dvbpbs00098.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__MakeDragList@4
00000000 T _MakeDragList@4

dvbpbs00097.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__LBItemFromPt@16
00000000 T _LBItemFromPt@16

dvbpbs00096.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__InitMUILanguage@4
00000000 T _InitMUILanguage@4

dvbpbs00095.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__InitCommonControlsEx@4
00000000 T _InitCommonControlsEx@4

dvbpbs00094.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__InitCommonControls@0
00000000 T _InitCommonControls@0

dvbpbs00093.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Write@8
00000000 T _ImageList_Write@8

dvbpbs00092.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_SetOverlayImage@12
00000000 T _ImageList_SetOverlayImage@12

dvbpbs00091.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_SetImageCount@8
00000000 T _ImageList_SetImageCount@8

dvbpbs00090.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_SetIconSize@12
00000000 T _ImageList_SetIconSize@12

dvbpbs00089.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_SetDragCursorImage@16
00000000 T _ImageList_SetDragCursorImage@16

dvbpbs00088.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_SetBkColor@8
00000000 T _ImageList_SetBkColor@8

dvbpbs00087.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_ReplaceIcon@12
00000000 T _ImageList_ReplaceIcon@12

dvbpbs00086.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Replace@16
00000000 T _ImageList_Replace@16

dvbpbs00085.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Remove@8
00000000 T _ImageList_Remove@8

dvbpbs00084.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Read@4
00000000 T _ImageList_Read@4

dvbpbs00083.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Merge@24
00000000 T _ImageList_Merge@24

dvbpbs00082.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_LoadImageW@28
00000000 T _ImageList_LoadImageW@28

dvbpbs00081.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_LoadImageA@28
00000000 T _ImageList_LoadImageA@28

dvbpbs00080.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_LoadImage@28
00000000 T _ImageList_LoadImage@28

dvbpbs00079.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_GetImageRect@12
00000000 T _ImageList_GetImageRect@12

dvbpbs00078.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_GetImageInfo@12
00000000 T _ImageList_GetImageInfo@12

dvbpbs00077.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_GetImageCount@4
00000000 T _ImageList_GetImageCount@4

dvbpbs00076.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_GetIconSize@12
00000000 T _ImageList_GetIconSize@12

dvbpbs00075.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_GetIcon@12
00000000 T _ImageList_GetIcon@12

dvbpbs00074.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_GetDragImage@8
00000000 T _ImageList_GetDragImage@8

dvbpbs00073.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_GetBkColor@4
00000000 T _ImageList_GetBkColor@4

dvbpbs00072.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_EndDrag@0
00000000 T _ImageList_EndDrag@0

dvbpbs00071.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Duplicate@4
00000000 T _ImageList_Duplicate@4

dvbpbs00070.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_DrawIndirect@4
00000000 T _ImageList_DrawIndirect@4

dvbpbs00069.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_DrawEx@40
00000000 T _ImageList_DrawEx@40

dvbpbs00068.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Draw@24
00000000 T _ImageList_Draw@24

dvbpbs00067.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_DragShowNolock@4
00000000 T _ImageList_DragShowNolock@4

dvbpbs00066.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_DragMove@8
00000000 T _ImageList_DragMove@8

dvbpbs00065.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_DragLeave@4
00000000 T _ImageList_DragLeave@4

dvbpbs00064.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_DragEnter@12
00000000 T _ImageList_DragEnter@12

dvbpbs00063.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Destroy@4
00000000 T _ImageList_Destroy@4

dvbpbs00062.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Create@20
00000000 T _ImageList_Create@20

dvbpbs00061.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Copy@20
00000000 T _ImageList_Copy@20

dvbpbs00060.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_BeginDrag@16
00000000 T _ImageList_BeginDrag@16

dvbpbs00059.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_AddMasked@12
00000000 T _ImageList_AddMasked@12

dvbpbs00058.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_AddIcon@8
00000000 T _ImageList_AddIcon@8

dvbpbs00057.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__ImageList_Add@12
00000000 T _ImageList_Add@12

dvbpbs00056.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__GetWindowSubclass@16
00000000 T _GetWindowSubclass@16

dvbpbs00055.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__GetSize@4
00000000 T _GetSize@4

dvbpbs00054.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__GetMUILanguage@0
00000000 T _GetMUILanguage@0

dvbpbs00053.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__GetEffectiveClientRect@12
00000000 T _GetEffectiveClientRect@12

dvbpbs00052.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__FreeMRUList@4
00000000 T _FreeMRUList@4

dvbpbs00051.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__Free@4
00000000 T _Free@4

dvbpbs00050.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__FindMRUStringW@12
00000000 T _FindMRUStringW@12

dvbpbs00049.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__FindMRUStringA@12
00000000 T _FindMRUStringA@12

dvbpbs00048.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__FindMRUData@16
00000000 T _FindMRUData@16

dvbpbs00047.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__EnumMRUListW@16
00000000 T _EnumMRUListW@16

dvbpbs00046.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__EnumMRUListA@16
00000000 T _EnumMRUListA@16

dvbpbs00045.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DrawStatusTextW@16
00000000 T _DrawStatusTextW@16

dvbpbs00044.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DrawStatusTextA@16
00000000 T _DrawStatusTextA@16

dvbpbs00043.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DrawStatusText@16
00000000 T _DrawStatusText@16

dvbpbs00042.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DrawInsert@12
00000000 T _DrawInsert@12

dvbpbs00041.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DestroyPropertySheetPage@4
00000000 T _DestroyPropertySheetPage@4

dvbpbs00040.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DelMRUString@8
00000000 T _DelMRUString@8

dvbpbs00039.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DefSubclassProc@16
00000000 T _DefSubclassProc@16

dvbpbs00038.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DSA_SetItem@12
00000000 T _DSA_SetItem@12

dvbpbs00037.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DSA_InsertItem@12
00000000 T _DSA_InsertItem@12

dvbpbs00036.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DSA_GetItemPtr@8
00000000 T _DSA_GetItemPtr@8

dvbpbs00035.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DSA_GetItem@12
00000000 T _DSA_GetItem@12

dvbpbs00034.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DSA_Destroy@4
00000000 T _DSA_Destroy@4

dvbpbs00033.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DSA_DeleteItem@8
00000000 T _DSA_DeleteItem@8

dvbpbs00032.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DSA_DeleteAllItems@4
00000000 T _DSA_DeleteAllItems@4

dvbpbs00031.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DSA_Create@8
00000000 T _DSA_Create@8

dvbpbs00030.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_Sort@12
00000000 T _DPA_Sort@12

dvbpbs00029.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_SetPtr@12
00000000 T _DPA_SetPtr@12

dvbpbs00028.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_Search@24
00000000 T _DPA_Search@24

dvbpbs00027.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_InsertPtr@12
00000000 T _DPA_InsertPtr@12

dvbpbs00026.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_Grow@8
00000000 T _DPA_Grow@8

dvbpbs00025.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_GetPtrIndex@8
00000000 T _DPA_GetPtrIndex@8

dvbpbs00024.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_GetPtr@8
00000000 T _DPA_GetPtr@8

dvbpbs00023.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_Destroy@4
00000000 T _DPA_Destroy@4

dvbpbs00022.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_DeletePtr@8
00000000 T _DPA_DeletePtr@8

dvbpbs00021.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_DeleteAllPtrs@4
00000000 T _DPA_DeleteAllPtrs@4

dvbpbs00020.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_CreateEx@8
00000000 T _DPA_CreateEx@8

dvbpbs00019.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_Create@4
00000000 T _DPA_Create@4

dvbpbs00018.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__DPA_Clone@8
00000000 T _DPA_Clone@8

dvbpbs00017.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateUpDownControl@48
00000000 T _CreateUpDownControl@48

dvbpbs00016.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateToolbarEx@52
00000000 T _CreateToolbarEx@52

dvbpbs00015.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateToolbar@32
00000000 T _CreateToolbar@32

dvbpbs00014.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateStatusWindowW@16
00000000 T _CreateStatusWindowW@16

dvbpbs00013.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateStatusWindowA@16
00000000 T _CreateStatusWindowA@16

dvbpbs00012.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateStatusWindow@16
00000000 T _CreateStatusWindow@16

dvbpbs00011.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateProxyPage@8
00000000 T _CreateProxyPage@8

dvbpbs00010.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreatePropertySheetPageW@4
00000000 T _CreatePropertySheetPageW@4

dvbpbs00009.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreatePropertySheetPageA@4
00000000 T _CreatePropertySheetPageA@4

dvbpbs00008.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreatePropertySheetPage@4
00000000 T _CreatePropertySheetPage@4

dvbpbs00007.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreatePage@8
00000000 T _CreatePage@8

dvbpbs00006.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateMappedBitmap@20
00000000 T _CreateMappedBitmap@20

dvbpbs00005.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateMRUListW@4
00000000 T _CreateMRUListW@4

dvbpbs00004.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__CreateMRUListA@4
00000000 T _CreateMRUListA@4

dvbpbs00003.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__Alloc@4
00000000 T _Alloc@4

dvbpbs00002.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__AddMRUStringW@8
00000000 T _AddMRUStringW@8

dvbpbs00001.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__AddMRUStringA@8
00000000 T _AddMRUStringA@8

dvbpbs00000.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__AddMRUData@12
00000000 T _AddMRUData@12

InitCommonControlsEx@4从顶部列表中提到:

dvbpbs00095.o:
00000000 i .idata$5
00000000 i .idata$6
         U __head_libcomctl32_a
00000000 I __imp__InitCommonControlsEx@4
00000000 T _InitCommonControlsEx@4

libcomctl32.a尝试从这里下载不同的版本: https ://sourceforge.net/projects/mingw/files/MinGW/Base/w32api/ 。无济于事。

更新 2

输出:nm_main.exe

nm main.exe
00000000 b .bss
00000000 d .data
00000000 i .drectve
00000000 r .eh_frame
00000000 r .rdata
00000000 r .rdata$zzz
00000000 t .text
         U ___mingw_vprintf
00000004 C _BASS_Apply3D
00000004 C _BASS_ChannelBytes2Seconds
00000004 C _BASS_ChannelFlags
00000004 C _BASS_ChannelGet3DAttributes
00000004 C _BASS_ChannelGet3DPosition
00000004 C _BASS_ChannelGetAttribute
00000004 C _BASS_ChannelGetData
00000004 C _BASS_ChannelGetDevice
00000004 C _BASS_ChannelGetInfo
00000004 C _BASS_ChannelGetLength
00000004 C _BASS_ChannelGetLevel
00000004 C _BASS_ChannelGetPosition
00000004 C _BASS_ChannelGetTags
00000004 C _BASS_ChannelIsActive
00000004 C _BASS_ChannelIsSliding
00000004 C _BASS_ChannelLock
00000004 C _BASS_ChannelPause
00000004 C _BASS_ChannelPlay
00000004 C _BASS_ChannelRemoveDSP
00000004 C _BASS_ChannelRemoveFX
00000004 C _BASS_ChannelRemoveLink
00000004 C _BASS_ChannelRemoveSync
00000004 C _BASS_ChannelSeconds2Bytes
00000004 C _BASS_ChannelSet3DAttributes
00000004 C _BASS_ChannelSet3DPosition
00000004 C _BASS_ChannelSetAttribute
00000004 C _BASS_ChannelSetDevice
00000004 C _BASS_ChannelSetDSP
00000004 C _BASS_ChannelSetFX
00000004 C _BASS_ChannelSetLink
00000004 C _BASS_ChannelSetPosition
00000004 C _BASS_ChannelSetSync
00000004 C _BASS_ChannelSlideAttribute
00000004 C _BASS_ChannelStop
00000004 C _BASS_ChannelUpdate
00000004 C _BASS_ErrorGetCode
00000004 C _BASS_Free
00000004 C _BASS_FXGetParameters
00000004 C _BASS_FXReset
00000004 C _BASS_FXSetParameters
00000004 C _BASS_Get3DFactors
00000004 C _BASS_Get3DPosition
00000004 C _BASS_GetConfig
00000004 C _BASS_GetConfigPtr
00000004 C _BASS_GetCPU
00000004 C _BASS_GetDevice
00000004 C _BASS_GetDeviceInfo
00000004 C _BASS_GetDSoundObject
00000004 C _BASS_GetEAXParameters
00000004 C _BASS_GetInfo
00000004 C _BASS_GetVersion
00000004 C _BASS_GetVolume
00000004 C _BASS_Init
00000004 C _BASS_MusicFree
00000004 C _BASS_MusicLoad
00000004 C _BASS_Pause
00000004 C _BASS_PluginFree
00000004 C _BASS_PluginGetInfo
00000004 C _BASS_PluginLoad
00000004 C _BASS_RecordFree
00000004 C _BASS_RecordGetDevice
00000004 C _BASS_RecordGetDeviceInfo
00000004 C _BASS_RecordGetInfo
00000004 C _BASS_RecordGetInput
00000004 C _BASS_RecordGetInputName
00000004 C _BASS_RecordInit
00000004 C _BASS_RecordSetDevice
00000004 C _BASS_RecordSetInput
00000004 C _BASS_RecordStart
00000004 C _BASS_SampleCreate
00000004 C _BASS_SampleFree
00000004 C _BASS_SampleGetChannel
00000004 C _BASS_SampleGetChannels
00000004 C _BASS_SampleGetData
00000004 C _BASS_SampleGetInfo
00000004 C _BASS_SampleLoad
00000004 C _BASS_SampleSetData
00000004 C _BASS_SampleSetInfo
00000004 C _BASS_SampleStop
00000004 C _BASS_Set3DFactors
00000004 C _BASS_Set3DPosition
00000004 C _BASS_SetConfig
00000004 C _BASS_SetConfigPtr
00000004 C _BASS_SetDevice
00000004 C _BASS_SetEAXParameters
00000004 C _BASS_SetVolume
00000004 C _BASS_Start
00000004 C _BASS_Stop
00000004 C _BASS_StreamCreate
00000004 C _BASS_StreamCreateFile
00000004 C _BASS_StreamCreateFileUser
00000004 C _BASS_StreamCreateURL
00000004 C _BASS_StreamFree
00000004 C _BASS_StreamGetFilePosition
00000004 C _BASS_StreamPutData
00000004 C _BASS_StreamPutFileData
00000004 C _BASS_Update
         U _CreateWindowExW@48
00000220 D _current_sound
         U _DefWindowProcW@16
         U _DispatchMessageA@4
         U _exit
00000020 D _genres
         U _GetMessageA@16
         U _GetProcAddress@8
         U _GetSysColorBrush@4
         U _InitCommonControlsEx@4
         U _LoadCursorA@8
         U _LoadLibraryA@4
         U _malloc
0000001c C _msg
         U _PostQuitMessage@4
00000000 t _printf
0000022a T _qk_CheckBASSVersion
00000004 C _qk_cmd_line
00000004 C _qk_cmd_show
000008b2 T _qk_CreateMainWindow
00000782 T _qk_DecreasePos
000004b0 T _qk_DecreaseVol
000002ef T _qk_GetCPULoad
0000082a T _qk_GetSoundAlbum
0000080d T _qk_GetSoundArtist
00000698 T _qk_GetSoundCurrentMinute
000006b1 T _qk_GetSoundCurrentSecond
00000864 T _qk_GetSoundGenre
000005ea T _qk_GetSoundLengthInBytes
000005fa T _qk_GetSoundLengthInSeconds
00000604 T _qk_GetSoundPosInBytes
00000627 T _qk_GetSoundPosInSeconds
00000413 T _qk_GetSoundState
000007f0 T _qk_GetSoundTitle
00000847 T _qk_GetSoundYear
0000041d T _qk_GetVol
00000004 C _qk_hinstance
00000718 T _qk_IncreasePos
0000044f T _qk_IncreaseVol
00000279 T _qk_InitBASS
00000029 T _qk_LoadBASSFunctions
00000318 T _qk_LoadSound
0000050f t _qk_LoadSoundLength
00000260 D _qk_main_win_title
00000018 C _qk_main_window
000003ed T _qk_PauseSound
000003bf T _qk_PlaySound
00000004 C _qk_sample_rate
000006d5 T _qk_SetPos
0000030a T _qk_SetSampleRate
         U _RegisterClassW@4
         U _SendMessageW@16
00000004 D _tags_unknown_album
00000008 D _tags_unknown_artist
0000000c D _tags_unknown_title
00000000 D _tags_unknown_year
         U _TranslateMessage@4
         U _wcscpy
         U _wcslen
00000ce9 T _WinMain@16
00000a02 T _WndProc@16

从顶部列表中:

00000020 D _genres
         U _GetMessageA@16
         U _GetProcAddress@8
         U _GetSysColorBrush@4
         U _InitCommonControlsEx@4 <-----------------
         U _LoadCursorA@8
         U _LoadLibraryA@4
         U _malloc
c
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-08-24 03:14:13 +0000 UTC

提交的参数名称

  • 1

你好!有一个功能:

#include <math.h>
...
void mat4x4_projection(mat4x4 m, const float fov, const float aspect, const float n, const float f) {
    mat4x4_identity(m);
    const float ctg_half_fov = 1.0f/tanf(fov/2);

    m[0][0] = ctg_half_fov/aspect;
    m[1][1] = ctg_half_fov;
    m[2][2] = (f+n)/(f-n);
    m[3][2] = (-2.0f*f*n)/(f-n);
    m[2][3] = 1.0f;
    m[3][3] = 0.0f;
}

如果将参数名称f和分别n替换为far和near,编译器将生成错误:Parameter name ommited.

单词far并且near不作为关键字出现(查看http://en.cppreference.com/w/c/keyword)。

其实一个问题,这个错误可以与什么联系起来?

Win 10 x64
gcc 4.8.1
c
  • 1 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-08-20 00:58:36 +0000 UTC

低音问题

  • 3

我正在尝试编译此代码:

/*
    BASS simple console player
    Copyright (c) 1999-2015 Un4seen Developments Ltd.
*/

#include <stdlib.h>
#include <stdio.h>
#define BASSDEF(f) (WINAPI *f) // define the functions as pointers
#include "bass.h"

#ifdef _WIN32 // Windows
#include <conio.h>
#else // OSX/Linux
#include <sys/time.h>
#include <termios.h>
#include <string.h>
#include <unistd.h>

#define Sleep(x) usleep(x*1000)

int _kbhit()
{
    int r;
    fd_set rfds;
    struct timeval tv={0};
    struct termios term,oterm;
    tcgetattr(0,&oterm);
    memcpy(&term,&oterm,sizeof(term));
    cfmakeraw(&term);
    tcsetattr(0,TCSANOW,&term);
    FD_ZERO(&rfds);
    FD_SET(0,&rfds);
    r=select(1,&rfds,NULL,NULL,&tv);
    tcsetattr(0,TCSANOW,&oterm);
    return r;
}
#endif

// display error messages
void Error(const char *text) 
{
    printf("Error(%d): %s\n",BASS_ErrorGetCode(),text);
    BASS_Free();
    exit(0);
}

void ListDevices()
{
    BASS_DEVICEINFO di;
    int a;
    for (a=1;BASS_GetDeviceInfo(a,&di);a++) {
        if (di.flags&BASS_DEVICE_ENABLED) // enabled output device
            printf("dev %d: %s\n",a,di.name);
    }
}

void main(int argc, char **argv)
{
    DWORD chan,act,time,level;
    BOOL ismod;
    QWORD pos;
    int a,device=-1;

    printf("Simple console mode BASS example : MOD/MPx/OGG/WAV player\n"
            "---------------------------------------------------------\n");

    // check the correct BASS was loaded
    if (HIWORD(BASS_GetVersion())!=BASSVERSION) {
        printf("An incorrect version of BASS was loaded");
        return;
    }

    for (a=1;a<argc;a++) {
        if (!strcmp(argv[a],"-l")) {
            ListDevices();
            return;
        } else if (!strcmp(argv[a],"-d") && a+1<argc) device=atoi(argv[++a]);
        else break;
    }
    if (a!=argc-1) {
        printf("\tusage: contest [-l] [-d #] <file>\n"
            "\t-l = list devices\n"
            "\t-d = device number\n");
        return;
    }

    // initialize output device
    if (!BASS_Init(device,44100,0,0,NULL))
        Error("Can't initialize device");

    // try streaming the file/url
    if ((chan=BASS_StreamCreateFile(FALSE,argv[argc-1],0,0,BASS_SAMPLE_LOOP))
        || (chan=BASS_StreamCreateURL(argv[argc-1],0,BASS_SAMPLE_LOOP,0,0))) {
        pos=BASS_ChannelGetLength(chan,BASS_POS_BYTE);
        if (BASS_StreamGetFilePosition(chan,BASS_FILEPOS_DOWNLOAD)!=-1) {
            // streaming from the internet
            if (pos!=-1)
#ifdef _WIN32
                printf("streaming internet file [%I64d bytes]",pos);
#else
                printf("streaming internet file [%lld bytes]",pos);
#endif
            else
                printf("streaming internet file");
        } else
#ifdef _WIN32
            printf("streaming file [%I64d bytes]",pos);
#else
            printf("streaming file [%lld bytes]",pos);
#endif
        ismod=FALSE;
    } else {
        // try loading the MOD (with looping, sensitive ramping, and calculate the duration)
        if (!(chan=BASS_MusicLoad(FALSE,argv[argc-1],0,0,BASS_SAMPLE_LOOP|BASS_MUSIC_RAMPS|BASS_MUSIC_PRESCAN,1)))
            // not a MOD either
            Error("Can't play the file");
        { // count channels
            float dummy;
            for (a=0;BASS_ChannelGetAttribute(chan,BASS_ATTRIB_MUSIC_VOL_CHAN+a,&dummy);a++);
        }
        printf("playing MOD music \"%s\" [%u chans, %u orders]",
            BASS_ChannelGetTags(chan,BASS_TAG_MUSIC_NAME),a,(DWORD)BASS_ChannelGetLength(chan,BASS_POS_MUSIC_ORDER));
        pos=BASS_ChannelGetLength(chan,BASS_POS_BYTE);
        ismod=TRUE;
    }

    // display the time length
    if (pos!=-1) {
        time=(DWORD)BASS_ChannelBytes2Seconds(chan,pos);
        printf(" %u:%02u\n",time/60,time%60);
    } else // no time length available
        printf("\n");

    BASS_ChannelPlay(chan,FALSE);

    while (!_kbhit() && (act=BASS_ChannelIsActive(chan))) {
        // display some stuff and wait a bit
        level=BASS_ChannelGetLevel(chan);
        pos=BASS_ChannelGetPosition(chan,BASS_POS_BYTE);
        time=BASS_ChannelBytes2Seconds(chan,pos);
#ifdef _WIN32
        printf("pos %09I64u",pos);
#else
        printf("pos %09llu",pos);
#endif
        if (ismod) {
            pos=BASS_ChannelGetPosition(chan,BASS_POS_MUSIC_ORDER);
            printf(" (%03u:%03u)",LOWORD(pos),HIWORD(pos));
        }
        printf(" - %u:%02u - L ",time/60,time%60);
        if (act==BASS_ACTIVE_STALLED) { // playback has stalled
            printf("-- buffering : %05u --",(DWORD)BASS_StreamGetFilePosition(chan,BASS_FILEPOS_BUFFER));
        } else {
            for (a=27204;a>200;a=a*2/3) putchar(LOWORD(level)>=a?'*':'-');
            putchar(' ');
            for (a=210;a<32768;a=a*3/2) putchar(HIWORD(level)>=a?'*':'-');
        }
        printf(" R - cpu %.2f%%  \r",BASS_GetCPU());
        fflush(stdout);
        Sleep(50);
    }
    printf("                                                                             \r");

    // wind the frequency down...
    BASS_ChannelSlideAttribute(chan,BASS_ATTRIB_FREQ,1000,500);
    Sleep(300);
    // ...and fade-out to avoid a "click"
    BASS_ChannelSlideAttribute(chan,BASS_ATTRIB_VOL,-1,200);
    // wait for slide to finish
    while (BASS_ChannelIsSliding(chan,0)) Sleep(1);

    BASS_Free();
}

此示例开箱即用。我只是从自己添加的

#define BASSDEF(f) (WINAPI* f) // define the functions as pointers

否则它不会。启动程序后,没有打开窗口,它立即崩溃。gdb写入

Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()

(gdb) bt
#0  0x00000000 in ?? ()
#1  0x004015c1 in main (argc=1, argv=0xdc15b0) at qks.c:68

即使这个例子也不起作用:

#define BASSDEF(f) (WINAPI *f)
#include "bass.h"

int main() {
    BASS_Init(-1, 44100, 0, 0, NULL);
}

我这样编译:

gcc.exe -m32 -Wall -Wextra -Wpedantic -lbass -mwindows qks.c -o qks.exe

操作系统- Windows 10 x64;海湾合作委员会-4.9.2

UPD

进展甚微。该程序编译并成功完成:

#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#define BASSDEF(f) (WINAPI *f)
#include "bass.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) {
    (void) hPrevInstance, (void) lpCmdLine, (void) nCmdShow;

    HINSTANCE bass=LoadLibrary("bass.dll"); // load BASS
    BASS_Init=GetProcAddress(bass,"BASS_Init"); // get BASS_Init
    BASS_Init(-1,44100,0,NULL,NULL) // call BASS_Init
}

以下是文档中写的内容:

缺点是您必须使用该功能手动导入您使用的每个GetProcAddress功能。但是通过使用BASSDEF #define. 这是一个小例子:

#define BASSDEF(f) (WINAPI *f) // define the functions as pointers
#include "bass.h" ... HINSTANCE bass=LoadLibrary("BASS.DLL"); // load BASS
BASS_Init=GetProcAddress(bass,"BASS_Init"); // get BASS_Init
BASS_Init(-1,44100,0,hWnd,NULL); // call BASS_Init

但是,当我尝试获取其他函数的地址时,我收到一个警告:

warning: assignment from incompatible pointer type
  BASS_GetVersion=GetProcAddress(bass,"BASS_GetVersion");

如果您调用此函数(或任何其他函数),则SIGSEGV.

更新 2

如果将main这些行添加到正文的开头,则上面的示例有效:

HINSTANCE bass=LoadLibrary("bass.dll"); // load BASS
BASS_Init=GetProcAddress(bass,"BASS_Init"); // get BASS_Init
BASS_GetVersion=GetProcAddress(bass,"BASS_GetVersion");
BASS_Free=GetProcAddress(bass,"BASS_Free");
BASS_SetVolume=GetProcAddress(bass,"BASS_SetVolume");
BASS_SetConfig=GetProcAddress(bass,"BASS_SetConfig");
BASS_SampleFree=GetProcAddress(bass,"BASS_SampleFree");
BASS_SampleLoad=GetProcAddress(bass,"BASS_SampleLoad");
BASS_SampleGetChannel=GetProcAddress(bass,"BASS_SampleGetChannel");
BASS_ChannelPlay=GetProcAddress(bass,"BASS_ChannelPlay");
BASS_ChannelStop=GetProcAddress(bass,"BASS_ChannelStop");
BASS_GetVolume=GetProcAddress(bass,"BASS_GetVolume");
BASS_GetVersion=GetProcAddress(bass,"BASS_GetVersion");
BASS_GetCPU=GetProcAddress(bass,"BASS_GetCPU");
BASS_Pause=GetProcAddress(bass,"BASS_Pause");
BASS_Start=GetProcAddress(bass,"BASS_Start");
BASS_MusicFree=GetProcAddress(bass,"BASS_MusicFree");
BASS_MusicLoad=GetProcAddress(bass,"BASS_MusicLoad");
BASS_ChannelSetAttribute=GetProcAddress(bass,"BASS_ChannelSetAttribute");
BASS_StreamCreateFile=GetProcAddress(bass,"BASS_StreamCreateFile");
BASS_ErrorGetCode=GetProcAddress(bass,"BASS_ErrorGetCode");
BASS_StreamCreateURL=GetProcAddress(bass, "BASS_StreamCreateURL");
BASS_ChannelGetLength=GetProcAddress(bass, "BASS_ChannelGetLength");
BASS_StreamGetFilePosition=GetProcAddress(bass, "BASS_StreamGetFilePosition");
BASS_ChannelGetAttribute=GetProcAddress(bass, "BASS_ChannelGetAttribute");
BASS_ChannelGetTags=GetProcAddress(bass, "BASS_ChannelGetTags");
BASS_ChannelGetLength=GetProcAddress(bass, "BASS_ChannelGetLength");
BASS_ChannelBytes2Seconds=GetProcAddress(bass, "BASS_ChannelBytes2Seconds");
BASS_ChannelIsActive=GetProcAddress(bass, "BASS_ChannelIsActive");
BASS_ChannelGetLevel=GetProcAddress(bass, "BASS_ChannelGetLevel");
BASS_ChannelGetPosition=GetProcAddress(bass, "BASS_ChannelGetPosition");
BASS_ChannelSlideAttribute=GetProcAddress(bass, "BASS_ChannelSlideAttribute");

一大“ BUT ”:从命令行运行时播放声音(cmd.exe,ConEmu),但没有文字信息。那些。我运行程序,它在后台运行,输入提示立即出现在终端:

user@LAPTOP-OIQUIP0K C:\Users\user\Documents\Projects\sound 
> qks.exe -d -1 "C:\Users\user\Music\Radiohead\Creep.mp3"   

user@LAPTOP-OIQUIP0K C:\Users\user\Documents\Projects\sound 
>             

但是,所有文本信息(声音也可以)出现在内置控制台中SublimeText 3:

C:\Users\user\Documents\Projects\sound>qks.exe -d -1 "C:\Users\user\Music\Radiohead\Creep.mp3" 
Simple console mode BASS example : MOD/MPx/OGG/WAV player
---------------------------------------------------------
streaming file [41587200 bytes] 3:55
pos 000000136 - 0:00 - L ------------- ------------- R - cpu 0.00%  
pos 000005944 - 0:00 - L ------------- ------------- R - cpu 0.00%  
pos 000014808 - 0:00 - L ------------- ------------- R - cpu 0.00%  
pos 000023728 - 0:00 - L ------------- ------------- R - cpu 0.00%  
pos 000032628 - 0:00 - L ------------- ------------- R - cpu 0.07%  
pos 000041584 - 0:00 - L ---********** **********--- R - cpu 0.07%  
pos 000050496 - 0:00 - L -----******** ********----- R - cpu 0.14%  
pos 000059536 - 0:00 - L -----******** *********---- R - cpu 0.14%  
pos 000068572 - 0:00 - L -----******** *********---- R - cpu 0.19%  
pos 000077544 - 0:00 - L -----******** ********----- R - cpu 0.19%  
pos 000086464 - 0:00 - L -----******** *********---- R - cpu 0.25%  
pos 000095364 - 0:00 - L -----******** ********----- R - cpu 0.25%
...

编译器信息(gcc -v):

Using built-in specs.
COLLECT_GCC=gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/4.8.1/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-4.8.1/configure --build=x86_64-w64-mingw32 --enable-targets=all --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-graphite --enable-cxx-flags=-DWINPTHREAD_STATIC --enable-libstdcxx-debug --enable-threads=posix --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable-libstdcxx-time --with-gnu-ld --disable-werror --disable-nls --disable-win32-registry --prefix=/mingw64tdm --with-local-prefix=/mingw64tdm --with-pkgversion=tdm64-2 --with-bugurl=http://tdm-gcc.tdragon.net/bugs
Thread model: posix
gcc version 4.8.1 (tdm64-2)

调试:

user@LAPTOP-OIQUIP0K C:\Users\user\Documents\Projects\sound
> gdb.exe qks.exe
GNU gdb (GDB) 7.7.50.20140303-cvs
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-mingw32".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".

This binary was built by Equation Solution <http://www.Equation.com>...
Reading symbols from qks.exe...done.
(gdb) b main
Breakpoint 1 at 0x4015c5: file qks.c, line 59.
(gdb) r -d -1 "C:\Users\user\Music\Radiohead\Creep.mp3"
Starting program: C:\Users\user\Documents\Projects\sound\qks.exe -d -1 "C:\Users\user\Music\Radiohead\Creep.mp3"
[New Thread 2708.0x16f4]
[New Thread 2708.0x4c0]

Breakpoint 1, main (argc=4, argv=0xab2390) at qks.c:59
59              HINSTANCE bass=LoadLibrary("bass.dll"); // load BASS
(gdb) n
[New Thread 2708.0xd28]
60              BASS_Init=GetProcAddress(bass,"BASS_Init"); // get BASS_Init
(gdb)
61              BASS_GetVersion=GetProcAddress(bass,"BASS_GetVersion");
(gdb)
62              BASS_Free=GetProcAddress(bass,"BASS_Free");
(gdb)
63              BASS_SetVolume=GetProcAddress(bass,"BASS_SetVolume");
(gdb)
64              BASS_SetConfig=GetProcAddress(bass,"BASS_SetConfig");
(gdb)
65              BASS_SampleFree=GetProcAddress(bass,"BASS_SampleFree");
(gdb)
66              BASS_SampleLoad=GetProcAddress(bass,"BASS_SampleLoad");
(gdb)
67              BASS_SampleGetChannel=GetProcAddress(bass,"BASS_SampleGetChannel");
(gdb)
68              BASS_ChannelPlay=GetProcAddress(bass,"BASS_ChannelPlay");
(gdb)
69              BASS_ChannelStop=GetProcAddress(bass,"BASS_ChannelStop");
(gdb)
70              BASS_GetVolume=GetProcAddress(bass,"BASS_GetVolume");
(gdb)
71              BASS_GetVersion=GetProcAddress(bass,"BASS_GetVersion");
(gdb)
72              BASS_GetCPU=GetProcAddress(bass,"BASS_GetCPU");
(gdb)
73              BASS_Pause=GetProcAddress(bass,"BASS_Pause");
(gdb)
74              BASS_Start=GetProcAddress(bass,"BASS_Start");
(gdb)
75              BASS_MusicFree=GetProcAddress(bass,"BASS_MusicFree");
(gdb)
76              BASS_MusicLoad=GetProcAddress(bass,"BASS_MusicLoad");
(gdb)
77              BASS_ChannelSetAttribute=GetProcAddress(bass,"BASS_ChannelSetAttribute");
(gdb)
78              BASS_StreamCreateFile=GetProcAddress(bass,"BASS_StreamCreateFile");
(gdb)
79              BASS_ErrorGetCode=GetProcAddress(bass,"BASS_ErrorGetCode");
(gdb)
80              BASS_StreamCreateURL=GetProcAddress(bass, "BASS_StreamCreateURL");
(gdb)
81              BASS_ChannelGetLength=GetProcAddress(bass, "BASS_ChannelGetLength");
(gdb)
82              BASS_StreamGetFilePosition=GetProcAddress(bass, "BASS_StreamGetFilePosition");
(gdb)
83              BASS_ChannelGetAttribute=GetProcAddress(bass, "BASS_ChannelGetAttribute");
(gdb)
84              BASS_ChannelGetTags=GetProcAddress(bass, "BASS_ChannelGetTags");
(gdb)
85              BASS_ChannelGetLength=GetProcAddress(bass, "BASS_ChannelGetLength");
(gdb)
86              BASS_ChannelBytes2Seconds=GetProcAddress(bass, "BASS_ChannelBytes2Seconds");
(gdb)
87              BASS_ChannelIsActive=GetProcAddress(bass, "BASS_ChannelIsActive");
(gdb)
88              BASS_ChannelGetLevel=GetProcAddress(bass, "BASS_ChannelGetLevel");
(gdb)
89              BASS_ChannelGetPosition=GetProcAddress(bass, "BASS_ChannelGetPosition");
(gdb)
90              BASS_ChannelSlideAttribute=GetProcAddress(bass, "BASS_ChannelSlideAttribute");
(gdb)
95          int a,device=-1;
(gdb)
97          printf("Simple console mode BASS example : MOD/MPx/OGG/WAV player\n"
(gdb)
101         if (HIWORD(BASS_GetVersion())!=BASSVERSION) {
(gdb)
0x744d59c6 in ?? ()
(gdb) ni
0x744b10f9 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b45c5 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b45c6 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b45cc in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b45d2 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b45d4 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b45d6 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b45ee in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b45f0 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b45f1 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b10fe in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b1101 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b1103 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b1104 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744d59cb in ?? ()
(gdb)
0x744d59d0 in ?? ()
(gdb)
0x00401976 in main (argc=4, argv=0xab2390) at qks.c:101
101         if (HIWORD(BASS_GetVersion())!=BASSVERSION) {
(gdb) n
106         for (a=1;a<argc;a++) {
(gdb)
107             if (!strcmp(argv[a],"-l")) {
(gdb)
110             } else if (!strcmp(argv[a],"-d") && a+1<argc) device=atoi(argv[++a]);
(gdb)
106         for (a=1;a<argc;a++) {
(gdb)
107             if (!strcmp(argv[a],"-l")) {
(gdb)
110             } else if (!strcmp(argv[a],"-d") && a+1<argc) device=atoi(argv[++a]);
(gdb)
113         if (a!=argc-1) {
(gdb)
121         if (!BASS_Init(device,44100,0,0,NULL))
(gdb)
0x744d3dc5 in ?? ()
(gdb) ni
0x744d3dc6 in ?? ()
(gdb)
0x744d3dca in ?? ()
(gdb)
0x744d3dcd in ?? ()
(gdb)
0x744d3dd3 in ?? ()
(gdb)
0x744d3dd4 in ?? ()
(gdb)
0x744d3dd5 in ?? ()
(gdb)
0x744b462e in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b4630 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b4644 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b4646 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744d3dda in ?? ()
(gdb)
0x744d3ddc in ?? ()
(gdb)
0x744d3dde in ?? ()
(gdb)
0x744d3de0 in ?? ()
(gdb)
0x744d3de2 in ?? ()
(gdb)
0x744d3de3 in ?? ()
(gdb)
0x744d3da9 in ?? ()
(gdb)
0x744d3daa in ?? ()
(gdb)
0x744b470b in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
0x744b4710 in ?? () from C:\Users\user\Documents\Projects\sound\bass.dll
(gdb)
[New Thread 2708.0x109c]
[New Thread 2708.0x1098]
[New Thread 2708.0xcdc]
[New Thread 2708.0x760]
[New Thread 2708.0x1674]
[New Thread 2708.0x1834]
[New Thread 2708.0x390]
[New Thread 2708.0x1314] <-- здесь начинает играть музыка
                             программу пришлось "убивать" через диспетчер
                             задач, т.к. музыка играет заново снова и снова.   
[Thread 2708.0xd28 exited with code 1]
[Thread 2708.0x4c0 exited with code 1]
[Thread 2708.0x109c exited with code 1]
[Thread 2708.0xcdc exited with code 1]
[Thread 2708.0x1098 exited with code 1]
[Thread 2708.0x1674 exited with code 1]
[Thread 2708.0x760 exited with code 1]
[Thread 2708.0x1834 exited with code 1]
[Thread 2708.0x390 exited with code 1]
[Thread 2708.0x1314 exited with code 1]
[Inferior 1 (process 2708) exited with code 01]

系统:

OS: Windows 10 x64
CPU: AMD A9-9410 RADEON R5, COMPUTE CORES 2C+3G  2.90 GHz

编译和运行命令:

gcc.exe -g -std=c11 -m32 -Wall -Wextra -Wpedantic -lbass -mwindows qks.c -o qks.exe
qks.exe -d -1 "C:\Users\user\Music\Eminem\Rap God.mp3"
c
  • 3 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-08-08 04:24:00 +0000 UTC

重新分配的包装器

  • 4

写了我的包装realloc。一切都在这里吗?也许有一些我没有注意到的缺陷?

#define qk_realloc(p, n) qk_realloc__(p, &p, n)

/*
=================================
[TEST] The qk_realloc__ function

Функция изменяет размер блока памяти,
на который указывает old. Если операция
выполнена успешно, то old присваивается
адрес нового блока памяти. Если операция
не выполнилась, в куче выделяется НОВЫЙ
блок памяти, в него копируется содержимое
old, старые данные освобождаются и указателю
old присваевает адрес нового блока памяти.
Если память не может быть выделена и для
нового блока, функция возвращает NULL,
при этом входные данные не изменяются.
=================================
*/

void* qk_realloc__(void* old, void* const ptrToOld, const u32 n) {
    void* new = realloc(old, n);

    if (new != NULL) {
        return *((void**) ptrToOld) = new;
    }

    // Тут должно быть сообщение типа: "не удалось выполнить realloc(n)".

    new = qk_malloc(n);

    if (new != NULL) {
        memmove(new, old, n);
        free(old);
        return *((void**) ptrToOld) = new;
    }

    // И тут похожее сообщение...

    return NULL;
}
c
  • 2 个回答
  • 10 Views
Martin Hope
eanmos
Asked: 2020-07-23 01:45:41 +0000 UTC

realloc 会导致内存泄漏吗?

  • 5

再会!有一段代码:

// mry_char*  - это wchar_t*
// mry_charsz - это sizeof(wchar_t)

void mry_strcat(mry_char* _dest, const mry_char const* _src) {
    const u32 dl = mry_strlen(_dest);
    const u32 sl = mry_strlen(_src);

    _dest = realloc(_dest, (dl + sl + 1) * mry_charsz);
    memmove(_dest + dl, _src, sl * mry_charsz);
    _dest[dl + sl] = '\0';
}

cppcheck写道:

Id: memleak
Кратко: Memory leak: _dest
Сообщение: Memory leak: _dest

First included by: mary.c

Строка 69: _dest[dl + sl] = '\0';

realloc我知道如果块随着大小的增加而移动,就会出现泄漏,这是真的吗?

更新程序

固定数组越界。

c
  • 2 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5