如何解决“右侧操作数无效”错误?

Salocinx

我目前正在使用Eclipse CDT,ESP-IDF框架和ESP32 Wrover DevKit

我一直在寻找一种C矢量实现,在GitHub上偶然发现了rxi / vec我复制vec.h复制vec.c到我的项目中,并尝试进行编译。我收到以下错误:

Error: right-hand operand of comma expression has no effect[-Werror=unused-value]

...在这行代码中vec.h

#define vec_push(v, val)\
  ( vec_expand_(vec_unpack_(v)) ? -1 :\
    ((v)->data[(v)->length++] = (val), 0), 0 )

任何想法如何解决这个问题或解决?任何替代向量实现C


更新A

../main/tools/inc/vec.h:35:42: error: right-hand operand of comma expression has no effect [-Werror=unused-value]
   ( vec_expand_(vec_unpack_(v)) ? -1 :\
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
     ((v)->data[(v)->length++] = (val), 0), 0 )
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
../main/main.c:44:2: note: in expansion of macro 'vec_push'
  vec_push(&toc.items, item1);
  ^~~~~~~~
../main/tools/inc/vec.h:35:42: error: right-hand operand of comma expression has no effect [-Werror=unused-value]
   ( vec_expand_(vec_unpack_(v)) ? -1 :\
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
     ((v)->data[(v)->length++] = (val), 0), 0 )
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
../main/main.c:50:2: note: in expansion of macro 'vec_push'
  vec_push(&item1.elements, elem1);
  ^~~~~~~~
../main/tools/inc/vec.h:35:42: error: right-hand operand of comma expression has no effect [-Werror=unused-value]
   ( vec_expand_(vec_unpack_(v)) ? -1 :\
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
     ((v)->data[(v)->length++] = (val), 0), 0 )
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
../main/main.c:56:2: note: in expansion of macro 'vec_push'
  vec_push(&item1.elements, elem2);
  ^~~~~~~~
cc1: some warnings being treated as errors

更新B

#include <stdio.h>
#include <stdlib.h>
#include "vec.h"

typedef struct toc_element_t {
  uint16_t uid;
  char element[8];
  char type[8];
} toc_element_t;

typedef vec_t(toc_element_t) vec_toc_element_t;

typedef struct toc_item_t {
  char category[8];
  vec_toc_element_t elements;
} toc_item_t;

typedef vec_t(toc_item_t) vec_toc_item_t;

typedef struct toc_t {
    char description[8];
    vec_toc_item_t items;
} toc_t;


void app_main(void) {

    toc_t toc;
    strcpy(toc.description, "toc1");
    vec_init(&toc.items);

    toc_item_t item1;
    strcpy(item1.category, "cat1");
    vec_init(&item1.elements);
    vec_push(&toc.items, item1);

    toc_element_t elem1;
    elem1.uid=0;
    strcpy(elem1.element, "elem1");
    strcpy(elem1.type, "float");
    vec_push(&item1.elements, elem1);

    toc_element_t elem2;
    elem2.uid=1;
    strcpy(elem2.element, "elem2");
    strcpy(elem2.type, "float");
    vec_push(&item1.elements, elem2);


    printf("TOC [%s]:\n", toc.description);

    toc_item_t item; int index1;
    vec_foreach(&toc.items, item, index1) {
        printf(" - item[%d]=%s\n", index1, item.category);
        toc_element_t element; int index2;
        vec_foreach(&item.elements, element, index2) {
            printf("  - element[%d]=%s [%s]\n", index2, element.element, element.type);
        }
    }

    while(1);

}

更新C

也许这个问题与这个问题无关,但是由于Eric在上次提交时提到了日志消息“针对结构体修复了vec_insert()和vec_push()”,并插入了,0导致此处讨论的问题的“腥” ,因此可能是有关。

当执行“更新B”部分中的代码时,我得到以下输出:

TOC [toc1]:
 - item[0]=cat1

但我期望以下几点:

TOC [toc1]:
 - item[0]=cat1
  - element[0]=elem1
  - element[1]=elem2

已解决:为什么内部矢量无法打印出来?

埃里克·波斯蒂奇(Eric Postpischil)

编译器可以警告您。那里有些鱼。… ? -1 : (…, 0)零件旨在返回成功/失败指示,然后尾随, 0将其丢弃。它是“有效代码”,因为它没有违反C标准的规则,但是显然那里存在设计或编码错误。

额外内容, 0在提交dd55e00e17d454f54b905fdcf6718ba0c1ed94b0中引入,日志消息为“针对结构固定了vec_insert()和vec_push()”。与之相同的更改vec_insert是该提交中的唯一更改:

--- a/src/vec.h
+++ b/src/vec.h
@@ -33,7 +33,7 @@

 #define vec_push(v, val)\
   ( vec_expand_(vec_unpack_(v)) ? -1 :\
-    ((v)->data[(v)->length++] = (val)), 0 )
+    ((v)->data[(v)->length++] = (val), 0), 0 )


 #define vec_pop(v)\
@@ -52,7 +52,7 @@

 #define vec_insert(v, idx, val)\
   ( vec_insert_(vec_unpack_(v), idx) ? -1 :\
-    ((v)->data[idx] = (val)), (v)->length++, 0 )
+    ((v)->data[idx] = (val), 0), (v)->length++, 0 )

我看不到这些更改如何与日志消息相符。我认为这是一个错误。注意,预先提交的代码是错误的。此代码:

  ( vec_expand_(vec_unpack_(v)) ? -1 :\
    ((v)->data[(v)->length++] = (val)), 0 )

有模式(Test ? -1 : (Operation), 0)由于逗号运算符的优先级最低,因此始终产生0。提交将其更改为(Test ? -1 : (Operation, 0), 0),具有相同的行为-在:一侧,将执行该操作,但结果将被丢弃,评估并丢弃0,然后再有一个0。如果提交将其更改为(Test ? -1 : (Operation, 0)),则将说得通。提交将修复错误,因为该宏以前总是产生0,但现在根据操作是否成功将产生0或-1。

储存库中的所有测试均未检查的“返回”值vec_push

删除, 0在正常情况下,结果扩展将继续评估为零。如果推送失败(因为内存分配失败),它将变为评估为-1,但这似乎是合乎需要的。好的代码应该是:

#define vec_push(v, val)\
  ( vec_expand_(vec_unpack_(v)) ? -1 :\
    ((v)->data[(v)->length++] = (val), 0))

同时对进行相同的更改vec_insert并查找需要修复的任何类似代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Openpyxl:如何解决 .iter_cols 不支持的操作数错误

安装GCC 3.2:如何解决错误“需要左值作为增量操作数”?

如何解决“错误:二进制运算符的错误操作数类型”问题?

如何解决错误:“在字符串中”需要字符串作为左操作数而不是元组?

如何解决这个二元运算符的错误操作数类型

如何解决错误:运算符“==”不能应用于“方法组”和“int”类型的操作数

错误:后缀或操作数对“ vbroadcastss”无效

如何解决无效操作数以解决二进制表达式问题('const char *和'double')

我如何解决以下问题:#1241-操作数应包含1列

python3.4,<<不支持的操作数类型,我该如何解决?

如何解决操作数应包含 1 列的内连接?

野牛:额外的操作数卷曲。如何解决这个问题?

TypeError: 不支持 & 的操作数类型:'str' 和 'str' 如何解决

两个值相乘时如何解决“致命错误:未捕获错误:不支持的操作数类型”

MySQL错误“重复操作符操作数无效”

与泛型一起使用时,如何解决“二进制运算符'+'的错误操作数”?

如何解决 C#:错误 1Operator '>' 不能应用于 'int' 和 'SpeedTest.Program.SpeedLimit' 类型的操作数

无效的“ in”操作数n

如何修复“对二进制表达式无效的操作数”错误?

RE错误:重复运算符操作数无效

grep错误:重复运算符操作数无效

错误:无效的“asm”:%-字母后缺少操作数编号

错误A2070:无效的指令操作数

错误:'*' 的操作数(*UND* 和 *UND* 部分)无效

如何在Java中解决以下函数的“错误操作数类型”?

如何解决:ValueError:操作数不能与形状(4,)(4,6)一起广播

处理Bagging方法时,如何解决TypeError:+不支持的操作数类型:“ int”和“ NoneType”

运算符'||' 无法应用于类型为'string'和'string'的操作数(如何解决此问题)

python - 如何解决不支持的操作数类型-:'str'和'datetime.timedelta'?