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;
}

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

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

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

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

Войти через центр авторизации
Похожие вопросы
03 дек. 2021, в 10:17
3000 руб./за проект
03 дек. 2021, в 08:36
500 руб./за проект