【问题标题】:Error when trying to compile code: "C80: Illegal indirection"尝试编译代码时出错:“C80:非法间接”
【发布时间】:2021-06-15 23:59:54
【问题描述】:

目前,我正在处理一个古老的项目,我正在尝试修复一些错误以成功编译它。我对 c 有基本的了解,但不足以完全理解其中的每个错误。

我目前的问题是我收到错误“C80:'*'非法间接”,但我不知道为什么。

代码如下:

/*----------------------------------------------------*/
/*    Generating *lpDes("%23,1f")(float)(word/1000)   */
/*----------------------------------------------------*/
/* Example: 321 --> 32,1                              */
/*----------------------------------------------------*/
void _lWord2Str4f1(LPSTR lpDes, word w)
{
byte b100, b10;

  b100 = w/100;   w -= 100*b100;
  b10 = w/10;     w -= 10*b10;

  if(b100 > 9) {
    *lpDes++ = '*';
    *lpDes++ = '*';
    *lpDes++ = '*';
    *lpDes = '*';
  } else {
//Test !!!!!
    *lpDes++ = (b100 ? '0' + b100 : ' ');
//    *lpDes++ = '0' + b100;
    *lpDes++ = '0' + b10;
    *lpDes++ = *GetText(TEXT_136); // "Error C80: '*' illegal indirection
    *lpDes = '0' + w;
  }
}

LPSTR GetText 的定义

/* ------------------------------------------   */
/*               Get Text                   */
/* -------------------------------------------- */
const char far* const far pText_Err = "?";

    LPSTR GetText(word wNr)
    {
        byte bSprache; // Change Language
        LPSTR pText;
    
        bSprache = TestVar.bLaendereinstellung; // Test !!! neu 08.03.2002
    //  bSprache = 0;
    
        pText = (LPSTR)pText_Err; /* Default */
        if (wNr < D_MaxText) {
            switch(bSprache) {
              #if(SPR_EINB_D == TRUE)
                case SP_D:   pText = (LPSTR)pText_D[wNr];   break;
              #endif

              #if(SPR_EINB_F == TRUE)
               // case SP_F:   pText = (LPSTR)pText_F[wNr];   break;
              #endif

              #if(SPR_EINB_E == TRUE)
                 case SP_E:   pText = (LPSTR)pText_E[wNr];   break;
              #endif
                default: pText = (LPSTR)pText_D[wNr];
            }
        }
        return (LPSTR)pText;
    }

TEXT_136

#define TEXT_136        136

pText_D

const char far* const far pText_D[] =
{
  szText000, szText001, szText002, szText003, szText004,
  szText005, szText006, szText007, szText008, szText009,

  szText010, szText011, szText012, szText013, szText014,
  szText015, szText016, szText017, szText018, szText019,

  szText020, szText021, szText022, szText023, szText024,
  szText025, szText026, szText027, szText028, szText029,

  szText030, szText031, szText032, szText033, szText034,
  szText035, szText036, szText037, szText038, szText039,

  szText040, szText041, szText042, szText043, szText044,
  szText045, szText046, szText047, szText048, szText049,

  szText050, szText051, szText052, szText053, szText054,
  szText055, szText056, szText057, szText058, szText059,

  szText060, szText061, szText062, szText063, szText064,
  szText065, szText066, szText067, szText068, szText069,

  szText070, szText071, szText072, szText073, szText074,
  szText075, szText076, szText077, szText078, szText079,

  szText080, szText081, szText082, szText083, szText084,
  szText085, szText086, szText087, szText088, szText089,

  szText090, szText091, szText092, szText093, szText094,
  szText095, szText096, szText097, szText098, szText099,

  szText100, szText101, szText102, szText103, szText104,
  szText105, szText106, szText107, szText108, szText109,

  szText110, szText111, szText112, szText113, szText114,
  szText115, szText116, szText117, szText118, szText119,

  szText120, szText121, szText122, szText123, szText124,
  szText125, szText126, szText127, szText128, szText129,

  szText130, szText131, szText132, szText133, szText134,
  szText135, szText136, szText137, szText138, szText139,

  szText140, szText141, szText142, szText143, szText144,
  szText145, szText146, szText147, szText148, szText149,

  szText150, szText151, szText152, szText153, szText154,
  szText155, szText156, szText157, szText158, szText159,

  szText160, szText161, szText162, szText163, szText164,
  szText165, szText166, szText167, szText168, szText169,

//  szText170, szText171, szText172, szText173, szText174,
//  szText175, szText176, szText177, szText178, szText179,
};

定义

typedef char far*       LPSTR;

我对这段代码的作用一无所知,因为它是 16 位微处理器的古老操作系统的一部分。

我做了一些研究,有人建议将错误部分从 *lpDes++ = *GetText(TEXT_136); 更改为 lpDes++ = *GetText(TEXT_136);,但我不知道这是可能的还是一个好主意。

如何在不改变逻辑的情况下更改代码?

【问题讨论】:

  • 你有GetText的定义吗?
  • GetText 应该返回一个 char (const) 指针,而它很可能不会。没有GetText()的定义谁知道?
  • GetText 是做什么的?
  • 我已经添加了定义,但不能说出它的真正作用
  • 那么这很可能是你的问题。编译器不知道GetText() 的定义并假定int 作为返回值。对于现代编译器,这至少应该引发警告甚至错误,但如果你还没有看到这个,那么它可能不会这样做。您可以使用我推荐的原型创建一个包含文件(如上所述),或者只是将原型放在模块顶部。

标签: c microprocessors 16-bit


【解决方案1】:

看代码,这就是我能推断出来的

有一个函数可以将长整数(也称为lword)转换为字符串。

void _lWord2Str4f1(LPSTR lpDes, word w)

如果你输入 321 你应该存储 32,1 //notice ,

你首先得到基数 100、基数 10 和基数 1(存储在 w 中)

然后只需将'0'的ascii值添加到b100、b10和b1中就可以将其转换为ascii字符

所以下面的行应该只给你的ascii值,

*lpDes++ = *GetText(TEXT_136); 

也许 136 的 ascii 值是 ,。 更新:

哦.. 问题似乎是赋值丢弃了“const”限定符。 这对某些编译器来说可能没问题,而有些编译器只是给出警告就放手了。

  • 可能有一些编译器选项可以更改以获得 大约。 GCC 似乎并不在意。并且仅在以下情况下发出警告 您将 const 指针分配给变量指针。
  • 或者尝试添加显式转换 *(LPSTR)lpDes++ = *(LPSTR)GetText(TEXT_136);

这里有一个例子来说明这一点(这在某些编译器如 gcc 下可能仍然合法有效)

这可以用一个例子更好地解释:

见下文,

int * pointer;
int * const const_pointer = &var;
const int * pointer_to_const;

/* a */
pointer = const_pointer; // OK, no cast (same type)

/* b */
pointer_to_const = pointer; // OK, casting 'int*' to 'const int*'

/* c */
pointer = pointer_to_const; // Illegal, casting 'const int*' to 'int*'

希望你能理解。

【讨论】:

  • 添加了定义
  • 请参阅我的回复中的更新:部分。我认为解决方案可能是让编译器选项正确或尝试使用不同的类型转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多