Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Qraizer
Дата сообщения: 24.04.2007 15:01
mutable-мемберы по определению неконстнтные. Но только они. Если сам экземпляр константен, то на методе, который не задействует mutable-элементы, их наличие никак не должно сказаться. Хотя это уже моё ИМХО - гарантировать, что именно так и будет, не могу.
xdude
Могу посоветовать попробовать такой код. Должен помочь, но это только с точки зрения стандарта. Если компилятор его не слушается, то уж звиняй.
Код: std::vector<std::string>::size_type size(volatile std::vector<std::string>& v)
{
return const_cast<std::vector<std::string>&>(v).size();
}
Автор: RedLord
Дата сообщения: 24.04.2007 15:37
Qraizer

Цитата:
mutable-мемберы по определению неконстнтные

это понятно.


Цитата:
то на методе, который не задействует mutable-элементы, их наличие никак не должно сказаться

похоже да:


Цитата:


7.1.1 Storage class specifiers
9 The mutable specifier on a class data member nullifies a const specifier applied to the containing class
object and permits modification of the mutable class member even though the rest of the object is const
(7.1.5.1)


xdude
можно еще так:


Код:
template <class _Tp> struct Wrap
{
_Tp& get() volatile
{
return (*m_p);
}

_Tp* volatile m_p;
};
Автор: Qraizer
Дата сообщения: 25.04.2007 14:07
volatile будет сам указатель. Я не уверен, что это побудит оптимизатор каждый раз его разыменовывать. Впрочем, возможно ты и прав...
Автор: RedLord
Дата сообщения: 25.04.2007 15:42
Qraizer

Цитата:
volatile будет сам указатель

да и любое обращение через такой указатель должно давить оптимизацию (ИМХО)
Автор: HelL_Doctor
Дата сообщения: 25.04.2007 19:10
Hi, all! Подскажите пожалуйста, как на Си реализвоать доступ к ФАТ таблице диска, т.е. удаление/добавление в нее новых элементов? буду премного блгодарен! )
Автор: rain87
Дата сообщения: 25.04.2007 20:20
HelL_Doctor
если вин98 или дос - то 13 интом
если нт - http://forum.ru-board.com/topic.cgi?forum=33&topic=7977#1
Автор: HelL_Doctor
Дата сообщения: 25.04.2007 21:27
И еще один вопрос, как реализовать на СИ просмотр папки, без использование АПИ функций?
Автор: Lyrik
Дата сообщения: 25.04.2007 23:28
HelL_Doctor
найти доку по ФС, которую юзаешь и написать ручной обход
Автор: NNS
Дата сообщения: 26.04.2007 19:54
Подскажите плиз, как мне объявить динамический массив, который бы был виден во всех функциях? В самом классе объявить нельзя, а нужно, что б этот массив был доступен и обрабатывался в нескольких функциях.
Автор: RedLord
Дата сообщения: 26.04.2007 20:24
NNS
чего-то не понял. объявить или определить?

если определить

test.h

typedef std::vector<int> IntVec;
extern IntVec my_data;

--------------
test1.cpp

#include "test.h"

IntVec my_data; // определяется в одном месте

void foo()
{
my_data.clear();
}

----------------
test2.cpp

#include "test.h"

void foo()
{
my_data.clear();
}
Автор: NNS
Дата сообщения: 27.04.2007 15:46
RedLord
Я имел ввиду создание динамического массива припомощи оперетора new.

Еще вопрос, у меня есть стринговский массив Bol, в который из файла считываются данные. В другом классе (классе окна) есть переменная m_combo, которая связанна с элементом combobox, я пытаюсь заполнить комбобокс инфой из этого массива.

CDlg cdlg;
m_combo.AddString(cdlg.Bol[1]);

Но это не работает...
Автор: GOGACL
Дата сообщения: 28.04.2007 14:17
Народ помогите!
Никак не ойму как рекурсия работает
Прошу обяснить прямо на пальцах, а то уже голова дымит.
можно на своих примерах, а можно на этом

#include <iostream.h>

int mys(int, int);

main()
{
    int a, b;
    
    cout << "Vvedite 2 chisla: ";
    cin >>a >> b;
    
    cout << "Rezultat raven " << mys(a, b) << endl;
    return 0;
}    

    int mys(int x, int y)
    {    
    if (y==1)
        return x;
    else
        return x+mys(x,y-1);
    }

это из учебника дейтела
Автор: veronica b
Дата сообщения: 29.04.2007 12:19
GOGACL, я немножко подправил вашу программу, так ка в ней была принципиальная ошибка

Цитата:
это из учебника дейтела


Цитата:
#include <iostream.h>

int mys(int, int);

int main()
{
     int a, b;

     cout << "Enter 2 numders: ";
     cin >>a >> b;

     cout << "Result equals " << mys(a, b) << endl;

     return 0;
}

     int mys(int x, int y)
     {
     if(y <= 1) // A
         return x;
     else
         return x + mys(x, y-1); // B
}


Самая важная строка в этой программе, это строка помеченаая В. В ней опять вызывается функция mys(int, int), но тут есть маленькая тонкость, второй аргумент уменшается на единицу.. Теперь смотрим строку, помеченой буквой А. Если второй аргумент меньше или равен 1, то нет вызова mys(int, int).Рекурсия закончилась.
В исходной программе, при втором аргументе, имеющим отр.знач. рекурсия была бы бесконечной!
В общем, в языке С и С++ не свойственно применение рекурсии. Если вам нравится рекурсия, то используйте Lisp и Prolog.
Автор: GOGACL
Дата сообщения: 30.04.2007 09:30
veronica b
Чтобы рекурсия понравилась или нет ее нужно понять...
сначала при входе в рекурсивную функцию идет вычисление всех аргументов, которые будут принимать участие в вычислении?
Автор: veronica b
Дата сообщения: 30.04.2007 13:26
GOGACL, при вызове рекурсивной функции идет вычисление аргументов, а рекурсивня функция всегда делает две вещи
1. Проверяет условие выхода из рекурсии. См. строку А.
2. Если условие выхода false, то происходит модификация хотябы одного из аргументов и вызов рекурсивной функции. См. строку В.

Автор: GOGACL
Дата сообщения: 02.05.2007 09:11
veronica b
Но при создании аргументов при входе в функцию появляется один аргумент удовлетворяющий условию if(y <= 1) при котором функция должна завершится...
При этом функция продолжает работать...
Автор: veronica b
Дата сообщения: 02.05.2007 20:27
GOGACL

Цитата:
При этом функция продолжает работать...

В твоем листинге - да! В той программе, что я тебе дал, эта ошибка исправленна. Кто вам дал такое задание?

Автор: GOGACL
Дата сообщения: 03.05.2007 12:47
veronica b
Я пытаюсь понять как работают рекурсивные функции, а это просто пример такой функции и пока я в понимании не далеко продвинулся. Ведь есть задачи, которые проще решать с помощью рекурсивных функций..
Автор: Qraizer
Дата сообщения: 03.05.2007 18:09
А в чём собственно непонимание заключается-то? Рекурсивные функции ничем не отличаются от нерекурсивных. Подумаешь - сами себя вызвают, ну и что из этого? Вызов, он и есть вызов. "Функция f1 вызывает функцию f2." Здесь непонимания нет? Тогда в чём проблемы с "функция f1 вызывает функцию f1"?
Автор: GOGACL
Дата сообщения: 04.05.2007 10:05
То-что она вызывает сама себя это понятно, механизм работы непонятен
вот прога и функция

Цитата:
//
#include <iostream.h>
#include <iomanip.h>

unsigned long faktorial(unsigned long);

main()
{
    
    for (int i=3; i<=4; i++) {
        cout << "i = " << i << endl;
    cout << setw(40) << i << "! = " << faktorial(i)
    << endl << "************************************" << endl;
    }
    return 0;
}    

unsigned long faktorial(unsigned long number)
{
//    cout << endl << "STEP " << endl;
    cout << "number = " << number << endl;
    if (number <=1) {
        cout << "n<=1 " << number << '\n';
        return 1;}
    else
        cout << "n = " << number << " fak(n - 1) = "
        << faktorial(number - 1) << " n*fak(n - 1) = " <<
        number*faktorial(number - 1) <<endl;
        return number*faktorial(number - 1);
        
}


А вот результат (часть)

Цитата:
i = 3
number = 3
number = 2
number = 1
n<=1 1
number = 1
n<=1 1
n = 2 fak(n - 1) = 1 n*fak(n - 1) = 2
number = 1
n<=1 1
number = 2
number = 1
n<=1 1
number = 1
n<=1 1
n = 2 fak(n - 1) = 1 n*fak(n - 1) = 2
number = 1
n<=1 1
n = 3 fak(n - 1) = 2 n*fak(n - 1) = 6
number = 2
number = 1
n<=1 1
number = 1
n<=1 1
n = 2 fak(n - 1) = 1 n*fak(n - 1) = 2
number = 1
n<=1 1
3! = 6

*******************************************


ПОЧЕМУ ТАК???
Автор: TeXpert
Дата сообщения: 04.05.2007 11:38
GOGACL
У вас вывод как-то очень неаккуратен. Просто, не поленитесь, раз неясно, расставьте отладочные операторы вывода где надо, и всё станет ясно. Ведь необязательно всё выводить столбиком -- чем хуже строки? Да и на вашем месте я бы не поленился писать слова, типа "Факториал равен...".
Автор: MrEnginepro
Дата сообщения: 04.05.2007 12:30
Microsoft Visual Studio .NET 2003
Опишите плз кто - нибудь, что мне необходимо сделать в опциях проекта, чтобы вместе с *.dll получал и отладочную информацию ???
Автор: Qraizer
Дата сообщения: 04.05.2007 15:45
GOGACL
Цитата:
ПОЧЕМУ ТАК???
Встречный вопрос: "А почему должно было быть не так?" Посмотри на вот эти результаты:
Код: #include <iostream>

unsigned long fact(unsigned long n)
{
std::cout << "I\'m the fact(" << n << "). ";
if(n==0)
{
std::cout << "Wow! My parameter is equal to zero! I shall "
<< "not call anything and I shall simply return the 1." << std::endl;
return 1;
}
std::cout << "I calls the fact(" << n-1 << ")." << std::endl;

unsigned long res=fact(n-1);

std::cout << "It again I - fact(" << n << "). I accepts the " << res
<< " value from fact(" << n-1 << "). My result will be equal to " << n
<< '*' << res << " = " << res*n << std::endl;
return res*n;
}

int main()
{
std::cout << fact(3);
}
Автор: GOGACL
Дата сообщения: 04.05.2007 16:12
Буду вникать и разбираться...
Автор: gorthaur
Дата сообщения: 04.05.2007 19:23
Скажите, пожалуйста почему может вываливаться такая программа

Код: #import "msxml3.dll"
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

inline void EVAL_HR( HRESULT _hr )
{ if FAILED(_hr) throw(_hr); }


int main(int argc, char* argv[])
{
try
{
     MSXML2::IXMLDOMDocumentPtr Document;
     MSXML2::IXMLDOMElementPtr root;
        EVAL_HR(CoInitialize(NULL));
        EVAL_HR(Document.CreateInstance("Msxml2.DOMDocument.5.0"));
        _variant_t varOut((bool)TRUE);
        cout << "ok";
        BSTR str1 = SysAllocString(L"<media></media>");
        varOut = Document->loadXML(str1);
        if
            ((bool)varOut == FALSE)
         //throw(0);
        root = Document->documentElement;
        cout << root->text << endl;
        return 0;
    }
    
    catch(...)
    {
        cout << "Exception occurred" << endl;
        return -1;
    }

    CoUninitialize();
}

Автор: rain87
Дата сообщения: 04.05.2007 19:39
//удалено
Автор: Abs62
Дата сообщения: 04.05.2007 21:00
gorthaur
А почему "#import "msxml3.dll"", если запрашивается Msxml2.DOMDocument.5.0 из msxml5.dll? Этот интерфейс в системе присутствует?
Автор: vsDev
Дата сообщения: 05.05.2007 22:14
gorthaur
Переписал твой код [more=так]

Код:
#import "msxml4.dll"
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

inline void EVAL_HR( HRESULT _hr )
{ if FAILED(_hr) throw(_hr); }


int main(int argc, char* argv[])
{
    try
    {
        MSXML2::IXMLDOMDocumentPtr Document;
        MSXML2::IXMLDOMElementPtr root;
        EVAL_HR(CoInitialize(NULL));
        EVAL_HR(Document.CreateInstance("Msxml2.DOMDocument.4.0"));
        _variant_t varOut((bool)TRUE);
        cout << "ok"<<endl;;
        BSTR str1 = SysAllocString(L"<media>ttttt</media>");
        varOut = Document->loadXML(str1);
        if
            ((bool)varOut == FALSE) {
                cout<<"not loaded!"<<endl;
                return 0;
        }
            root = Document->documentElement;
        if (!root) {
            cout<<"null!"<<endl;
            return 0;
        }
        cout << root->text << endl;
        return 0;
    }

    catch(...)
    {
        cout << "Exception occurred" << endl;
        return -1;
    }

    CoUninitialize();
}
Автор: GOGACL
Дата сообщения: 07.05.2007 08:45
vsDev
Достаточно разборчиво и понятно, сначала идет определение всех аргументов которые будут участвовать в вычислении, затем и само вычисление...
Автор: doc58_81oB0t
Дата сообщения: 08.05.2007 12:28
Добрый день

Как сделать, чтобы програмка(http://asus.netbynet.ru/temp/help.rar) работала с последовательностями длиной 10 млн символов?

Последовательность та, которую надо читать из файла sequence.txt

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.