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

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

Автор: chintoi
Дата сообщения: 07.04.2008 21:03
akaGM
Спасибо большое! По книжкам сложнее самообучение дается..
Автор: akaGM
Дата сообщения: 07.04.2008 21:24
chintoi

Цитата:
По книжкам сложнее самообучение дается..

ага...
только здесь вместо само тебямообучение происходит
если происходит...
Автор: marrow1
Дата сообщения: 08.04.2008 10:55
еще есть вопросик. Как мне сделать чтобы мой текстовый файл в котором храняться подсчеты пользователь программы мог сохранить(т.е. я меня интересует как сделать функцию копирования уже существующего файла в файл с именем и путем который задаст пользователь, чтобы запрашивало куда сохранить файл)?
Автор: distance
Дата сообщения: 08.04.2008 12:40
marrow1
в WinAPI есть функция CopyFile
для C++ - открываешь (fopen/_open) первый файл на чтение, второй на запись и в цикле переносишь (fread/_read, fwrite/_write) блоки даных пока не будет достигнут конец (feof/_eof) первого файла.
Автор: nick7inc
Дата сообщения: 08.04.2008 16:44
Здравствуйте. Не могу написать CallBack вызов с подстановкой объекта вместо функции.
[more=Вот код]
Код: #include <stdio.h>


void f1 (int i, void (*ff) (float &f) )
{
float a = 5.4 + i;

ff (a);
printf ("%f\n", a);
return;
}

void fs (float &f)
{
f = f + 1;
}


class A
{
public:
int k;
A() : k (7) {}
A(int z) : k (z) {}
void operator() (float &f) {f+=k;}

};

int main (void)
{

fprintf (stderr, "Test\n");
f1 (2, fs);
class A a;
f1 (2, a );

return (0);
}
Автор: Labutin
Дата сообщения: 08.04.2008 17:50
Не помню где, но мне кажется, что я читал о том, что выполнение программы на C++ может начинаться не с функции main, а с любой другой, если при компиляции указать соответствующий ключ, в котором будет указано имя функции, с которой нужно начать выполнение программы. Это я брежу, или действительно так и есть? Если так и есть, то что там за ключик такой, скажем для компилятора в Visual Studio ?
Автор: Abs62
Дата сообщения: 08.04.2008 18:32
Labutin

Цитата:
Не помню где, но мне кажется, что я читал о том, что выполнение программы на C++ может начинаться не с функции main, а с любой другой

Может, но не всё так просто. На самом деле выполнение программы начинается с функции инициализации CRT, которая в свою очередь вызывает main (или WinMain). Если отказаться от использования в программе функций CRT, то можно и с другой функции программу начать. Для VS это ключ линкера /ENTRY.
Советую почитать эту статью.
Автор: nick7inc
Дата сообщения: 08.04.2008 18:40
Кажется понял, в чём здесь дело. [more=Далее.]

Цитата:
Функция член всегда (если, не статическая) получает скрытый параметр - указатель на объект класса и без него в общем случае не имеет смысла (так как должна работать с данными конкретного объекта класса).

Т.е. тебе надо передать не просто адрес член-функции, но и адрес соотв. объекта класса. Сие выглядит глупо, так как можешь передать просто указатель на конкеретный объект класса и по нему вызвать соотв. метод.
By здесь.
[/more]

Добавлено:
По-видимому фокус проходит, если пользоваться шаблонами (For_each, к примеру).
Автор: distance
Дата сообщения: 08.04.2008 19:50
nick7inc
функтор != функция
решение:
1. template
2. отказ от функтора
3. boost::function и boost::bind
Автор: marrow1
Дата сообщения: 09.04.2008 16:53
Вот что у меня вышло по поводу сохранения файла (копирования)


Код:
void CNETApp::OnSave1()
{

CFileDialog fileDialog(FALSE,NULL,_T("*.txt"),NULL,_T("Text"));

if (fileDialog.DoModal()==IDOK)
{

LPCTSTR sfile=_T("netcalc.txt");

CopyFile(sfile,(fileDialog.GetPathName()),TRUE);

}
}
Автор: scai
Дата сообщения: 10.04.2008 22:31
marrow1

CString Source,Destin;
    GetDlgItem(IDC_EDIT1)->GetWindowTextA(Source);
    GetDlgItem(IDC_EDIT2)->GetWindowTextA(Destin);
    LPSHFILEOPSTRUCT lpFileOp=new SHFILEOPSTRUCT;
    lpFileOp->hwnd=GetSafeHwnd();
    lpFileOp->wFunc=FO_COPY;
    Source=Source+'\0';
    lpFileOp->pFrom=Source;
    lpFileOp->pTo=(Destin);
    lpFileOp->fFlags=(FOF_NOCONFIRMATION|FOF_ALLOWUNDO);
    BOOL abort=FALSE;
    lpFileOp->fAnyOperationsAborted=abort;
    lpFileOp->hNameMappings=0;
    lpFileOp->lpszProgressTitle="Copying files";
    if(SHFileOperation(lpFileOp)||abort)
        MessageBox("Operation aborted");
у меня так работало....
плюс если встречается слеш (\) писать два слеша (\\) ...
Автор: Ashi
Дата сообщения: 11.04.2008 13:57
Господа тока начинаю изучать. Нужда заставила. Посему сильно не бейте. Но облазил пол иннета и не смог найти в чем ошибка. И почему в в визлах 2008 происходит затык на след строчке


Код:
void CWelcomeView::OnDraw(CDC* pDC)
{
    CString welcome_string = "Welcome to C++";
    CWelcomeDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    pDC->TextOutW(0,0,welcome_string,1);
    if (!pDoc)
        return;

}
Автор: distance
Дата сообщения: 11.04.2008 16:10
Ashi
Сравни с правильным присаиванием:
Basic CString Operations
Автор: scai
Дата сообщения: 11.04.2008 22:50
Ashi
Отключи юникод)
в свойствах проекта
Автор: marrow1
Дата сообщения: 13.04.2008 20:57
scai
спасибо большое. Разобрался наконец.
Автор: Ashi
Дата сообщения: 14.04.2008 15:22

Цитата:
Господа тока начинаю изучать. Нужда заставила. Посему сильно не бейте. Но облазил пол иннета и не смог найти в чем ошибка. И почему в в визлах 2008 происходит затык на след строчке


Код:
void CWelcomeView::OnDraw(CDC* pDC)
{
CString welcome_string = "Welcome to C++";
CWelcomeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOutW(0,0,welcome_string,1);
if (!pDoc)
return;

}




error C2440: 'initializing' : cannot convert from 'const char [15]' to ATL::CStringT<BaseType,StringTraits>'


Помогло то что советовал distance. + не TextOutW а TextOut
Автор: hazor90
Дата сообщения: 14.04.2008 20:25
Здравствуйте.
Помогите новичку.
Такя проблема, изначально программа написана под консоль, в консоли работает нормально, хотел перевести в Windows но, выдает ошибки при компиляции, вот код cpp файла, описания исп. ф-й лежат в .h файле в разделе public:.


Код:
#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include <iostream>
#include <cctype>
#include <cstring>
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    :TForm(Owner)
{
//Конструктор
template <class PType> parser<PType>::parser()
{
    int i;
    exp_ptr = 0;
    for(i=0; i<NUMVARS; i++)
    {
    vars[i] = (PType) 0;
    }

}
//Входная точка анализатора
template <class PType> PType parser<PType>::eval_exp(char *exp)
{
    PType result;
    exp_ptr = exp;
    get_token();
    if(!*token)
    {
    serror(NOEXP); //Выроженние отсуцтвует
    return (PType) 0;
    }
    eval_exp1(result);
    if(*token) serror(SERROR); //Последняя лексема должна быть нулевой
    return result;
}
//Обработать присваивание
template <class PType> void parser<PType>::eval_exp1(PType &result)
{
    int slot;
    typesT ttok_type;
    char temp_token[80];
    if(tok_type == VARIABLE)
    {
         //Сохранить старую лексему
         strcpy(temp_token, token);
         ttok_type = tok_type;
         //Вычислить индекс переменной
         slot = toupper(*token) - 'A';
         get_token();
         if(*token != '=')// Не присваивание
         {
            putback(); // Возвратить текущую лексему
            // Восстановить старую лексему
            strcpy(token, temp_token);
            tok_type = ttok_type;
         }
         else
         {
             get_token(); // Получить следующую часть выражения
             eval_exp2(result);
             vars[slot] = result;
             return;
}
    }
    eval_exp2(result);
}
//Сложить или вычесть два члена
template <class PType> void parser<PType>::eval_exp2(PType &result)
{
    register char op;
    PType temp;
    eval_exp3(result);
    while((op = *token) == '+' || op == '-')
    {
        get_token();
        eval_exp3(temp);
        switch(op)
        {
            case '-':
            result = result - temp;
            break;
            case '+':
            result = result + temp;
            break;
        }
    }
}
//Перемножить или поделить два сомножителя
template <class PType> void parser<PType>::eval_exp3(PType &result)
{
register char op;
PType temp;
eval_exp4(result);
while((op = *token) == '*' || op == '/' || op == '%')
{
     get_token();
     eval_exp4(temp);
     switch(op)
     {
         case '*':
         result = result * temp;
         break;
         case '/':
         if(!temp) serror(DIVZERO);
         else result = result / temp;
         break;
         case '%':
         result = (int) result % (int) temp;
         break;
     }
}
}
//Обработка степени
template <class PType> void parser<PType>::eval_exp4(PType &result)
{
    PType temp, ex;
    register int t;
    eval_exp5(result);
    if(*token == '^')
    {
        get_token();
        eval_exp4(temp);
        ex = result;
        if(temp == (PType) 0)
        {
            result = (PType) 1;
            return;
        }
        for(t=(int)temp-1; t>0; --t)
        {
            result = result * ex;
}
    }
}
//Оценить унарный + или -
template <class PType> void parser<PType>::eval_exp5(PType &result)
{
    register char op;
    op = 0;
    if((tok_type == OPERATOR) && *token == '+' || *token == '-')
    {
        op = *token;
        get_token();
    }
    eval_exp6(result);
    if(op == '-') result = -result;
}
//Обработка вырожения в скобках
template <class PType> void parser<PType>::eval_exp6(PType &result)
{
    if((*token == '('))
    {
        get_token();
        eval_exp2(result);
        if(*token != ')')
        {
            serror(PARENS);
        }
        get_token();
    }
    else atom(result);
}
//Получить значение числа или переменной
template <class PType> void parser<PType>::atom(PType &result)
{
    switch(tok_type)
    {
        case VARIABLE:
        result = find_var(token);
        get_token();
        case NUMBER:
        result = (PType) atof(token);
        get_token();
        return;
        default:
        serror(SERROR);
}
}
//Возвратить лексему во входной поток
template <class PType> void parser<PType>::putback()
{
    char *t;
    t = token;
    for(; *t; t++)
    {
        exp_ptr--;
}
}
//Сообщить о синтаксической ошибке
template <class PType>void parser<PType>::serror(errorsT error)
{
static char *e[]= {"Syntax error", "Unbalanced Parentheses",
"No expression Present", "Division by zero"};
cout << e[error] << endl;
}
//Извлеч следующую лексему
template <class PType> void parser<PType>::get_token()
{
    register char *temp;
    tok_type = UNDEFTOK; // неизвестный тип
    temp = token;
    *temp = '\0';
    if(!*exp_ptr) return; //Конец выражения
    while(isspace(*exp_ptr))//Пропустить пробелы
    {
        ++exp_ptr;
    }
    if(strchr("+-*/%^=()", *exp_ptr))
    {
        tok_type = OPERATOR;
        *temp++ = *exp_ptr++;//Перейти к следующему символу
    }

    else if(isalpha(*exp_ptr))
    {
    while(!isdelim(*exp_ptr))
    {*temp++ = *exp_ptr++;}
    tok_type = VARIABLE;
    }

    else if(isdigit(*exp_ptr))
    {
        while(!isdelim(*exp_ptr)) { *temp++ = *exp_ptr++; }
        tok_type = NUMBER;
    }
    *temp = '\0';
}
//Возвратить true, если с - разделитель
template <class PType> bool parser<PType>::isdelim(char c)
{
if(strchr(" +-/*%^=()", c) || c == 9 || c == '\r' || c == 0) //Строка 240
    { return true; }
    return false;
}
//Возвратить значение переменной
template <class PType> PType parser<PType>::find_var(char *s)
{
    if(!isalpha(*s))
    {
        serror(SERROR);
        return (PType) 0;
    }
    return vars[toupper(*token) - 'A'];
}


    __fastcall TForm2(TComponent* Owner);
};


Автор: Lyrik
Дата сообщения: 14.04.2008 22:59
hazor90

Цитата:
Unexpected end of file in comment started on line 240

Написано, что в 240 стартует коммент, и вот он: /*. напиши так:

Код: if(strchr(" +-\/*%^=()", c) || c == 9 || c == '\r' || c == 0) //Строка 240
Автор: susuman
Дата сообщения: 14.04.2008 23:11
hazor90

Цитата:
Выдает 2 ошибки при компиляции:
Unit2.cpp(17):E2316'_fastcall::TForm2(TComponent *)' is not a member of 'TForm2'
Unit2.cpp(262):E2186 Unexpected end of file in comment started on line 240


Про первую ошибку сказать что-то сложно без .h (Unit2.h).
Вторая - "/*" - для компилятор это начало коментария, поменяй их местами: "*/"
Странно, но при такой ошибке она и в консоли не должна работать.
Автор: Wenzel
Дата сообщения: 16.04.2008 01:06
Подскажите пожалуйста, что не так? При компиляции в VS2008 выдает ошибку
Код:
1>Compiling...
1>Modeless.cpp
1>.\Neo\GUI\Modeless.cpp(35) : error C2906: 'const AFX_MSGMAP *CModWin<DIALOG>::GetThisMessageMap(void)' : explicit specialization requires 'template <>'
1> with
1> [
1> DIALOG=CDialog
1> ]
Автор: hazor90
Дата сообщения: 16.04.2008 11:34
susuman,Lyrik Спасибо, поменял /* местами - помогло

Цитата:
может стоит попробовать закомментить строку

Это обработка при старте формы, в ней мой код содержится, врятли это хорошая идея, при комменте этой строки компилятор пишет
Declaration terminated incorrectly

Цитата:
Про первую ошибку сказать что-то сложно без .h (Unit2.h).

Вот код Unit2.h:

Код:
//#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <iostream>
#include <cctype>
#include <cstring>
using namespace std;
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TEdit *Edit1;
    TLabel *Label1;
private:    // User declarations
public: template <class PType>
class parser {
static const int NUMVARS = 26;
enum typesT {UNDEFTOK, OPERATOR, NUMBER, VARIABLE};
enum errorsT {SERROR, PARENS, NOEXP, DIVZERO};

char *exp_ptr; //Указатель на вырожение
char token[80]; //содержится текущая лексема
typesT tok_type; //Тип лексемы
PType vars[NUMVARS];//Хранит значения переменных

void eval_exp1(PType &result);
void eval_exp2(PType &result);
void eval_exp3(PType &result);
void eval_exp4(PType &result);
void eval_exp5(PType &result);
void eval_exp6(PType &result);
void atom(PType &result);
void get_token();
void putback(); // Возвратить текушую лексему
void serror(errorsT error);
PType find_var(char *s);
bool isdelim(char c);
public:
parser();
PType eval_exp(char *exp);
};


};
Автор: raimur
Дата сообщения: 16.04.2008 12:16
люди добрые хелп плиз!!!горю на носу сессия а проблем итак хоть отбавляй!!!уже зачетные задания требуют!!!Помогите пожалуйста решить две задачки!!!
во всех заданиях нужно использовать методы:
- метод инициализаций Init;
- ввод с клавиатуры Read;
- вывод на юкран Display;
- преобразование в строку toString;
все задания должны быть реализованы 3 способами:
- тип данных представляется структурой с необходимыми полями, а операций реализуются как внешние функции, которые получают обьекты данного типа в качестве аргументов;
- как класс с закрытыми полями, где операции реализуются как методы класса;
- инкапсулировать поля класса в независимой структуре и в ней реализовать методы Init();Read();Display();toString();в основном классе должно быть одно поле данных,представленное объектом-структурой;
1)Создать класс Triangle для представления треугольника.поля данных должны включать углы и стороны.требуется реализоать операции: получения и изменения полей данных, вычисления площади,вычисления периметра,вычисления высот,а также определения вида треугольника(равносторонний,равнобедренный,прямоугольный).
2)Создать класс Fraction для работы с дробными числами.Число должно быть представленно двумя полями: целая часть-длинное число со знаком,дробная часть - беззнаковое короткое целое.Реализоать арифметические операции сложения,вычитания,умножения и операции сравнения.
Заранее спасибо!
Автор: chintoi
Дата сообщения: 16.04.2008 17:07
как в списке аргументов указать ссылку на файловый поток и как потом обращаться к потоку?
Автор: c0d3r
Дата сообщения: 17.04.2008 07:28
chintoi


Цитата:
как в списке аргументов указать ссылку на файловый поток и как потом обращаться к потоку?


void foo(std::istream &stream);

?
Автор: chintoi
Дата сообщения: 17.04.2008 07:54
спасибо! пособия требуют детального разбора в структуре языка для пользования, а конкретных вещей из них быстро не узнать(
Автор: mastaflow
Дата сообщения: 20.04.2008 12:10
Как стилистически лучше писать?

Код: array[0] = 50;
for(int i = 1; i < size; i++) {
array[i] = i;
}
Автор: master20
Дата сообщения: 20.04.2008 14:22
mastaflow
1 вариант лучше и быстрее
Автор: Bender_R
Дата сообщения: 20.04.2008 20:42
mastaflow
я бы предпочел первый
Автор: iogun
Дата сообщения: 21.04.2008 08:25
Подскажите что означает строка кода

*(y+i)=yi;

как она будет выглядеть в pascal?
Автор: c0d3r
Дата сообщения: 21.04.2008 08:33
iogun

Присвоение значения области памяти, имеющей смещение i относительно y. Если я правильно помню, то *(y+i) эквивалентно y[ i ]

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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