C реализация кода на ассемблере

Это простое решение 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 !

1
задан XRazont 30 August 2010 в 12:57
поделиться

1 ответ

Это не настоящий ответ. Это просто некоторые идеи и переписывание функции, как я ее понимаю, надеюсь, в более понятной форме.

Я очень подозреваю, что ваша проблема связана со строкой:

 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
     }
  }
}
2
ответ дан 2 September 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: