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

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

Автор: KChernov
Дата сообщения: 21.06.2010 00:12
Vilian
Если создать новый непустой проект - компилируется?
Автор: Vilian
Дата сообщения: 21.06.2010 11:59
KChernov, так у меня и так новый непустой проект. Не компилируется.
Автор: Red Planet
Дата сообщения: 21.06.2010 12:09
Здравствуйте. Создаю форму. Где разместить функциональную часть?
В консоли все понятно: объявления функций и глобальных переменных до main'а, в main'е локальные переменные.
А где мне объявить и определить какую-нибудь функцию, если я создаю форму. В *.cpp? В *.h? В отдельном cpp-файле?
Среда программирования: C++Builder 2010.
Автор: ValidolX
Дата сообщения: 21.06.2010 12:22
Red Planet

Стандартная ошибка начинающего - лепить ГУИ и логику в файле окна
да, можно, но ето потом боком вылезет

Подумайте о разделении кода форм (ГУИ) и кода логики (бизнес логика, апликатив, математика - ето по разному називают)

Если знаете С++ - сделайте набор классов и всю логику - там
слелайте себе один клас менеджер который будет управлять всеми остальными обьектами и т.д.

в форме - только вызов методов главного обьекта класса.



Автор: Red Planet
Дата сообщения: 21.06.2010 13:08
ValidolX, то есть вы говорите, что нужно размещать в отдельном файле. Я так и думал, но реализовать не смог, поэтому задаю еще вопросы.

Создал отдельный файл File1.cpp, в нем и собираюсь разместить функциональную часть.
В Unit.1.cpp (Код моей формы) ставлю #include "File1.cpp".

Пойдем от простого к сложному: нужно в File1.cpp написать простенькую функцию. Ну, скажем, такую, которая удваивала бы значение, введенное в TEdit. Действие вешаем на кнопку CalcBut.

Код файла File1.cpp

Цитата:

#include "Unit1.cpp"
extern int N;
extern double R, r, min; extern int Left, Right;
void f2 () {
N=2*(StrToInt(CoordEdit->Text));
Coord->Text=IntToStr (N);;
}


Код файла Unit1.cpp

Цитата:

//---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include "Unit1.h"
#include "File1.cpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::N5Click(TObject *Sender)
{
    MainForm->Close();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::CalcButClick(TObject *Sender)
{
f2 ();
}
//---------------------------------------------------------------------------



В этом случае имеем следующую ошибку.


Убираю #include "Unit1.cpp" из файла File1.cpp - получаю другую.


P.S. Долго набирал это сообщение, переключался на Builder, изменял программу, мог что-то забыть вписать. Если есть неувязки, укажите, все поясню.
Автор: ValidolX
Дата сообщения: 21.06.2010 13:18
Red Planet

в 99.9% случаев включать .cpp не надо!


#include "xxx.cpp" -> #include "xxxx.h"

2) если ваша функция в модуле func.cpp
тогда в cpp - тело функции

void f2 ()
{
N=2*(StrToInt(CoordEdit->Text));
Coord->Text=IntToStr (N);;
}


в хидере - оглашение

void f2 ();


3) в модуле окна -
#include "Func.h"


4) вижу что функция читает инфу из едита - надо сделать ето значение как входной аргумент
а то что дает назад - как ретурн, типа так

AnsiString f2 (AnsiString input)
{
N=2*(StrToInt(input));
//Coord->Text=IntToStr (N);;
return IntToStr (N);
}


в обработчике в модуле окна:

OnClic.......
{
Coord->Text = f2(CoordEdit->Text);
}

еще вопрос?
Автор: Red Planet
Дата сообщения: 21.06.2010 13:21
ValidolX, пока что спасибо на этом. Я чуть позже посмотрю, занимаюсь с утра, голова уже ничего не соображает.
Автор: mrherbrooks
Дата сообщения: 21.06.2010 14:25

Цитата:
Я чуть позже посмотрю, занимаюсь с утра, голова уже ничего не соображает.

В смысле, программированием вообще?
Автор: Red Planet
Дата сообщения: 21.06.2010 16:49

Цитата:
В смысле, программированием вообще?

Да.

Добавлено:

Цитата:
еще вопрос?

ValidolX, сделал все, как вы говорили. Только функция не та, что раньше (эта закрывает форму). Код ниже.

Unit1.cpp

Цитата:
//---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include "Unit1.h"
#include "File2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::N5Click(TObject *Sender)
{
    MainForm->Close();
}
//---------------------------------------------------------------------------


void __fastcall TMainForm::CalcButClick(TObject *Sender)
{
f1 ();
}
//---------------------------------------------------------------------------


Unit1.h (Только сейчас заметил, что подключение стороннего файла тут ни на что не повлияло, сюда ничего не вписывал)

Цитата:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>

//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published:    // IDE-managed Components
    TMainMenu *MyMenu;
    TMenuItem *N1;
    TMenuItem *N2;
    TMenuItem *N3;
    TMenuItem *N4;
    TMenuItem *N5;
    TMenuItem *N6;
    TMenuItem *N7;
    TMenuItem *N8;
    TMenuItem *N9;
    TMenuItem *N10;
    TMenuItem *N11;
    TMenuItem *N12;
    TMenuItem *N13;
    TMenuItem *N14;
    TButton *CalcBut;
    TButton *ClearBut;
    TButton *SaveBut;
    TEdit *CoordEdit;
    TEdit *ResEdit;
    TStaticText *CoordStText;
    TStaticText *InfoCoordStText;
    TStaticText *ResStText;
    TMemo *InfoGenCoord;
    void __fastcall N5Click(TObject *Sender);
    void __fastcall CalcButClick(TObject *Sender);
private:    // User declarations
public:        // User declarations
    __fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif


File2.cpp

Цитата:
#include "Unit1.h"
void f1 () {
    MainForm->Close();
}


File2.h

Цитата:
void f1 ();


Я все правильно понял или оно по счастливой случайности работает?
Автор: KChernov
Дата сообщения: 21.06.2010 19:02
Vilian

Цитата:
так у меня и так новый непустой проект. Не компилируется.

Всегда рассматривал это как простейший постустановочный тест: создать заготовку проекта, откомпилировать и запустить (только что специально проверил).
Если у вас даже это не работает - мб проблема в самой установленной студии?
Автор: ValidolX
Дата сообщения: 21.06.2010 20:26
Red Planet

все правильно
только вот такой примитив как
MainForm->Close();
все же лучше делать сразу в ОнКлике

в отдельном модуле - ваша логика для обработки данных и т.д.

подумайте еще почему у вас доступен обьект MainForm в File2.cpp
Автор: Red Planet
Дата сообщения: 22.06.2010 11:38

Цитата:
подумайте еще почему у вас доступен обьект MainForm в File2.cpp

ValidolX, потому что #include "Unit1.h" было прописано в File2.cpp. Убирал - не работает, пишет, что не знает никакого MainForm не знает.

Разрешите еще пару вопросов.


Цитата:
в хидере - оглашение void f2 ();

C переменными также поступать?

Пример.

Мой File2.h с предыдущего сообщения.

Цитата:
void f1 ();
extern int a=9;

Повесил на клик одной кнопки для проверки работоспособности.
Цитата:
a=2*a;
ShowMessage (IntToStr(a));

Работает, но опять же вопрос в том, там ли я объявил? Не хочу дурному стилю учиться, хочу правильному.

С Builder'ом 2010-ым, кажется, проблема. Ругается на использование функции из <cmath> (sqrt, cos, sin, asin). Везде одно и то же. В чем здесь дело?


Автор: ValidolX
Дата сообщения: 22.06.2010 15:14
Red Planet

1) учите С++
cделайте себе класс с переменной и набором методов
создайте екземпляр класса и уперед

нечего заводить глобальные переменные а потом связивать их по extern ....

2) в сообщении четко написано чего не нравиться комплилятору - задайте точно тип аргумента для фунции
Автор: Red Planet
Дата сообщения: 22.06.2010 15:39

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

Привередливый оказался компилятор.

Вот это работает:

Цитата:
double x;
x=sqrt(10.0);
cout <<x<<'\n';


А следующее вызывает ошибку:

Цитата:
double x;
x=sqrt(10);
cout <<x<<'\n';


Но другой стороны это и хорошо. Порядка больше.


Цитата:
cделайте себе класс с переменной и набором методов
создайте екземпляр класса и уперед

Над этим позже подумаю. Как код напишу, выложу. Спасибо вам, ValidolX.
Автор: KChernov
Дата сообщения: 22.06.2010 20:56
Red Planet

Цитата:
А следующее вызывает ошибку:

Дык, в С++ типы приводятся явно (хотя мб можно настроить это в компиляторе).

Цитата:
Но другой стороны это и хорошо. Порядка больше.

+1

Цитата:
'\n'

Лучше использовать endl (сокращение от EndLine)
Автор: Red Planet
Дата сообщения: 23.06.2010 16:53

Цитата:
Лучше использовать endl (сокращение от EndLine)

Так-так... Это почему же лучше? Объясните, интересуюсь.

Пока не забыл, напишу еще один вопрос.
Есть консольное приложение. Исходник его File1.cpp. Требуется подключить к программе второй исходник File2.cpp. В нем, допустим, определяю класс, объявление которого в файле File1.cpp.

File2.cpp

Цитата:
class A {
    int x, y;
    public: A() {x=0; y=0;}
            A(int, int);
            void Out ();
};

A::A (int m, int n) {
    m=x; n=y;
}

void A::Out() {
    cout <<x<<' '<<y<<'\n';
}


File1.cpp

Цитата:
#include <vcl>
#include <cmath>
#pragma hdrstop
#include <iostream>
#include "File2.cpp"

using namespace std;

class A;

int _tmain(int argc, _TCHAR* argv[])
{
        system ("title Temp");
        A a1;
        system ("pause");
        return 0;
}


Компилятору не нравится в File2.cpp присутствие cout. Пишет, что не знает такого. Как поступить?
Автор: ValidolX
Дата сообщения: 23.06.2010 17:19
Red Planet

Определение класса - в хидере (почти всегда)

class A {
..........
}

тела методов - в cpp

#include "File2.cpp" << не надо так .....


Цитата:
Компилятору не нравится в File2.cpp присутствие cout. Пишет, что не знает такого. Как поступить?

надо узнать где определено cout (хидер) и его #include сделать
Автор: Red Planet
Дата сообщения: 23.06.2010 20:34
ValidolX, спасибо, у меня все заработало.

Пример

File1.cpp

Цитата:
//---------------------------------------------------------------------------
#include <iostream>
#include <vcl>
#include "File1.h"
#pragma hdrstop

using namespace std;

class A; class B;

void A::OutPut() {
cout <<a<<' '<<b;
}
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
    A a1;
    a1.OutPut();
    cout <<endl;
    system ("pause");
    return 0;
}
//---------------------------------------------------------------------------


File1.h

Цитата:
class A {
    int a, b;
    public : A() {a=0; b=0;}
        void OutPut ();
};


У меня еще вопросы.

За отображаемые названия кнопок, форм и др. объектов отвечает Caption, так? Как наиболее рационально решить нехитрую задачу: перевести язык своей программы, состоящей из формы и размещенных на ней элементов, скажем, на английский или на любой другой - не это принципиально.
Можно, конечно, создать кнопку, повесить на клик по ней следующий код:

Цитата:
void __fastcall TMainForm::ButClick(TObject *Sender)
{
MyForm->Caption="Form"; //Вместо "Форма"
Buttton1->Caption="Clear"; //Вместо "Очистить"
//И так далее скурпулезно напрямую ручками переименовывать все.
}


Но ведь есть, мне кажется, куда более рациональный метод, просто я его пока что не знаю.
Надеюсь на вашу помощь. Просветите.
Автор: KChernov
Дата сообщения: 23.06.2010 20:42
Red Planet

Цитата:
Лучше использовать endl (сокращение от EndLine)
Так-так... Это почему же лучше? Объясните, интересуюсь.

Если решите использовать уникодные строки, например, в этом варианте переписывать не придётся.



Добавлено:
Red Planet

Цитата:
Как наиболее рационально решить нехитрую задачу: перевести язык своей программы, состоящей из формы и размещенных на ней элементов, скажем, на английский или на любой другой - не это принципиально.

А вот для этого и выносят все константы (в данном случае символьные) в отдельный файл. По идее это должно называться файлами ресурсов, но как с этим у Борланда, точно не знаю.
Правда надо ещё и уходить от абсолютного размера интерфейсных объектов - лучше, чтобы они принимали размер получившихся надписей сами.

Добавлено:
И кстати да, уникодные строки вам в этом случае очень пригодятся
Автор: KF121
Дата сообщения: 23.06.2010 22:41

Цитата:
За отображаемые названия кнопок, форм и др. объектов отвечает Caption, так? Как наиболее рационально решить нехитрую задачу: перевести язык своей программы, состоящей из формы и размещенных на ней элементов, скажем, на английский или на любой другой - не это принципиально.  
Можно, конечно, создать кнопку, повесить на клик по ней следующий код:

Цитата:
void __fastcall TMainForm::ButClick(TObject *Sender)
{
 MyForm->Caption="Form"; //Вместо "Форма"
 Buttton1->Caption="Clear"; //Вместо "Очистить"
 //И так далее скурпулезно напрямую ручками переименовывать все.
}

 
Но ведь есть, мне кажется, куда более рациональный метод, просто я его пока что не знаю.  
Надеюсь на вашу помощь. Просветите.


Без ресурсов здесь не обойтись

В vcl есть функция System::UnicodeString __fastcall LoadStr(int Ident);

LoadStr loads the string resource given by Ident from the application's executable file or shared library. If the string resource does not exist, LoadStr returns an empty string.

Moving display strings into string resources makes an application easier to localize without rewriting the program.

Тебе самое то будет.
Автор: ValidolX
Дата сообщения: 24.06.2010 01:43

Цитата:
Как наиболее рационально решить нехитрую задачу: перевести язык своей программы, состоящей из формы и размещенных на ней элементов, скажем, на английский или на любой другой


если все и сразу - посмотрите в сторону TsiLang Components Suite
там все сделано на уровне

если хочеться поигратся -
а) LoadStr()
b) завести пару ини-файлов и руками читать оттуда (функи для чтения записи - есть в VCL)
c) ......
Автор: Red Planet
Дата сообщения: 24.06.2010 04:29
ValidolX, KF121, KChernov, спасибо за советы. Я обязательно займусь данным вопросом.
Автор: karakurt2
Дата сообщения: 01.07.2010 20:48
Коллегам, занимающимся научной деятельностью, возможно, покажется интересным материал, представленный на Mathematics Source Library
Автор: mrherbrooks
Дата сообщения: 02.07.2010 08:39
karakurt2
о. гуд. надо оценить. возможно получится использовать в САУ вместо своих велосипедов.
Автор: V0lt
Дата сообщения: 05.07.2010 18:09
Подскажите как перевести строку типа string в тип LPWSTR?
Автор: mrherbrooks
Дата сообщения: 05.07.2010 20:26
V0lt
на мой взгляд самое простое и без извратов использовать ATL:

Цитата:

#include <atlconv.h>
//...
std::string str = "hello world";    
USES_CONVERSION;
LPWSTR lwstr = A2W(str.c_str());


Можно и по классике - MultiByteToWideChar.
Автор: V0lt
Дата сообщения: 06.07.2010 19:48
mrherbrooks

Цитата:
на мой взгляд самое простое и без извратов использовать ATL:

спасибо, но я пока решил не цеплять лишних библиотек.


Цитата:
Можно и по классике - MultiByteToWideChar.

а можно примитивнейший примерчик?

я сделал через mbstowcs, но че-тo мне не нравиться
Автор: mrherbrooks
Дата сообщения: 06.07.2010 21:54

Цитата:
а можно примитивнейший примерчик?

msdn. уж с этим там все гуд.

вот еще вариант.


Цитата:

    std::string str = "hello world!";
    LPWSTR wstr = new WCHAR[str.length()*2];
    swprintf(wstr,L"%S",str.c_str());




Автор: stepanoxus
Дата сообщения: 07.07.2010 18:49
Подскажите, пожалуйста, как устроен формат *.xls? Хочется записывать туда с средствами C++ или C (лучше C), но пока получается создавать только текстовые файлы с таблицами. А мне хотелось бы еще уметь создавать несколько вкладок, вставлять картинки в файлы и даже строить графики - в идеале.
Автор: ValidolX
Дата сообщения: 07.07.2010 18:59
stepanoxus

http://en.wikipedia.org/wiki/Microsoft_Excel

теория + последний реф №51 на формат екселя
очень советую почитать Джоеля и его отношение к ручному read/write
(Joel Spolsky)

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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