Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Цикл: здесь нет ошибки? / 16 сообщений из 16, страница 1 из 1
05.09.2018, 13:47
    #39698463
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
Как по мне - это не правильно, но уже версия 10 одбц драйвера постгрес, а код остается.
Цикл начальный с переменной k и внутри него еще один с той же переменной.
Я не прав?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
for (k = 0; k < num_keys; k++)
			{
				/ Check that the key listed is the primary key /
				keyresult = PGAPI_Fetch(hpkey_stmt);
				if (keyresult != SQL_SUCCESS)
				{
					num_keys = 0;
					break;
				}
				if (!got_pkname)
				{
					PGAPI_GetData(hpkey_stmt, 6, internal_asis_type, pkname, sizeof(pkname), NULL);
					got_pkname = TRUE;
				}
				pkey_text = getClientColumnName(conn, relid2, pkey_ptr, &pkey_alloced);
				MYLOG(0, "pkey_ptr='%s', pkey='%s'\n", pkey_text, pkey);
				if (strcmp(pkey_text, pkey))
				{
					num_keys = 0;
					break;
				}
				if (pkey_alloced)
					free(pkey_text);
				pkey_alloced = FALSE;
				/ Get to next primary key /
				for (k = 0; k < 2; k++)
					pkey_ptr += strlen(pkey_ptr) + 1;

			}
...
Рейтинг: 0 / 0
05.09.2018, 13:59
    #39698478
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
256kЯ не прав?
не критично, т.к. во втором цикле переменная переинициализируется и отдельно вне и во втором цикле никак не используется.
Видимо автор просто хотел сэкономить на переменных.
...
Рейтинг: 0 / 0
05.09.2018, 14:00
    #39698480
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
256kКак по мне - это не правильно, но уже версия 10 одбц драйвера постгрес, а код остается.
Цикл начальный с переменной k и внутри него еще один с той же переменной.
Я не прав?
Ты прав. Первый цикл бесконечный при num_keys > 2, но он работает т.к. скорее всего заканчивается на одном из break.

PS Для выделения кода есть тэг SRC
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
for (k = 0; k < num_keys; k++)
			{
				/ Check that the key listed is the primary key /
				keyresult = PGAPI_Fetch(hpkey_stmt);
				if (keyresult != SQL_SUCCESS)
				{
					num_keys = 0;
					break;
				}
				if (!got_pkname)
				{
					PGAPI_GetData(hpkey_stmt, 6, internal_asis_type, pkname, sizeof(pkname), NULL);
					got_pkname = TRUE;
				}
				pkey_text = getClientColumnName(conn, relid2, pkey_ptr, &pkey_alloced);
				MYLOG(0, "pkey_ptr='%s', pkey='%s'\n", pkey_text, pkey);
				if (strcmp(pkey_text, pkey))
				{
					num_keys = 0;
					break;
				}
				if (pkey_alloced)
					free(pkey_text);
				pkey_alloced = FALSE;
				/ Get to next primary key /
				for (k = 0; k < 2; k++)
					pkey_ptr += strlen(pkey_ptr) + 1;

			}
...
Рейтинг: 0 / 0
05.09.2018, 14:12
    #39698493
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
Хотя... (немного не так воспринял код без тега SRC :( )

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
for (k = 0; k < num_keys; k++)
{
       / Check that the key listed is the primary key /
       keyresult = PGAPI_Fetch(hpkey_stmt);
       if (keyresult != SQL_SUCCESS)
       {
            num_keys = 0;
            break;
       }

       if (!got_pkname)
       {
             PGAPI_GetData(hpkey_stmt, 6, internal_asis_type, pkname, sizeof(pkname), NULL);
             got_pkname = TRUE;
       }
       pkey_text = getClientColumnName(conn, relid2, pkey_ptr, &pkey_alloced);
       MYLOG(0, "pkey_ptr='%s', pkey='%s'\n", pkey_text, pkey);
        
       if (strcmp(pkey_text, pkey))
       {
            num_keys = 0;
            break;
       }

       if (pkey_alloced)
           free(pkey_text);

       pkey_alloced = FALSE;
       
       // Get to next primary key
       for (k = 0; k < 2; k++)
            pkey_ptr += strlen(pkey_ptr) + 1;
}



вообще-то используется в верхнем цикле и сбрасывается во вложенном:

первая итерация
k = 0
k = 0, k = 1, k = 2

вторая итерация
k = 3
k = 0, k = 1, k = 2

третья итерация
k = 3
k = 0, k = 1, k = 2

и тд.

если num_keys > 3, то данный цикл никогда не закончится, прервать его могут только break'и внутри внешнего for

Если это не ошибка и так задумано специально, то очень индусский код с точки зрения восприятия...
...
Рейтинг: 0 / 0
05.09.2018, 14:31
    #39698509
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
Dima TPS Для выделения кода есть тэг SRC


есть, знаю, но под Оперой его практически нет
...
Рейтинг: 0 / 0
05.09.2018, 14:32
    #39698511
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
Cerebrum256kЯ не прав?
не критично, т.к. во втором цикле переменная переинициализируется и отдельно вне и во втором цикле никак не используется.
Видимо автор просто хотел сэкономить на переменных.

Во внутреннем то да, но ведь она выходя из внутреннего цикла сбивает значение переменной внешнего цикла?
...
Рейтинг: 0 / 0
05.09.2018, 14:36
    #39698515
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
CerebrumХотя... (немного не так воспринял код без тега SRC :( )

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
for (k = 0; k < num_keys; k++)
{
       / Check that the key listed is the primary key /
       keyresult = PGAPI_Fetch(hpkey_stmt);
       if (keyresult != SQL_SUCCESS)
       {
            num_keys = 0;
            break;
       }

       if (!got_pkname)
       {
             PGAPI_GetData(hpkey_stmt, 6, internal_asis_type, pkname, sizeof(pkname), NULL);
             got_pkname = TRUE;
       }
       pkey_text = getClientColumnName(conn, relid2, pkey_ptr, &pkey_alloced);
       MYLOG(0, "pkey_ptr='%s', pkey='%s'\n", pkey_text, pkey);
        
       if (strcmp(pkey_text, pkey))
       {
            num_keys = 0;
            break;
       }

       if (pkey_alloced)
           free(pkey_text);

       pkey_alloced = FALSE;
       
       // Get to next primary key
       for (k = 0; k < 2; k++)
            pkey_ptr += strlen(pkey_ptr) + 1;
}



вообще-то используется в верхнем цикле и сбрасывается во вложенном:

первая итерация
k = 0
k = 0, k = 1, k = 2

вторая итерация
k = 3
k = 0, k = 1, k = 2

третья итерация
k = 3
k = 0, k = 1, k = 2

и тд.

если num_keys > 3, то данный цикл никогда не закончится, прервать его могут только break'и внутри внешнего for

Если это не ошибка и так задумано специально, то очень индусский код с точки зрения восприятия...


Здесь:
https://github.com/hiinoue/psqlodbc/blob/master/info.c

строки 4317 и 4342
...
Рейтинг: 0 / 0
05.09.2018, 14:50
    #39698540
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
256kЗдесь:
https://github.com/hiinoue/psqlodbc/blob/master/info.c
судя по всему это нормальная практика такого кода у авторов (см. скриншот)

я бы добавил отдельную функцию

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char* offset_p(char* p, size_t count)
{
    for (size_t i = 0; i < count; ++i)
         p += strlen(p) + 1;
 
    return p;
}


тогда можно было бы записать вместо второго и всех других вложенных циклов:

Код: plaintext
1.
2.
// Get to next primary key
pkey_ptr = offset_p(pkey_ptr, 2);



и проблема была бы исчерпана и код был бы прозрачнее и не возникало головоломки с множественным использованием индексов.
Возможно где-то это и оправдано, но рано или поздно сыграет человеческий фактор и это выльется в ошибку, которую будет ой как не просто найти, поэтому функции рулят!
...
Рейтинг: 0 / 0
05.09.2018, 14:53
    #39698544
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
256kЗдесь:
https://github.com/hiinoue/psqlodbc/blob/master/info.c
и вообще писать такие портянки - это врагу не пожелаешь
как потом отлаживать этот папирус, я хз
...
Рейтинг: 0 / 0
05.09.2018, 14:55
    #39698546
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
256kDima TPS Для выделения кода есть тэг SRC


есть, знаю, но под Оперой его практически нет
При чем тут твоя опера? Предлагаешь нам глаза ломать об твои посты?
256kВо внутреннем то да, но ведь она выходя из внутреннего цикла сбивает значение переменной внешнего цикла?
В зависимости от num_keys внешний цикл вырождается в одно из двух:
1. Отсутствие цикла, т.е. 1 проход
2. Зацикливание и выход по одному из break

Как выше подмечено - код корявый, но скорее всего вполне рабочий.
...
Рейтинг: 0 / 0
05.09.2018, 14:59
    #39698550
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
Dima T256kпропущено...


есть, знаю, но под Оперой его практически нет
При чем тут твоя опера? Предлагаешь нам глаза ломать об твои посты?
256kВо внутреннем то да, но ведь она выходя из внутреннего цикла сбивает значение переменной внешнего цикла?
В зависимости от num_keys внешний цикл вырождается в одно из двух:
1. Отсутствие цикла, т.е. 1 проход
2. Зацикливание и выход по одному из break

Как выше подмечено - код корявый, но скорее всего вполне рабочий.
В каких-то случаях рабочий, в каких-то нет, причем, как было сказано выше - обнаружить трудно.

И код не мой, и Опера не моя, была бы моя я бы исправил :-)
...
Рейтинг: 0 / 0
05.09.2018, 15:13
    #39698559
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
256kВ каких-то случаях рабочий, в каких-то нет, причем, как было сказано выше - обнаружить трудно.
попробуй второй цикл поправить, может поможет
Код: plaintext
1.
for (int k = 0; k < 2; k++)
...
Рейтинг: 0 / 0
05.09.2018, 15:40
    #39698584
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
Dima T256kВ каких-то случаях рабочий, в каких-то нет, причем, как было сказано выше - обнаружить трудно.
попробуй второй цикл поправить, может поможет
Код: plaintext
1.
for (int k = 0; k < 2; k++)



вариант, а можно наверное и так сделать
Код: plaintext
1.
for (int  j = 0; j < 2; j++)
...
Рейтинг: 0 / 0
05.09.2018, 15:45
    #39698589
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
256kDima Tпропущено...

попробуй второй цикл поправить, может поможет
Код: plaintext
1.
for (int k = 0; k < 2; k++)



вариант, а можно наверное и так сделать
Код: plaintext
1.
for (int  j = 0; j < 2; j++)


это одно и тоже, но твой вариант читабельнее.
...
Рейтинг: 0 / 0
05.09.2018, 19:24
    #39698707
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
256k,

Ошибка есть, но если посмотреть внимательнее, то эта функция PGAPI_ForeignKeys_old вызывается в версиях PG < 8.1

Т.е. это старая ошибка, сейчас не используемая =)
...
Рейтинг: 0 / 0
06.09.2018, 10:12
    #39698866
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл: здесь нет ошибки?
Siemargl256k,

Ошибка есть, но если посмотреть внимательнее, то эта функция PGAPI_ForeignKeys_old вызывается в версиях PG < 8.1

Т.е. это старая ошибка, сейчас не используемая =)

Всё бы так, но есть юзеры, использующие старую версию сервера, и, соответственно, драйверы
Но, писатели оставили это место, не удалили, потмоу и вопрос возник.
И там в коде такое место не одно
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Цикл: здесь нет ошибки? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]