непонятные ошибки указателей - PullRequest
0 голосов
/ 13 мая 2019

Я получаю две ошибки и не знаю, как их исправить.

error 1: 
incompatible pointer types initializing 'int *' with an expression of type 'char *'  
error 2: 
invalid operands to binary expression ('int *' and 'int')|

Я ценю любую помощь! Спасибо!

void play(int *boom_number, char *players)
{
    int y;
    char temp;
    int *sorting_pointer = &players[LENGTH-1];
    int current_index=0;
    while (sorting_pointer!=players[0])
    {
        int position=((&sorting_pointer-&players[0])/sizeof(int));
        current_index=boom_number%position
        char temp[]=players[current_index]
        for (y=current_index; y<position;y++)
        {
            players[y]=players[y+1]
        }
        players[position]=temp
        *sorting_pointer--
    }
}

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Вы должны скомпилировать с максимальным количеством предупреждений:

Clang

$ clang -Weverything -c test.c
test.c:7:10: warning: incompatible pointer types initializing 'int *' with an expression of type 'char *' [-Wincompatible-pointer-types]
    int *sorting_pointer = &players[LENGTH-1];
         ^                 ~~~~~~~~~~~~~~~~~~
test.c:9:27: warning: comparison between pointer and integer ('int *' and 'int')
    while (sorting_pointer!=players[0])
           ~~~~~~~~~~~~~~~^ ~~~~~~~~~~
test.c:11:40: error: 'int **' and 'char *' are not pointers to compatible types
        int position=((&sorting_pointer-&players[0])/sizeof(int));
                       ~~~~~~~~~~~~~~~~^~~~~~~~~~~~
test.c:12:34: error: invalid operands to binary expression ('int *' and 'int')
        current_index=boom_number%position
                      ~~~~~~~~~~~^~~~~~~~~

НКУ

$ gcc -Wall -c test.c
test.c: In function ‘play’:
test.c:7:28: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
     int *sorting_pointer = &players[LENGTH-1];
                            ^
test.c:9:27: warning: comparison between pointer and integer
     while (sorting_pointer!=players[0])
                           ^~
test.c:11:40: error: invalid operands to binary - (have ‘int **’ and ‘char *’)
         int position=((&sorting_pointer-&players[0])/sizeof(int));
                        ~~~~~~~~~~~~~~~~^~~~~~~~~~~~
test.c:12:34: error: invalid operands to binary % (have ‘int *’ and ‘int’)
         current_index=boom_number%position
                                  ^
test.c:13:9: error: expected ‘;’ before ‘char’
         char temp[]=players[current_index]
         ^~~~
test.c:8:9: warning: variable ‘current_index’ set but not used [-Wunused-but-set-variable]
     int current_index=0;
         ^~~~~~~~~~~~~
test.c:6:10: warning: unused variable ‘temp’ [-Wunused-variable]
     char temp;
          ^~~~
test.c:5:9: warning: unused variable ‘y’ [-Wunused-variable]
     int y;

Что касается исправления ваших ошибок ...

Здесь:

void play(int *boom_number, char *players)
{
    ...
    int *sorting_pointer = &players[LENGTH - 1];
    int position = ((&sorting_pointer - &players[0]) / sizeof(int));
    ...
}

Вы, вероятно, хотите сделать что-то вроде:

void play(int *boom_number, char *players)
{
    ...
    char *sorting_pointer = &players[LENGTH - 1];
    size_t length = sorting_pointer - &players[0];
    ...
}
0 голосов

Несмотря на то, что int и char являются совместимыми типами и могут быть неявно преобразованы из int в char, и наоборот, указатели не имеют никакого неявного преобразования, даже если они хранятся в типах.Рассмотрим:

//int* c = &b;      //doesn't work, because &b is char *
//char* d = &a;     // doesn't work, a is int *
int* c = (int*)& b;  //compiled
char* d = (char*)& d;  //compiled
cout << *c << " " << *d << endl;

К сожалению, явное C-преобразование вызывает неопределенное поведение в этих указателях, поэтому мы получаем нежелательный вывод: 9-858993567 B

C ++ преобразование более надежно в этом случае, поэтомуstatic_cast вместо C-преобразования вызывает ошибку компиляции

int * c = static_cast<int*>(&a); // error, invalid type conversion
char * d = static_cast<char*>(&b); // error, invalid type conversion

Только reinterpret_cast позволяет вам делать такие вещи.Таким образом, вы не можете хранить в указателе значение, тип которого не является типом указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...