Я извиняюсь, если мое форматирование неверно, так как это мой первый пост, я не смог найти пост на сайте, посвященный той же проблеме, с которой я столкнулся. Я использую простой C на сервере Ubuntu 12.04. Я пытаюсь объединить несколько строк в одну строку, разделенную Ns. Однако размеры строк и расстояние между строками могут различаться. Была создана структура для хранения позиционных данных в виде нескольких целых чисел, которые можно передать нескольким функциям:
typedef struct pseuInts {
int pseuStartPos;
int pseuPos;
int posDiff;
int scafStartPos;
} pseuInts;
А также строковая структура:
typedef struct string {
char *str;
int len;
} myString;
Поскольку для объединенной строки существуют условия разрыва, было собрано несколько узлов динамически связанного списка, содержащего идентификатор и объединенную строку:
typedef struct entry {
myString title;
myString seq;
struct entry *next;
} entry;
Вызов memset выглядит следующим образом:
} else if ((*pseuInts)->pseuPos != (*pseuInts)->scafStartPos) {
(*pseuEntry)->seq.str = realloc ((*pseuEntry)->seq.str, (((*pseuEntry)->seq.len) + (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos)))); //realloc the string being extended to account for the Ns
memset (((*pseuEntry)->seq.str + ((*pseuEntry)->seq.len)), 'N', (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos))); //insert the correct number of Ns
(*pseuEntry)->seq.len += (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos)); //Update the length of the now extended string
(*pseuInts)->pseuPos += (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos)); //update the position values
}
Все они разыменовываются как this else, если решение находится в функции, вызываемой функцией, вызываемой из main, но изменения в структуре pseuEntry необходимо обновить в main, чтобы передать их другой функции для дальнейшей обработки.
Я дважды проверил числа, используемые в pseuInts, вставив несколько команд printf, и они правильно указывают, сколько N нужно добавить, даже если они меняются между разными короткими строками. Однако, когда программа запускается, memset вставляет Ns только при первом вызове. IE:
GATTGT и TAATTTGACT разделены 4 пробелами, и они становятся:
GATTGTNNNNTAATTTGACT
Однако второй раз, когда он вызывается для той же объединенной строки, он не работает. IE:
TAATTTGACT и TCTCC разделены 6 пробелами, поэтому длинная строка должна выглядеть так:
GATTGTNNNNTAATTTGACTNNNNNNTCTCC
но показывает только:
GATTGTNNNNTAATTTGACTTCTCC
Я добавил printfs для отображения объединенной строки непосредственно перед и после memset, и они идентичны в выводе.
Иногда вставка добавляет дополнительные символьные пробелы, но не инициализирует их, поэтому они печатают чепуху (как и следовало ожидать) . IE:
GAATAAANNNNNNNNNNNNNNNNN¬GCTAATG
должно быть
GAATAAANNNNNNNNNNNNNNNNNGCTAATG
Я переключил memset на цикл for или while и получил тот же результат. Я использовал промежуточный char * для перераспределения и все равно получаю тот же результат. Я ищу предложения относительно того, где я должен искать, чтобы попытаться обнаружить ошибку.
pseuInts
— это тип в первом блоке кода и переменная в последнем блоке кода. - person WhozCraig   schedule 26.11.2013pseuInts.pseuPos
вместо(*pseuInts)->pseuPos
? (и другие.) - person ryyker   schedule 26.11.2013scafStartPos and pseuPos
при вызовеmemset
? - person Fiddling Bits   schedule 26.11.2013scafStartPos
иpseuPos
? Если они оба одинаковые,memset
ничего не установит, верно? - person Fiddling Bits   schedule 26.11.2013