Это простое решение STL (~ 5 строк!) с использованием std::find
и std::find_first_not_of
, которое обрабатывает повторы разделителя (например, пробелы или периоды), а также ведущие и конечные разделители:
#include
#include
void tokenize(std::string str, std::vector &token_v){
size_t start = str.find_first_not_of(DELIMITER), end=start;
while (start != std::string::npos){
// Find next occurence of delimiter
end = str.find(DELIMITER, start);
// Push back the token found into vector
token_v.push_back(str.substr(start, end-start));
// Skip all occurences of the delimiter to find new start
start = str.find_first_not_of(DELIMITER, end);
}
}
Попробуйте live !
Это не настоящий ответ. Это просто некоторые идеи и переписывание функции, как я ее понимаю, надеюсь, в более понятной форме.
Я очень подозреваю, что ваша проблема связана со строкой:
if( ((WORD*)zdata)[i] + AsmDrawData.ShiftZ0 >= ((WORD*)zbuffer)[i] )
В этом коде вы приводите указатель zdata
из byte к указателю word. . Мне это кажется странным. Однако сборка, похоже, сделала то же самое. Поскольку вы, вероятно, знаете больше о том, как заполняется поле zdata, вы, вероятно, сможете лучше определить это.
Алгоритм zbuffer кажется довольно стандартным, поэтому даже не пытаясь реконструировать эту сборку, вы сможете довольно легко повторно реализовать ее на C.
Я переписал это, . Мне нравится сохранять это локализованным, поэтому я просто объявляю вверху локальные указатели, которые имеют правильные типы (а также использую стандартные имена C99, потому что они более переносимы, чем WORD).
#include <stdint.h>
inline void AsmDrawWithZ16(BYTE *zdata,BYTE *data,WORD *zbuffer,void *video,int no_dot) {
uint8_t * zd = zdata; // Should this be 8 or 16 bit
uint8_t * dat = data;
uint16_t * zb = zbuffer;
uint16_t shz = AsmDrawData.ShiftZ0;
uint16_t * vid = (uint16_t *)video;
for( int i = 0; i < no_dot; i++ ) {
uint16_t X = shz + zd[i];
if( X >= zb[i] ) // Is this the correct direction of the compare
{
zb[i] = zdata[i] + X; // update the depth
vid[i] = AsmDrawData.Palette[ dat[i] ]; // update the color
}
}
}