运行TinyFileDialogs的Visual Studio C程序,但最喜欢的颜色弹出窗口不起作用

icnyk63a  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(114)

我一直在做tinyfiledialogs代码项目,我已经设置好了环境,代码也编译好了。

//Number of beeps
void beeper(int num_beeps) {
    char message[100];
    sprintf(message, "Beeping %d times! \n Press OK to initiate.", num_beeps);
    tinyfd_messageBox("Notification", message, "info", "OK", 1);
    
    //beeps
   for (int i = 0; i < num_beeps; i++) {
        Beep(800, 300);  // Frequency and duration of the beep sound
        Sleep(300);      // Pause between beeps (in milliseconds)
    }
    
}
//Favorite color and store RGB values
void mood_ring(struct FavoriteColor* color) {
    char const* options[8] = { "Red", "Orange", "Yellow", "Green", "Blue", "Purple", "Pink", "Cancel" };
    int choice = tinyfd_openFileDialog("Pick your favorite color", "Choose a color:", 8, options, NULL, 1);

    //User cancel
    if (choice == -1 || choice == 7) {
        tinyfd_messageBox("Error", "You cancelled the color selection.", "error", "OK", 1);
        return;
    }

    //RGB values
    switch (choice) {
    case 0: // Red
        color->red = 204;
        color->green = 0;
        color->blue = 0;
        break;
    case 1: // Orange
        color->red = 255;
        color->green = 153;
        color->blue = 0;
        break;
    case 2: // Yellow
        color->red = 255;
        color->green = 255;
        color->blue = 0;
        break;
    case 3: // Green
        color->red = 0;
        color->green = 128;
        color->blue = 0;
        break;
    case 4: // Blue
        color->red = 0;
        color->green = 0;
        color->blue = 204;
        break;
    case 5: // Purple
        color->red = 102;
        color->green = 0;
        color->blue = 153;
        break;
    case 6: // Pink
        color->red = 255;
        color->green = 20;
        color->blue = 147;
        break;
    }
}
int main(int argc, char* argv[]) {
    if (argc < 3) {
        return -1;
    }

    //Number of beeps
    int num_beeps = atoi(argv[2]);
    beeper(num_beeps);

    //Favorite color
    struct FavoriteColor person_color;

    strncpy(person_color.name, argv[1], sizeof(person_color.name) - 1);
    person_color.name[sizeof(person_color.name) - 1] = '\0';

    mood_ring(&person_color);

    char message[256];
    printf(message, sizeof(message), "Name: %s\nRed: %d\nGreen: %d\nBlue: %d", person_color.name, person_color.red, person_color.green, person_color.blue);

    tinyfd_messageBox("Favorite Color", message, "info", "OK", 1);

    return 0;
}

编辑!我的参数数量是错误的,现在它打印我的名字,并打开一个弹出的哔哔声,并做哔哔声!但没有其他弹出。对于上下文应该有更多的弹出关于最喜欢的颜色,但这并没有发生。命令行打印这一点。

╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠MacKenna


我所期望的是类似于这样的输出:

Input: ./P_MiniProject3 John 5
(Output dialog box appears)
Notification: Beeping 5 times!
(Color selection dialog box appears)
User selects Green as their favorite color.
(Message box appears)
Favorite Color:
Name: John
Red: 0
Green: 255
Blue: 0


或者至少像这样的错误消息:

Input: ./P_MiniProject3 Bob
(Output dialog box appears)
Error: Incorrect number of arguments provided. Please provide a name and the number of beeps.

t30tvxxf

t30tvxxf1#

在尝试对代码进行故障排除时,我不得不做出一些有根据的猜测,并进行一些代码替换,因为我没有使用“tinyfd”小部件集(对“GTK”更熟悉)。
以下是代码的重构版本,以便复制所需的功能,同时考虑了一些假设和有根据的猜测。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct FavoriteColor {          /* Educated guess of the structure definition as it was not included in the issue */
    char name[100];
    int red;
    int green;
    int blue;
};

// Number of beeps
void beeper(int num_beeps)
{
    char message[100];
    sprintf(message, "Beeping %d times! \nPress OK to initiate.\n", num_beeps);
    //tinyfd_messageBox("Notification", message, "info", "OK", 1);
    printf("%s", message);      /* Substituted this for the message box */

    // Beeps
    for (int i = 0; i < num_beeps; ++i)
    {
        printf("Beep\n");
    }
}

// Favorite color and store RGB values
void mood_ring(struct FavoriteColor* color)
{
    char const* options[8] = { "Red", "Orange", "Yellow", "Green", "Blue", "Purple", "Pink", "Cancel" };

    //int choice = tinyfd_openFileDialog("Pick your favorite color", "Choose a color:", 8, options, NULL, 1);       /* Suspect line of code */

    //char *selection = tinyfd_openFileDialog("Pick your favorite color", "Choose a color:", 8, options, NULL, 1);  /* Likely format for using this dialog box */

    int choice;

    char *selection = "Purple";                 /* Simulate making a selection from the dialog box  */

    for (choice = 0; choice < 8; choice++)      /* Evaluating the selection to an integer value     */
    {
        if (strcmp(selection, options[choice]) == 0)
            break;
    }

    // User cancel
    if (choice == -1 || choice == 7)
    {
        printf("You cancelled the color selection\n");
    }

    // RGB values
    switch (choice)
    {
    case 0: // Red
        color->red = 204;
        color->green = 0;
        color->blue = 0;
        break;
    case 1: // Orange
        color->red = 255;
        color->green = 153;
        color->blue = 0;
        break;
    case 2: // Yellow
        color->red = 255;
        color->green = 255;
        color->blue = 0;
    case 3: // Green
        color->red = 0;
        color->green = 128;
        color->blue = 0;
        break;
    case 4: // Blue
        color->red = 0;
        color->green = 0;
        color->blue = 204;
        break;
    case 5: // Purple
        color->red = 102;
        color->green = 0;
        color->blue = 153;
        break;
    case 6: // Pink
        color->red = 255;
        color->green = 20;
        color->blue = 147;
        break;

    default:                /* Default - such as when cancel is selected */
        color->red = 128;
        color->green = 128;
        color->blue = 128;
        break;
    }
}

int main(int argc, char* argv[])
{
    if (argc < 3)           /* Noted correction in the comments */
    {
        return -1;
    }

    // Number of beeps
    int num_beeps = atoi(argv[2]);
    beeper(num_beeps);

    // Favorite color
    struct FavoriteColor person_color;

    strncpy(person_color.name, argv[1], sizeof(person_color.name) - 1);
    person_color.name[sizeof(person_color.name) - 1] = '\0';

    mood_ring(&person_color);

    //char message[256];        /* This string variable was not being populated and could cause undefined behaviour */
    //printf(message, sizeof(message), "Name: %s\nRed: %d\nGreen: %d\nBlue: %d", person_color.name, person_color.red, person_color.green, person_color.blue);

    printf("Name: %s\nRed: %d\nGreen: %d\nBlue: %d\n", person_color.name, person_color.red, person_color.green, person_color.blue); /* In lieu of message box */

    //tinyfd_messageBox("Favorite Color", message, "info", "ok", 1);

    return 0;
}

字符串
首先,我很抱歉包含了完整的代码,但是重构的各个部分在整个程序中都是分散的。

  • 在代码示例中没有“FavoriteColor”的结构定义,但定义了一个结构定义,以便至少允许在程序中捕获所需的信息。
  • 如前所述,对“tinyfd”小部件(消息、对话框等)的任何引用都被注解掉了,取而代之的是打印或模拟输入数据的等效方法,保持了核心功能的完整性。
  • 参考“tinyMessageBox”小部件可能返回的值的类型,包含了一行注解掉的代码,作为重构程序以给予其适当功能的可能建议。
  • 正如其他支持者最初的好评中所指出的那样,参数计数检查已被更正,以测试命令行参数的正确数量。
  • 此外,似乎有可能在“main”函数中使用“message”字符数组的定义存在未定义的行为,因此该位被停用(不知道这是否是示例中缺少代码的结果)。

在查看了编辑过的代码和注解之后,我确实对“tinyfd_messageBox”函数的使用做了一些研究,并注意到这个函数返回一个字符数组(字符串)返回一个字符串值到一个整数变量很可能是您的争论点,因为您可能在此遇到了未定义的行为点
然后,下面是一个带有终端输出的样本运行(紫色是测试选择的颜色)。

craig@Vera:~/C_Programs/Console/Beeper/bin/Release$ ./Beeper Craig 5
Beeping 5 times! 
Press OK to initiate.
Beep
Beep
Beep
Beep
Beep
Name: Craig
Red: 102
Green: 0
Blue: 153


这里需要注意的是,可能需要进一步研究“tinyfd”工具包的正确用法,沿着可能需要进一步使用一些“C”教程文献,因为它与变量定义和用法有关。
希望您能够分析此示例代码沿着解释某些替换原因的附加注解。

相关问题