Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. Susel

    Susel New Member

    Публикаций:
    0
    Регистрация:
    22 май 2007
    Сообщения:
    7
    Я с изображениями никогда дела не имел, можно ли расписать как это делается?
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Susel
    Советую поискать на sf.net какие-нибудь библиотечки для работы с изображениями (ака врапперы над более low-level библиотеками) и использовать их. навскидку, CxImage, Titan, FreeImage, etc. Еще как вариант (у Вас ведь наверняка задача под Windows), можно использовать GDI+, либо COM'овский интерфейс OleLoadPicture/OleSavePicture. + еще как вариант выдрать код для работы с картинками из геймдев-либы, например PopCap. На сайте adobe'a есть тоже хорошие примеры "открытия"\"сохранения" PNG/JPEG'a.
    В общем, вариантов масса =)
     
  3. Susel

    Susel New Member

    Публикаций:
    0
    Регистрация:
    22 май 2007
    Сообщения:
    7
    censored
    Честно говоря, мне ничего не говорит ни одно название, т.к. я закончил лиш один курс по С++. Так что знаю я от основ до написания классов.
    А вот такой скачок из-за перевода в другой ВУЗ. Вот и приходится быстро шагать...

    Возможно, Вы знаете, где можно почитать про работу с изображениями?
    P.S. Если можно, дайте свою асю, чтоб тут не флудить :)
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Сходу не припомню названия, но такие книги есть :)
    В ней нету ничего интересного.
     
  5. Susel

    Susel New Member

    Публикаций:
    0
    Регистрация:
    22 май 2007
    Сообщения:
    7
    All
    Подскажите, пожалуйста, сайт или книгу в которой можно прочитать про работу с изображениями.
    Спасибо.
     
  6. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    msdn.com :)
    gdi+ functions
     
  7. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    А в чем собственно проблема? Графический файл можно обрабатывать как и любой другой - забыть что он графичиский и сжимать как набор байтов.
     
  8. Benzin

    Benzin Сергей

    Публикаций:
    0
    Регистрация:
    26 авг 2007
    Сообщения:
    41
    Адрес:
    St.Petersburg
    Всем привет. Буду максимально подробен, дабы разъяснить все как есть. Есть код программы вычислющей приближенное значение арксинуса, собственно вот:
    Код (Text):
    1. #include <iostream>
    2. #include <math.h>
    3. using namespace std;
    4.  
    5. int main()
    6. {
    7.     double U, x;
    8.     int n, nout;       
    9.    
    10.     cout << "Input:\n";
    11.     cout << "x = "; cin >>x;
    12.     cout <<'\n';
    13.     cout << "nout = "; cin >>nout;
    14.     cout <<'\n';
    15.  
    16.    
    17.     U=x;
    18.  
    19.     for(n=3; n<=nout; n++){
    20.             for(int i=1; i<=n; i++)
    21.                 U = (U / (sqrt(1+U)+ sqrt(1-U)));
    22.                 cout << U <<'\n';}
    23.  
    24. }
    При начальных значениях x=0.5 и nout=10, получается следующее:
    0.0654031
    0.0040906
    0.000127832
    1.99737e-006
    1.56045e-008
    6.09549e-011
    1.19053e-013
    1.16262e-016

    Но я хочу добавить еще один массив который отвечал бы за индексы, т.е хочу чтоб у каждой строчки был свой номер, т.е вот так:
    1. 0.0654031
    2. 0.0040906
    3. 0.000127832
    4. 1.99737e-006
    5. 1.56045e-008
    6. 6.09549e-011
    7. 1.19053e-013
    8. 1.16262e-016

    Пишу следующее:

    Код (Text):
    1.     for (int j=1; j<=nout; j++){
    2.         for(n=3; n<=nout; n++){
    3.             for(int i=1; i<=n; i++)
    4.                 U = (U / (sqrt(1+U)+ sqrt(1-U)));
    5.                 cout << j << ". "<< U <<'\n';}
    6.     }
    И получаю не совсем то, т.е вот:
    1. 0.0654031
    1. 0.0040906
    1. 0.000127832
    1. 1.99737e-006
    1. 1.56045e-008
    1. 6.09549e-011
    ...
    10. 7.9978e-152
    10. 1.56207e-154
    10. 1.52546e-157
    Т.е. то что мне нужно находится все под цифрой 1, а остальное не пойми что...
    Пробую иначе, т.е убираю скобки у одно из циклов:
    Код (Text):
    1.     for (int j=1; j<=nout; j++){
    2.         for(n=3; n<=nout; n++) //у этого цикла убрал скобки
    3.             for(int i=1; i<=n; i++)
    4.                 U = (U / (sqrt(1+U)+ sqrt(1-U)));
    5.                 cout << j << ". "<< U <<'\n';
    6.     }
    И в результате получается следующее:
    1. 1.16262e-016
    2. 2.58154e-032
    3. 5.73217e-048
    4. 1.2728e-063
    5. 2.82618e-079
    6. 6.27538e-095
    7. 1.39341e-110
    8. 3.094e-126
    9. 6.87006e-142
    10. 1.52546e-157

    Нумеровка есть, но числа.., посмотрите на длинную вереницу чисел перд этим, получается что каждое число здесь это каждое последнее из чисел там.
    Т.е последнее число в единицах это 1.19053e-013, последнее в двойках это 2.58154e-032 и тд

    Как сделать так чтоб все соответствовало, подскажите незнающему, я уже замучался и не знаю чти и придумать..
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Benzin
    Код (Text):
    1.     // using namespace std;
    2.     using std::cout; // правила хорошего тона
    3.     using std::cin;
    4.  
    5.     for(n=3; n<=nout; n++) {
    6.         for(int i=1; i<=n; i++)
    7.             U = (U / (sqrt(1+U)+ sqrt(1-U)));
    8.         cout << n-2 << ". " << U <<'\n';
    9.     }
     
  10. Benzin

    Benzin Сергей

    Публикаций:
    0
    Регистрация:
    26 авг 2007
    Сообщения:
    41
    Адрес:
    St.Petersburg
    IceStudent В том то и дело, что мне без третьего цикла не обойтись, т.к. потом мне надо вставить это в код под windows приложение, и этот цикл отвечает за нумерацию
     
  11. Susel

    Susel New Member

    Публикаций:
    0
    Регистрация:
    22 май 2007
    Сообщения:
    7
    All
    Проблема в том, что я не умею работать с файлами. Можно ли подробно объяснить, что такое хидер, как его считывать и как работать с файлом после его открытия?
     
  12. Benzin

    Benzin Сергей

    Публикаций:
    0
    Регистрация:
    26 авг 2007
    Сообщения:
    41
    Адрес:
    St.Petersburg
    Здравствуйте.
    Ситуация такая, есть приложение по винду, на С++ (MFC). Значится существует диалоговое окно, с начальными значениями:
    Код (Text):
    1. //Начальные значения элементов диалового окна
    2. char ssTring[3][80] = {"10", "0.5", "7"};
    Собственно nout=10; x=0.5 и k=7

    Потом инициализация:
    Код (Text):
    1. //Метод инициализации диалогового окна
    2. BOOL CDataDialog::OnInitDialog()
    3. {
    4.     CDialog::OnInitDialog(); //вывод метода базового класса
    5.  
    6.     //инициализация редактируемых полей
    7.     CEdit *tmp1 = (CEdit*)GetDlgItem(IDC_EDIT1);
    8.     tmp1->SetWindowText (ssTring [0]);
    9.     CEdit *tmp2 = (CEdit*)GetDlgItem(IDC_EDIT2);
    10.     tmp2->SetWindowText (ssTring [1]);
    11.     CEdit *tmp3 = (CEdit*)GetDlgItem(IDC_EDIT3);
    12.     tmp3->SetWindowText (ssTring [2]);
    13.  
    14.     return TRUE;
    15. }
    Код (Text):
    1. //***** Обработчик кнопки ОК
    2. void CDataDialog::OnOK()
    3. {
    4.     //чтение строк из редактируемых полей
    5.     GetDlgItemText (IDC_EDIT1, ssTring[0], 80);
    6.     GetDlgItemText (IDC_EDIT2, ssTring[1], 80);
    7.     GetDlgItemText (IDC_EDIT3, ssTring[2], 80);
    8.  
    9.     CDialog::OnOK(); //стандартный обработчик
    10.            
    11.            .................
    12.            .................
    13.            .................
    14.  
    15.     //Преобразование строки в целое число
    16.     nout=atoi (ssTring[0]);
    17.     //Преобразование строки в целое число
    18.     k=atoi (ssTring[2]);
    19.            
    20.            .................
    21.            .................
    22.            .................
    Думаю что все понятно и так.. Вобщем идея такова: я хочу чтоб при изменении nout, менялось бы и k. Вот по такой схеме: Если повышаем nout на единицу, то и k должно возростать на 1, если на 2 то и k на 2 и т.д. и соответственно наоборот. И тоже самое с k, т.е если уменьшать его, то и nout тоже уменьшать, если увеличивать, то и nout увеличивать, на одинаковое число.
    Помогите пж-та.
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Benzin
    Ну, во-первых, воспользуйся DDX:
    Код (Text):
    1. void CDataDialog::DoDataExchange(CDataExchange* pDX)
    2. {
    3.     __super::DoDataExchange(pDX);
    4.     // синхронизация с буферами (а они точно нужны?)
    5.     DDX_Text(pDX, IDC_EDIT1, ssTring[0], sizeof(*ssTring));
    6.     DDX_Text(pDX, IDC_EDIT2, ssTring[1], sizeof(*ssTring));
    7.     DDX_Text(pDX, IDC_EDIT3, ssTring[2], sizeof(*ssTring));
    8.  
    9. }
    Потом, ты хочешь просто одновременное изменение edit1 и edit3 с синхронизацией с k и nout? Думаю, что-то здесь излишне (строковые буфера), но ладно.
    Код (Text):
    1. // добавить к предыдущим строкам
    2.     ...
    3.     // синхронизация с nout & k
    4.     DDX_Text(pDX, IDC_EDIT1, nout);
    5.     DDX_Text(pDX, IDC_EDIT3, k);
    6. }
    7.  
    8. // добавить к карте сообщений
    9. BEGIN_MESSAGE_MAP(CDataDialog, CDialog)
    10.     ON_EN_CHANGE(IDC_EDIT1, OnUpdateEdit1)
    11.     ON_EN_CHANGE(IDC_EDIT3, OnUpdateEdit3)
    12.     ...
    13. END_MESSAGE_MAP()
    14.  
    15. ...
    16. void CDataDialog::OnUpdateEdit1()
    17. {
    18.     UpdateData();
    19.     SetDlgItemInt(IDC_EDIT3, k = nout-3);
    20. }
    21.  
    22. void CDataDialog::OnUpdateEdit3()
    23. {
    24.     UpdateData();
    25.     SetDlgItemInt(IDC_EDIT1, nout = k+3);
    26. }
    Единственно - не помню, посылается ли EN_CHANGE родителю после WM_SETTEXT.
    P.S. Что такое DDX и прочее - в гугл. Уж что-что, а MFC разжевана вдоль и поперёк, даже на русском полно информации.
    P.-P.S. не используй глобальные переменные.
     
  14. P_F

    P_F New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2006
    Сообщения:
    116
    Адрес:
    Russia
    Есть проблемка :
    Куча исходников собирается make ом
    среди них файлики *.S и файлики с asm вставками в итоге:
    /tmp/ccq5KQcb.s: Assembler messages:
    /tmp/ccq5KQcb.s:118: Error: ...
    Вопрос в том как узнать на каком файле мы упали к кому относится это 118?

    зы если что сборка идёт не в /tmp/ а as суёт времмено файлы в темп и потом их грохает...
     
  15. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Напиши полный листинг того что пишет make
     
  16. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Нужно использовать типы объявленные в ntdef.
    А компилер их не видит.
    Нужно что-то указать, чтобы прорваться сквозь #ifdef и пр.


    Вот код: (компилятор не понимает ULONG)
    Код (Text):
    1. #include "Ndef.h"
    2. #include "windows.h"
    3.  
    4. ULONG my;
    5.  
    6.  
    7. int _tmain(int argc, _TCHAR* argv[])
    8. {
    9.     return 0;
    10. }
     
  17. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    всем здрасьте. поясните пожалуйста, почему так происходит в след. куске кода:
    Код (Text):
    1. int  x = - 96;
    2. int y = 4;
    3. [b]unsigned int[/b] z = 3072;
    4.  
    5. if ( (x + y) >= (z - 16) )
    6. {
    7.       printf("WOW\n");
    8. }
    выдает WOW, чего, если руководствоваться математикой, быть не должно.

    понятно, что проблема в типе переменной z, выделенном жирным. если указать не unsigned int z, а int z, то все встает на свои места: -96 + 4 >= 3072 - 16 -- ложь, как и должно быть.

    чего я непонимаю?
     
  18. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    дык это одно из правил хорошего тона приводить в сравнениях к одному типу. компилер варнинг должен был выдать. у тебя (x + y) берется как unsigned int.
     
  19. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    правильно я вас понял, noname, что в моем случае я должен был либо заранее объявить все переменные с одинаковым типом, либо же, если я точно* знаю, что переменная z по логике программы ну никак не может принимать отрицательные значения, то, объявив ее как unsigned int, в самом сравнении выполнить приведение (z - 16) к типу int, чтобы по обе стороны от знака сравнения стояли переменные одинакового типа?

    спасибо за прояснение.

    ps: да, компилер варнинг выдавал:)
     
  20. Benzin

    Benzin Сергей

    Публикаций:
    0
    Регистрация:
    26 авг 2007
    Сообщения:
    41
    Адрес:
    St.Petersburg
    Всем привет! Возникла проблема. Есть функция, отвечающая за вызов диалога -> MyOknoFunc_1(), на диалоге кнопка Ok и 2 поля Edit идентификатор которого к примеру m_A и m_B соответственно.
    Собственно MyOknoFunc_1():

    И кнопка OK, в которой создается тот самый массив, отвечающий за вывод результатов в главное окно:
    Код (Text):
    1. void Benzin::OnOK()
    2. {
    3.     // TODO: Add extra validation here
    4.    
    5.     CDialog::OnOK();
    6.  
    7.         if (key)
    8.     {
    9.         for (int i=0; i<=nout; i++)
    10.             delete []out[i];
    11.         delete []out;
    12.     }
    13.  
    14.     int i;
    15.     double U;
    16.     char buf_i[80], buf_U[80];
    17.    
    18.     //Выделение динамической памяти под массив out
    19.     out=new char *[nout];
    20.     for (i=0; i<=nout; i++)
    21.         out[i]=new char[80];
    22.    
    23.     strcpy (out[0], "Результаты счета");    
    24.  
    25.     for (i=1; i<=nout; i++)
    26.     {
    27.         U = 12345;     
    28.  
    29.         itoa (i, buf_i, 10);
    30.         strcpy (out[i], "");
    31.         strcat (out[i], buf_i);
    32.         strcat (out[i], "     ");
    33.         gcvt (U, 10, buf_U);
    34.         strcat (out[i], buf_U);
    35.     }  
    36.     key=1;
    37. }
    Пока здесь просто от балды написано U = 12345; и вообще речи о Edita'x пока не идет, но вместо этой строки хотелось для начала просто организовать сумму чисел из редактируемых полей, т.е m_A + m_B. Для этого объявляю их:
    Код (Text):
    1. class CMyMainWnd:public CFrameWnd
    2. {
    3.      protected:
    4.     //{{AFX_MSG(CMyMainWnd)
    5.     afx_msg void OnPaint();
    6.     //}}AFX_MSG
    7.  
    8.    public:
    9.        void MyFunc();
    10.      //{{AFX_VIRTUAL(CMyMainWnd)
    11.      //}}AFX_VIRTUAL
    12.  
    13.        CMyMainWnd()
    14.        {           
    15.            LoadFrame(IDR_MENU1);         
    16.        }  
    17.        
    18.        void MyOknoFunc_1();
    19.        
    20.        double m_A;
    21.        double m_B;     
    22.        
    23.        DECLARE_MESSAGE_MAP();
    24. };
    И тут возникает два вопроса:
    1) Как организовать сумму, так?
    Benzin dlg;
    if(dlg.DoModal()==IDCANCEL)
    return;
    dlg.m_A=m_A; //Передаем данные в диалог
    m_A=dlg.m_A; //Передаем данные из диалога

    dlg.m_B=m_B; //Передаем данные в диалог
    m_B=dlg.m_B; //Передаем данные из диалога
    U=m_A + m_B;
    Или как то по другому????

    2) и второй, и что тогда писать в MyOknoFunc_1(), если это будет внутри void Benzin::OnOK(), по-идее то это пишется в MyOknoFunc_1(), но мне надо именно в OnOK, как быть тогда???