Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ WinAPI]Повторный вызов функции делает ГГ 
:(
    Опции темы
cupper
Дата 16.4.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Вобшем нужно было в программе создать десяток EDITов и рядом с ними строчка текста. 
Ну подумал пдумал, и вспомнил как их делать
Код

CreateWindow ("STATIC",
             "цыферка 0",
             WS_CHILD | WS_VISIBLE,
             x, y, 100, 20,
             hwnd, NULL, hThisInstance, NULL);
     hEdit_0 = CreateWindowEx(0,
           "EDIT", 
           "0.0", 
           WS_CHILD | WS_VISIBLE | WS_BORDER | WS_EX_CLIENTEDGE, 
           x+100, y, 100, 20, 
           hwnd, NULL, hThisInstance, NULL);

нормуль все делает. Думаю както неприлично в программе повторять это 10 раз. Решил забить в функцию
Код

HWND createEdit(HWND hwnd, HINSTANCE hThisInstance, size_t i, int x, int y){
     HWND hEdit;
     char *sz = new char[1];
     itoa(i,sz,1);
     char *str = new char[10];
     strcpy (str, "Цыферка ");
     strcat (str, sz);
     CreateWindow ("STATIC",
             str,
             WS_CHILD | WS_VISIBLE,
             x, y, 100, 20,
             hwnd, NULL, hThisInstance, NULL);
     delete sz;
     delete str;
     hEdit = CreateWindowEx(0,
           "EDIT", 
           "0.0", 
           WS_CHILD | WS_VISIBLE | WS_BORDER | WS_EX_CLIENTEDGE, 
           x+100, y, 100, 20, 
           hwnd, NULL, hThisInstance, NULL);
     if (hEdit==NULL){
        MessageBox(hwnd,"Не могу создать поле EDIT","Ошибка",MB_OK | MB_ICONSTOP);
     }
     EnableWindow (hEdit, FALSE);
     return hEdit;
}

уже прошло часа 2 с начала работы.
Ну вот оттестировал, нормуль вызвал ее раз из главной функции все ништяк - работает.
Сделал в цыкл
Код

int x = 200;
    int y = 30;
    for (size_t i=0; i<10; ++i){
        vhEdit.push_back(createEdit (hwnd, hThisInstance, i, x, y));
        y+=25;
    }

компилю, ошибок нет, пытаюсь запусти программу нече непроисходит. Вообще ничего. О_о
Убрал цыкл, сдела 2 вызова функции
Код

hEdit_0 = createEdit (hwnd, hThisInstance, 0, x, y);
hEdit_1 = createEdit (hwnd, hThisInstance, 1, x, y+25);

компилится, но при запуске нечего непроисходит, ни ошибок, ни каких либо сообщение ни даже система невиснет. 
Я какбы в расстерянности, что такое... Может я чего элементарного невижу из за того что <----> ее уже наверно добрые часа 3 (((
Помогите...

Это сообщение отредактировал(а) GremlinProg - 17.4.2009, 19:07
PM MAIL   Вверх
586
Дата 17.4.2009, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(cupper @  16.4.2009,  23:43 Найти цитируемый пост)
char *sz = new char[1];

Такого объёма памяти хватит только на пустую строку - "". Если строка будет длинее, то будет выход за пределы массива! Выделяй памяти больше.

sizeof("") = 1
sizeof("a") = 2
sizeof("aa") = 3
и т.д.

Цитата(cupper @  16.4.2009,  23:43 Найти цитируемый пост)
itoa(i,sz,1);

Третий параметр - основание системы счисления. Как минимум, там должно стоять число 2 - двоичная система счисления. Обычно ставят 10 - десятичная система счисления.

Цитата(cupper @  16.4.2009,  23:43 Найти цитируемый пост)
char *str = new char[10];
     strcpy (str, "Цыферка ");
     strcat (str, sz);

sizeof("Цыферка ") = 9, в итоге осталось место для одного символа, и места для strcat может не хватить - будет выход за пределы массива.

Цитата(cupper @  16.4.2009,  23:43 Найти цитируемый пост)
     char *sz = new char[1];
     itoa(i,sz,1);
     char *str = new char[10];

Какой смысл выделять динамическую память, когда размеры памяти известны? По моему, никакого.

Код
HWND createEdit(HWND hwnd, HINSTANCE hThisInstance, size_t i, int x, int y){
     HWND hEdit;
     /*char *sz = new char[10];

     char *str = new char[50];
     strcpy (str, "Цыферка "); */
     char str[50] = "Цыферка ";
     itoa(i,&str[strlen(str)],10);
     /*
        char sz[20];
        itoa(i, sz, 10);
        strcat(str, sz);
     */

     CreateWindow ("STATIC",
             str,
             WS_CHILD | WS_VISIBLE,
             x, y, 100, 20,
             hwnd, NULL, hThisInstance, NULL);
     /*delete sz;
     delete str;    */
     hEdit = CreateWindowEx(0,
           "EDIT",
           "0.0",
           WS_CHILD | WS_VISIBLE | WS_BORDER | WS_EX_CLIENTEDGE,
           x+100, y, 100, 20,
           hwnd, NULL, hThisInstance, NULL);
     if (hEdit==NULL){
        MessageBox(hwnd,"Не могу создать поле EDIT","Ошибка",MB_OK | MB_ICONSTOP);
     }
     EnableWindow (hEdit, FALSE);
     return hEdit;
}


Цитата(cupper @  16.4.2009,  23:43 Найти цитируемый пост)
Сделал в цикле
...
компилю, ошибок нет, пытаюсь запустить программу нече непроисходит. Вообще ничего. О_о

Если программа собирается без ошибок - это не значит, что она написана правильно.

Это сообщение отредактировал(а) 586 - 17.4.2009, 03:32
PM   Вверх
Andrey44
Дата 17.4.2009, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



cupper, когда вызываешь 
Код

hEdit_0 = createEdit (hwnd, hThisInstance, 0, x, y);

hwnd - чему равен? Он случайно не нулевой?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
cupper
Дата 17.4.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



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

я конечно попробую отводить по больше элементов под массив, но коли один раз она работает то наврядли проблемма со стоками...
hwnd тоде нормальный коли работает вункция при разовом вызове. 
непридерайте к коду, он кривой я знаю. но он рабочий, покрайней мере одноразовый )) 
в чем может быть проблемма ? мож ему hwnd по ссылке передавать и хистансе тоже?

притом естли писать этот код проста подряд несколько раз (измення координаты)  в в теле главной функции то он нормально рисует столько идит боксов с текстами сколько нужно. 
именно проблема с повторным вызовом функции. 
Да даже если вызвать функцию, потомзаписать еще несколько раз тело в программе сосздании полей то тоже все работает, но если дописать после них еще раз вызоф функции то опять таже беда!

сори за опечатки, пишу с пары, клава убитая, кнопки залипают
PM MAIL   Вверх
586
Дата 17.4.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(cupper @  17.4.2009,  11:47 Найти цитируемый пост)
я конечно попробую отводить по больше элементов под массив, но коли один раз она работает то наврядли проблемма со стоками...

В том то и дело, что пишешь за пределы массива , и возникают непонятные ошибки.

Я тестировал, у меня всё работает.
Код
#include <vcl.h>
#include <vector>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

HWND createEdit(HWND hwnd, HINSTANCE hThisInstance, size_t i, int x, int y){
     HWND hEdit;
     char str[50] = "Цыферка ";
     itoa(i,&str[strlen(str)],10);

     CreateWindow ("STATIC",
             str,
             WS_CHILD | WS_VISIBLE,
             x, y, 100, 20,
             hwnd, NULL, hThisInstance, NULL);

     hEdit = CreateWindowEx(0,
           "EDIT",
           "0.0",
           WS_CHILD | WS_VISIBLE | WS_BORDER | WS_EX_CLIENTEDGE,
           x+100, y, 100, 20,
           hwnd, NULL, hThisInstance, NULL);
     if (hEdit==NULL){
        MessageBox(hwnd,"Не могу создать поле EDIT","Ошибка",MB_OK | MB_ICONSTOP);
     }
     EnableWindow (hEdit, FALSE);
     return hEdit;
}

std::vector<HWND> vhEdit;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int x = 200;
    int y = 30;
    for (size_t i=0; i<10; ++i){
        vhEdit.push_back(createEdit (Handle, HInstance, i, x, y));
        y+=25;
    }
}

PM   Вверх
Andrey44
Дата 17.4.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Ну а что происходит? Где вылетает прога, или ничего не происходит?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
cupper
Дата 17.4.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



586
домой приду попробую с вашим кодом
Andrey44 
уже несколько раз же сказал, что нечего вообще непроисходит, незапускаеться ни программа, ни ошибок, низависание, проста ничего, тыкаешь на запустить и все... и нече
PM MAIL   Вверх
cupper
Дата 17.4.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



itoa(i,sz,1);
Третий параметр - основание системы счисления. Как минимум, там должно стоять число 2 - двоичная система счисления. Обычно ставят 10 - десятичная система счисления.


<----> капать, вот так и знал что гдето банальная ошибка. Стоило изменить на
itoa(i,sz,10);
и без каких либо изменения все стало работать ))
но само собой от всей динамики избавился, сделал как вы написали, так намного лучьще )) 
спс добрый человек smile

а я то думал что третий параметр это количество символов из цифры которые надо распознать )) 

Это сообщение отредактировал(а) GremlinProg - 17.4.2009, 19:08
PM MAIL   Вверх
J0ker
Дата 20.4.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(cupper @  17.4.2009,  10:47 Найти цитируемый пост)
я конечно попробую отводить по больше элементов под массив, но коли один раз она работает то наврядли проблемма со стоками...

абалдеть
похоже я знаю где у вас ошибка  smile 


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.