Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Dao

4.9K
25 марта 2005 года
CyberMan
55 / / 25.01.2005
Есть код
CDaoDatabase *m_Base;
m_Base=new CDaoDatabase();
m_Base->Open(C:\myBase.mdb);
int MyTables=m_Base->GetTableDefCount();
так вот перед тем как этот код выполнить я создаю базу данных с двумя таблицами (программно через DAO). Если я не буду открывать базу данных (вне программы) через Access2000 то значение
MyTables будет 6. Если сначала открыть базу а потом выполнить код то значение MyTables будет 7
(размер файла базы данных после открытия увеличится хотя сами данные в таблицах не изменятся(вероятно Access производит какие-то преобразования с файлом)). Так как мне получит действительное число таблиц в базе не зависимо от того открывалась ли ранее база. Для создания программы используется VC++(6.0)
425
25 марта 2005 года
sq_deep
498 / / 18.02.2005
Access создаёт системные таблицы. Все они имеют имена MSys*, по крайней мере, во всех нынешних версиях MS Access.

Поэтому, если не создавать таблиц с именами на MSys, то следующий код будет давать nTables = числу пользовательских таблиц:
Код:
CDaoDatabase* pBase;
    pBase = new CDaoDatabase();
    pBase->Open("c:\\work\\access\\db1.mdb");
    int nTables = 0;
    CDaoTableDefInfo tdi;
    for (int i = 0; i < pBase->GetTableDefCount(); i++)
    {
        pBase->GetTableDefInfo(i, tdi);
        nTables += strncmp("MSys", tdi.m_strName, 4);
    }
    delete pBase;
4.9K
30 марта 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by sq_deep
Access создаёт системные таблицы. Все они имеют имена MSys*, по крайней мере, во всех нынешних версиях MS Access.

Поэтому, если не создавать таблиц с именами на MSys, то следующий код будет давать nTables = числу пользовательских таблиц:


Да я и сам думал подсчитать таблицы в цикле, только не таким способом. В приведенном коде мне непонятно использование функции strncmp(...)
В справке написана такая вещь: strncmp(char *str1,char *str2,int kol)
сравнивает kol символов из 2-х строк. и возвращает -1 если str1>str2 0 если str1=str2 и 1 если str1<str2 (точно не помню). Тогда становится не понятно как понять пользователь создал таблицу или там еще какая то таблица.

425
30 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by CyberMan
... В приведенном коде мне непонятно использование функции strncmp(...)
...


Прошу прощения, конечно, это ошибка. Должно быть

 
Код:
nTables += !strncmp("MSys", tdi.m_strName, 4);
7.2K
30 марта 2005 года
Mongoose
32 / / 23.09.2004
Цитата:
Originally posted by sq_deep
Прошу прощения, конечно, это ошибка. Должно быть
 
Код:
nTables += !strncmp("MSys", tdi.m_strName, 4);

Этот код подсчитывает количество системных файлов.

425
30 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Mongoose
Этот код подсчитывает количество системных файлов.

Да, и тут вы, конечно, правы... думаю, абсолютно правильный вариант решения лучше попросить сделать Mongoose'а.

7.2K
30 марта 2005 года
Mongoose
32 / / 23.09.2004
Цитата:
Originally posted by sq_deep
Да, и тут вы, конечно, правы... думаю, абсолютно правильный вариант решения лучше попросить сделать Mongoose

 
Код:
if(!strncmp("MSys", tdi.m_strName, 4))nTable++;

С Вас 2х20 копеек :roll:
:)
425
30 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Mongoose
 
Код:
if(!strncmp("MSys", tdi.m_strName, 4))nTable++;

С Вас 2х20 копеек :roll:
:)


Ура! решение найдено!
На самом деле по-сишному должно быть
nTables += strncmp("MSys", tdi.m_strName, 4) != 0;

А насчёт 20 копеек я против. Это мой личный копирайт уже много лет. Требуйте 20 центов, или пенсов, или евроцентов, или чего-нибудь там ещё, но копейки мои ;) Это святое.

4.9K
01 апреля 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by sq_deep
Ура! решение найдено!
На самом деле по-сишному должно быть
nTables += strncmp("MSys", tdi.m_strName, 4) != 0;

А насчёт 20 копеек я против. Это мой личный копирайт уже много лет. Требуйте 20 центов, или пенсов, или евроцентов, или чего-нибудь там ещё, но копейки мои ;) Это святое.


Какие вы все меркантильные надо все делать за спасибо. Да и решение я все равно не понял при чем здесь !=0 где тогда if. К тому же как я уже писал strncmp проверяет по ходу количество символов(иначе как тогда понимать str1>str2) значит если в базе имеется 2 таблицы(пользовательские с именами "MS","MYSYS1") то nTables будет=0 тк в одном случае strncmp вернет 1 а в другом -1

425
01 апреля 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by CyberMan
...
Да и решение я все равно не понял...
...


Блин, а мы-то тут блох ловим, а вы-то C не знаете. Ладно, расскажу. Работает всё примерно так.

  1. strncmp() возвращает 0, если строки одинаковые. Иначе возвращает не 0.
  2. strncmp() != 0 возвращает 1, если strncmp() вернула не 0 (т.е. строки были разные). Иначе операция != вернёт 0.
  3. Эта 1 или 0 прибавляется к nTables.
Если и теперь не поймёте, придётся почитать что-нибудь про синтаксис языка C.
4.9K
01 апреля 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by sq_deep
Блин, а мы-то тут блох ловим, а вы-то C не знаете. Ладно, расскажу. Работает всё примерно так.
  1. strncmp() возвращает 0, если строки одинаковые. Иначе возвращает не 0.
  2. strncmp() != 0 возвращает 1, если strncmp() вернула не 0 (т.е. строки были разные). Иначе операция != вернёт 0.
  3. Эта 1 или 0 прибавляется к nTables.
Если и теперь не поймёте, придётся почитать что-нибудь про синтаксис языка C.


да но в справке написано что функция возвращает кроме нуля и 1 еще и -1(сколько можно писать) В общем теперь проблема состоит в том что длина имени пользовательской таблицы может быть меньше 4

488
01 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by CyberMan
да но в справке написано что функция возвращает кроме нуля и 1 еще и -1(сколько можно писать) В общем теперь проблема состоит в том что длина имени пользовательской таблицы может быть меньше 4

Так как есть шанс на то, что sq_deep прочитав твой пост на некоторое время потеряет дар речи, попробую я ответить.
strncmp() возвращает -1, 0, 1. Тогда

strncmp(...)==-1 имеем -1!=0 получаем 1 и nTables +=1;
strncmp(...)== 0 имеем 0!=0 получаем 0 и nTables +=0;
strncmp(...)== 1 имеем 1!=0 получаем 1 и nTables +=1;

Что касается длины имени полей, какое это имеет значение?

strncmp("MSys", tdi.m_strName, 4) сравнивает МАКС 4 символа.

425
01 апреля 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Mоngооsе
Так как есть шанс на то, что sq_deep прочитав твой пост на некоторое время потеряет дар речи, попробую я ответить...


Спасибо Вам, Mоngооsе:!!!: Я уже устал от этого обсуждения. Спасибо за поддержку:!!!: С меня 20 копеек. Дайте свой e-mail. Вышлю немедленно.

Единственное... я тут что-то засомневался... эээ... может, это CyberMan нас с Вами с первым апреля поздравляет таким образом? Что ж, если так, то шутка действительно хорошая :roll: :D

488
01 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by sq_deep
Спасибо Вам, Mоngооsе:!!!: Я уже устал от этого обсуждения. Спасибо за поддержку:!!!: С меня 20 копеек. Дайте свой e-mail. Вышлю немедленно.

Единственное... я тут что-то засомневался... эээ... может, это CyberMan нас с Вами с первым апреля поздравляет таким образом? Что ж, если так, то шутка действительно хорошая :roll: :D

Та не. Я думаю, его кто-то (может начальник) расстроил, и он решил нам выдать свои нервы. :)

4.9K
04 апреля 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by Mоngооsе
Та не. Я думаю, его кто-то (может начальник) расстроил, и он решил нам выдать свои нервы. :)


Никто меня не расстраивал просто каждый имеет право на тормоз( при программировании я не часто использую булевы операции(в таком виде(только в условиях и циклах)) поэтому юмора я не сразу понял). Так нормально работает спасибо что объяснили что куда.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог