Illan
@Illan

Почему в Python изменяется строка после использования в функции с модулем на C?

Сразу извиняюсь за качество кода, только учусь, если требуется еще какая-то информация - сообщите.

Мистическим образом меняется строка после использования в функции сравнения запроса mysql с уже найденными. Так же в функции используется самописный модуль на Си.

Исходная строка:
delete from blabla_1archive_visits where `date`<'2014-01-10';

Превращается в:
deletefromblabla_1archive_visitswhere`date`<'2014-01-10';

И так далее.

Вызов функции с затыком:
diff2_s = diff2(str_query[:], BD, queryId)
Функция где происходит затык:

Затык именно между этими принтами.
def diff2(str_query,BD, queryId):
        print 'pre diff2\n3 $$$ ' ,str_query, '\n\n\n'
        line = 0
        cursor.execute('''SELECT id,query FROM queryTable WHERE database = ?''', (BD,))
        rows = cursor.fetchall()
        for row in rows:
            if diff3_ctypes(str_query, row[1]) > 80.:
                print 'after diff2\n4 $$$ ' ,str_query, '\n\n\n'
                line = row[0]
                break
            else: continue
        if line: return line
        else: return False

Модуль на Си:
#include <stdio.h>
#include <string.h>

float diff3 (char str1[],char str2[]) {
    char *token1, *last1;
    char *token2, *last2;
    char *i1[10000];
    char *i2[10000];
    float summ = 0;
    float res = 0;
    float j1 = 0, j2 = 0;
    float x1,x2;

    token1 = strtok_r(str1, " ,=().", &last1);
    while (token1 != NULL) {
        i1[(int)j1] = token1;
        j1 = j1+1;
        token1 = strtok_r(NULL, " ,=().", &last1);
    }
    token2 = strtok_r(str2, " ,=().", &last2);
    while (token2 != NULL) {
        i2[(int)j2] = token2;
        j2=j2+1;
        token2 = strtok_r(NULL, " ,=().", &last2);
    }
    x1 = j1;
    x2 = j2;
    if (x1<=x2)
    {
        for (float k = 0.0; k < x1; k = k+1)
        {
            if (!strcmp(i1[(int)k],i2[(int)k]))
            {
                summ = summ+1.0;
            }
        }
        res = summ/x1*100.0;
    }else{
        for (float k = 0.0; k < x2; k = k + 1)
        {
            if (!strcmp(i1[(int)k],i2[(int)k]))
            {
                summ = summ + 1.0;
            }
        }
        res = summ/x2*100.0;
    }
    return res;
}

  • Вопрос задан
  • 2801 просмотр
Решения вопроса 1
bogolt
@bogolt
Функция diff3 у меня вообще не работает. По крайней мере стабильно меняет значения которые я ей передаю да еще и возвращает NAN вместо значения.

Беглый осмотр показал что внутри нее происходит перезаписывание памяти внутри функции strtok_r. Эта функция записывает значения в указатель переданный третьим параметром, у вас же он даже не инициализирован. Подозреваю что память каким-то чудесным образом ( а других не бывает ) попадает в вашу же переменную str1 или str2. Дальше код не разбирал, но подозреваю что там еще могут быть проблемы с записью в переменные через указатели.

Разберитесь с этой функцией отдельно, отладьте ее вначале, независимо от остального кода.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы