LINUX.ORG.RU

invalid operands to binary -


0

0

При компиляции mc-4.6.1 gcc 2.96 даёт ошибку:

widget.c:1174: invalid operands to binary -

в функции:

static void
forward_word (WInput *in)
{
unsigned char *p = in->buffer+in->point;

while (*p && (isspace (*p) || ispunct (*p)))
p++;
while (*p && isalnum (*p))
p++;
in->point = p - in->buffer;
}

в строке:

in->point = p - in->buffer;

Помогите разобраться.

Ответ на: комментарий от MKuznetsov

Такое творится в исходниках mc-4.6.1, файл src/widget.c, строка 1174.
Что делать?

abramoff
() автор топика
Ответ на: комментарий от MKuznetsov

Вычитание указателей

> НИЗЗЯ вычитать один адрес из другого

Почему нельзя, однотипные - можно.

Какого типа in->buffer?

DKorolkov
()
Ответ на: Вычитание указателей от DKorolkov

вот определение из оригинальных исходников:

typedef struct {
    Widget widget;
    int  point;                 /* cursor position in the input line */
    int  mark;                  /* The mark position */
    int  first_shown;           /* Index of the first shown character */
    int  current_max_len;       /* Maximum length of input line */
    int  field_len;             /* Length of the editing field */
    int  color;                 /* color used */
    int  first;                 /* Is first keystroke? */
    int  disable_update;        /* Do we want to skip updates? */
    int  is_password;           /* Is this a password input line? */
    unsigned char *buffer;      /* pointer to editing buffer */
    GList *history;             /* The history */
    int  need_push;             /* need to push the current Input on hist? */
    char **completions;         /* Possible completions array */
    int  completion_flags;      /* INPUT_COMPLETE* bitwise flags(complete.h) */
    char *history_name;         /* name of history for loading and saving */
} WInput;

затем gcc4 патч меняет:
-    unsigned char *buffer;     /* pointer to editing buffer */
+    char *buffer;              /* pointer to editing buffer */

Похоже, вот в этом дело. Т.е. получается, я должен подправить forward_word:
-    unsigned char *p = in->buffer+in->point;
+    char *p = in->buffer+in->point;

Так?

abramoff
() автор топика
Ответ на: комментарий от abramoff

> Похоже, вот в этом дело. Т.е. получается, я должен подправить forward_word:

> - unsigned char *p = in->buffer+in->point;

> + char *p = in->buffer+in->point;

>Так?

Очень похоже, что так. Попробуйте, потом напишите о результатах.

DKorolkov
()

по всей видимости дело в том, что p - это unsigned char*, а in->buffer - это char*.

Указатели действительно можно вычитать, но только если они одного типа.

можно попробовать, что-то вроде

in->point = (char*)p - in->buffer;

k_andy ★★★
()
Ответ на: комментарий от DKorolkov

Спасибо всем, спасибо DKorolkov за идею, собралось.

Исправил forward_word:

-    unsigned char *p = in->buffer+in->point;
+    char *p = in->buffer+in->point;

abramoff
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.