Вот функция, которая у меня есть, "Спрайт" - это объект в программе, а "GetSpriteAtPosition" просто возвращает указатель на правильный спрайт по координатам.
Моя проблема в том, что я храню букву в каждом спрайте в виде целого числа. 0 - это a, а 25 - это z, и все, что между ними, соответственно. Мне нужно, чтобы моя функция возвращала char*, который дает мне буквы ряда спрайтов, поэтому, если в программе спрайты написаны по буквам "abcdefgh", то это то, что мне нужно, чтобы эта функция распечатала. Есть сетка спрайтов 8x8, и я правильно получаю координаты, но получаю сообщение об ошибке, что я не могу преобразовать int в char* в отмеченной строке. Что я могу сделать, чтобы заставить это работать?
Заранее спасибо!
char* RowLetters(int row)
{
char* pointer;
for( int i = 0; i < 8; i++)
{
Sprite* selectedSprite = SpriteAtPosition(row*50, i * 50);
if(selectedSprite != NULL)
{
char* temp = (char)(selectedSprite->Frame() + 97); //error here
pointer = strcat(pointer, temp);
}
else
{
pointer = strcat(pointer, "test");
}
}
return pointer;
}
Ответ 1 · рейтинг 3 · hall.stephenk
Попробуй это:
char temp = (char)(selectedSprite->Frame() + 97);
pointer = strcat(pointer, &temp);
Я изменил переменную на стандартную char, а не на указатель, а затем передал ссылку на strcat() с помощью оператора &.
ИЗМЕНИТЬ:
Как указано в комментариях, это не работает, потому что &temp не завершается NULL. Раньше я обходил это, когда программировал больше C, делая следующее.
char temp[2];
temp[0] = (char)(selectedSprite->Frame() + 97);
temp[1] = '\0';
pointer = strcat(pointer, temp);
Конечно, массив temp можно было бы объявить вне цикла for() для немного лучшей производительности (теоретически).
Ничто из этого не решает другие проблемы с кодом, таким как pointer, никогда не объявляемым. Я думаю, что более широкое понимание вызывающей функции было бы для того, чтобы определить, должно ли pointer быть выделено внутри этой функции или передано вызывающей стороной.
Ответ 2 · рейтинг 2 · Chad
Ваш код в том виде, в котором он написан, будет иметь неопределенное поведение, потому что pointer не инициализирован и не указывает на какую-либо допустимую память, которую вы выделили (для хранения соответствующей длины букв в строке.
Если это действительно C++, как вы утверждаете, то вы не хотите возвращать char* из этой функции, так как это подразумевает, что у вас есть статическая строка, уже выделенная в этой функции (гадость), или вы будете динамически выделять строку в этой функции, и вызывающий должен освободить ее (фу).
Ни один из этих вариантов не идеален.
Я бы предложил очень простое изменение, чтобы вернуть std::string, например:
std::string RowLetters(int row)
{
std::string pointer;
for( int i = 0; i < 8; i++)
{
Sprite* selectedSprite = SpriteAtPosition(row*50, i * 50);
if(selectedSprite != NULL)
{
pointer.push_back((char)(selectedSprite->Frame() + 97));
}
else
{
// ???
// pointer = strcat(pointer, "test");
}
}
return pointer;
}