Результаты поиска
Передача большего количества параметров в указателях функций 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/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 с функцией, которая принимает 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 за моей спиной.
Есть какие-нибудь советы, как это сделать?
C++ управление памятью
Я узнал в колледже, что вы всегда должны освободить свои неиспользуемые объекты, но не то, как вы это делаете на самом деле. Например, правильно структурировать код и так далее. Существуют ли какие-либо общие правила о том, как обрабатывать указатели в C++?
В настоящее время мне запрещено использовать boost. Я должен придерживаться чистого c++, потому что фреймворк, который я использую, запрещает любое использование дженериков.
Завсегдатаев и метод 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);