Найдено результатов: 5

Передача большего количества параметров в указателях функций C

Допустим, я создаю шахматную программу. У меня есть функция

void foreachMove( void (*action)(chess_move*), chess_game* game); 

который вызовет действие указателя функции при каждом действительном перемещении. Это все хорошо и хорошо, но что делать, если мне нужно передать больше параметров функции действия? Например:

chess_move getNextMove(chess_game* game, int depth){
  //for each valid move, determine how good the move is
  foreachMove(moveHandler, game);
}

void moveHandler(chess_move* move){
  //uh oh, now I need the variables "game" and "depth" from the above function
}

Переопределение указателя функции не является оптимальным решением. Функция foreachMove является универсальной, и многие различные места в коде ссылаются на нее. Нет смысла для каждой из этих ссылок обновлять свою функцию, чтобы включить в нее параметры, которые им не нужны.

Как передать дополнительные параметры вызываемой функции через указатель?

c   architecture   pointers    

475   9   09:37, 14th August, 2020


Как я могу отсортировать массив двойных указателей на основе значений, на которые они указывают?

Я пытаюсь построить функцию в C/C++ для сортировки массива и замены каждого значения на его "score" или ранг. Он принимает массив двойных указателей к массиву ints и сортирует двойные указатели на основе разыменованного значения целых чисел. Я пробовал довольно много раз, чтобы заставить его работать, но не могу получить его вниз. Еще раз, он должен сортировать двойные указатели на основе значений, на которые они указывают. Вот что у меня есть:

void SortArray( int ** pArray, int ArrayLength )
{
  int i, j, flag = 1;     // set flag to 1 to begin initial pass
  int * temp;             // holding variable orig with no *
  for(i = 1; (i <= ArrayLength) && flag; i++)
  {
    flag = 0;
    for (j = 0; j < (ArrayLength -1); j++)
    {
        if (*pArray[j+1] > *pArray[j])    // ascending order simply changes to <
        { 
            temp = &pArray[j];            // swap elements
            pArray[j] = &pArray[j+1];
            pArray[j+1] = &temp;
            flag = 1;                     // indicates that a swap occurred.
        }
    }
  }
}

c++   c   arrays   pointers   reference    

409   5   11:39, 29th August, 2020


Указатель на указатель управляемый C++

У меня есть старая библиотека C с функцией, которая принимает void**:

oldFunction(void** pStuff);

Я пытаюсь вызвать эту функцию из managed C++ (m_pStuff является членом родительского ref-класса типа void*):

oldFunction( static_cast<sqlite3**>(  &m_pStuff ) );

Это дает мне следующую ошибку от Visual Studio:

ошибка C2440: 'static_cast': не удается преобразовать из 'cli::interior_ptr' в ' void **'

Я предполагаю, что компилятор преобразует указатель члена void* в cli::interior_ptr за моей спиной.

Есть какие-нибудь советы, как это сделать?

pointers   managed-c++    

406   2   03:53, 11th August, 2020


C++ управление памятью

Я узнал в колледже, что вы всегда должны освободить свои неиспользуемые объекты, но не то, как вы это делаете на самом деле. Например, правильно структурировать код и так далее. Существуют ли какие-либо общие правила о том, как обрабатывать указатели в C++?

В настоящее время мне запрещено использовать boost. Я должен придерживаться чистого c++, потому что фреймворк, который я использую, запрещает любое использование дженериков.

c++   memory   pointers    

390   8   14:15, 8th August, 2020


Завсегдатаев и метод static_cast и динамическое приведение dynamic_cast

Я пишу код C и C++ уже почти двадцать лет, но есть один аспект этих языков, который я никогда по-настоящему не понимал. Я, очевидно, использовал обычные слепки.

MyClass *m = (MyClass *)ptr;

повсюду, но, кажется, есть еще два типа слепков, и я не знаю разницы. В чем разница между следующими строками кода?

MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);

c++   pointers   casting    

585   8   10:08, 2nd August, 2020