powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Цикл: здесь нет ошибки?
16 сообщений из 16, страница 1 из 1
Цикл: здесь нет ошибки?
    #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
Цикл: здесь нет ошибки?
    #39698478
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256kЯ не прав?
не критично, т.к. во втором цикле переменная переинициализируется и отдельно вне и во втором цикле никак не используется.
Видимо автор просто хотел сэкономить на переменных.
...
Рейтинг: 0 / 0
Цикл: здесь нет ошибки?
    #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
Цикл: здесь нет ошибки?
    #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
Цикл: здесь нет ошибки?
    #39698509
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPS Для выделения кода есть тэг SRC


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

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


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

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


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

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

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



вариант, а можно наверное и так сделать
Код: plaintext
1.
for (int  j = 0; j < 2; j++)
...
Рейтинг: 0 / 0
Цикл: здесь нет ошибки?
    #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
Цикл: здесь нет ошибки?
    #39698707
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256k,

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

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

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

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

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


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