Простое диалоговое окно редактирования

#c #dialog

#c #диалоговое окно

Вопрос:

Я модифицирую программу, которая работает в Windows, в которую я хотел бы ввести пару значений при ее запуске.

В начале AppMain следующий уже существующий код позволяет пользователю вводить имя файла:

 char our_file_name[260] = "TEST";

#ifdef WIN32
edit_dialog(NULL,"Create File", "Enter file name:", our_file_name,260);
#endif
  

Все это казалось довольно простым, поэтому я подумал, что просто воссоздам это для своих (подписанных) целых значений со следующим кодом, вставленным сразу после приведенного выше кода:

 #ifdef WIN32
edit_dialog(NULL,"Custom tolerance", "Enter tolerance:", tolerance,260);
#endif

#ifdef WIN32
edit_dialog(NULL,"Custom position", "Enter intended position:", position,260);
#endif
  

… И следующее, размещенное вместе с объявлениями других переменных:

 int tolerance = 400;
int position = 0;
  

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

Что я делаю не так? Есть ли лучший способ ввода пары значений?

Комментарии:

1. Было бы полезно, если бы мы могли увидеть edit_dialog функцию.

2. Существует ли перегрузка для, edit_dialog которая ожидает int , а не a char* ? Можете ли вы опубликовать подписи применимых версий edit_dialog ? Вам нужно предоставить немного больше информации..

3. А, понятно. Я думал, что edit_dialog был бы стандартной функцией Windows. Есть ли более стандартный способ сделать это?

Ответ №1:

Подпись для edit_dialog функции, вероятно, принимает символ * в качестве четвертого параметра. Вы передаете туда значение int при вызове его с помощью tolerance , поэтому ваш код обрабатывает значение int (в данном случае 400) как значение указателя (0x400) и собирается просмотреть строку, расположенную по адресу 0x400… Бум. Сбой.

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

 char buf[256];
sprintf( buf, "%d", tolerance);
#ifdef WIN32
edit_dialog(NULL,"Custom tolerance", "Enter tolerance:", buf, 260);
#endif
  

(Бьюсь об заклад, edit_dialog — это макрос, потому что я почти уверен, что большинство компиляторов поймали бы эту ошибку во время компиляции и предупредили бы вас).

Затем, когда ваше диалоговое окно редактирования вернется, оно сохранит символы, введенные пользователем, обратно в buf, которые вы, вероятно, захотите преобразовать в int.

 tolerance = atoi(buf);
  

Комментарии:

1. Большое вам спасибо — переносит ли строка «sprintf(buf, «%d», допуск);» значение в buf в переменную tolerance?

2. @Matt нет, sprintf похож на printf, но вместо записи в стандартный вывод он записывает в буфер. Я беру целочисленное значение 400 и превращаю его в массив символов, состоящий из символов четыре ноль ноль ноль. Подробнее читайте здесь: cplusplus.com/reference/clibrary/cstdio/sprintf

3. Я думаю, я понимаю это — это позволит передать мое значение допуска по умолчанию в диалоговое окно, и оно выйдет как buf? Как тогда мне преобразовать вывод ‘char’ из buf в целое значение, которое я могу использовать в программе? Насколько я могу видеть, это оставит меня с двумя значениями: buf (тип символа) и допуск (который не изменится по сравнению с значением по умолчанию?)

4. @Matt вроде как. tolerance по-прежнему является значением int. Вы можете использовать это везде, где захотите. однако вашей диалоговой функции требовалась строка… не является int… Таким образом, приведенный выше код создает строку «400». Это отдельно от допуска.

5. Спасибо. Как мне превратить эту строку обратно в int и перезаписать ею допуск? Извините, если это то, что уже было сделано, я новичок в этом и пока не могу понять, как проверить, сработало ли это … : S