Ошибка W8012: "Comparing signed and unsigned values" - C (СИ)

Узнай цену своей работы

Формулировка задачи:

void init() 
{
   int j;
    gotoxy(x,menuitem+9);
    MODE_8;
    cprintf("%s",menu_names[menu_name]);
   for(j=1; j<(34-strlen(menu_names[menu_name])); j++) {    cprintf("%s ");}
    MODE_6;
    gotoxy(1,25);
    cprintf("%-79s",menu_desc[menu_name]); MODE_8;
}

Решение задачи: «Ошибка W8012: "Comparing signed and unsigned values"»

textual
Листинг программы
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <fcntl.h>
#include <dos.h>
#include <process.h>
#include <errno.h>
 
#define MENU_ITEMS 9 // кількість пунктів меню
 
char *menu_names[MENU_ITEMS] =  // Масив з назвами пунктів меню
    {" Create new base ",
    " View all records in base",
    " View autors ",
    " View students",
    " Edit record ",
    " Add record ",
    " Delete record ",
    " Exit ",
    " O programme" };
 
char *menu_desc[MENU_ITEMS] = // Масив з підказками до пунктів меню
    {" Sozdanie novoy bazy dannih.",
    " Pokaz vseh zapisey v tekuschey baze dannih.",
    " Vivod knig opredelennogo avtora na ekran.",
    " Vivod FIO studenta vzjvshego opredelennuy knigu.",
    " Redaktirovanie opredelennoy zapisi v baze.",
    " Dobavlenie zapisi v bazu dannih.",
    " Udalenie zapisi iz bazy dannih.",
    " Vihod iz programmi ...",
    " Svedenia o razrabotchike." };
 
struct data //структура записей у базі даних
        {
      int shifr; // Шифр книги
      char fio_avt[20]; //ПІБ автора
      char name[20]; // Назва книги
      char fio_stud[20]; //ПІБ студента, який узяв книгу
      };
 
int x=0,y=0,z=0; // Перемінна меню
int menuitem=0;  //  -------//------
int menu_low=0;  //  -------//------
int menu_high=8; //  -------//------
int menu_name=0; //  -------//------
 
int num_recs=0; //перемінна в якій зберігається кількість заповнених записей
struct data database[100]; //масив записей (база даних)
 
#define MODE_0      {textattr(WHITE | (BLACK << 4));} //описание
#define MODE_1      {textattr(RED   | (BLACK << 4));}
#define MODE_2      {textattr(BLACK | (BLUE << 4));}  //    цветовых
#define MODE_3      {textattr(GREEN | (BLACK << 4));}
#define MODE_4      {textattr(WHITE | (BLACK << 4));}
#define MODE_5      {textattr(WHITE | (BLACK << 4));} // режимов
#define MODE_7      {textattr(RED | (YELLOW << 4));}
#define MODE_6      {textattr(YELLOW |(RED   << 4));}
#define MODE_13      {textattr(WHITE |(BLACK  << 4));}  // экрана
#define MODE_8      {textattr(WHITE |(BLUE  << 4));}
#define MODE_9      {textattr(WHITE |(BLUE   << 4));}
#define MODE_12      {textattr(WHITE |(RED   << 4));}
#define MODE_14      {textattr(YELLOW |(BLACK   << 4));}
 
void init() // Функція ініціализації меню
{
   int j;
    gotoxy(x,menuitem+9);
    MODE_8;
    cprintf("%s",menu_names[menu_name]);
   for(j=1; j<(34-strlen(menu_names[menu_name])); j++) {    cprintf("%s ");}
    MODE_6;
    gotoxy(1,25);
    cprintf("%-79s",menu_desc[menu_name]); MODE_8;
}
 
 
 
void menu_up() // Функція, яка піднімає курсор меню нагору при натисканні клавіші "вверх"
{
    MODE_9;
    if(menuitem==0)
    {
        if(menu_low==0)
        {
            menu_low=0;
            menu_high=8;
        }
        else
        {
            menu_low--;
            menu_high--;
        }
        menuitem=0;
    }
    else menuitem--;
 
    if(menu_name==0) menu_name=0;
    else menu_name--;
}
 
void menu_down() // Функція, яка опускає курсор меню нагору при натисканні клавіші "вниз"
{
    MODE_9;
    if(menuitem==8)
    {
        if(menu_high==MENU_ITEMS-1)
        {
            menu_high=MENU_ITEMS-1;
            menu_low=MENU_ITEMS-9;
        }
        else
        {
            menu_high++;
            menu_low++;
        }
    menuitem=8;
    }
    else menuitem++;
    if(menu_name==MENU_ITEMS-1) menu_name=MENU_ITEMS-1;
    else menu_name++;
}
 
 
void read_bd() //Функцяя зчитування бази з файлу й виведення на екран
{
 FILE *stream;
 int i,j;
 clrscr();
  if ((stream = fopen("data.txt", "r"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n\r");
    }
 fscanf(stream,"%i\n",&j);
 num_recs=j;
 cprintf(" \xCa There is found  %i records in file data.txt . \n\r",j);
 cprintf("-------------------------------------------------------------------------------\n\r",j);
 cprintf("| # |    Shifr     |       FIO avtora     |     Book Name   |   FIO studenta  |\n\r",j);
 cprintf("-------------------------------------------------------------------------------\n\r",j);
  for (i=0;i<j;i++)
 {
   fscanf(stream,"%i",&database[i].shifr);
   fscanf(stream,"%s",database[i].fio_avt);
   fscanf(stream,"%s",database[i].name);
   fscanf(stream,"%s",database[i].fio_stud);
   cprintf("|%3i|   %6i     |%20s  |%17s|%17s|\n\r",i,database[i].shifr,database[i].fio_avt,database[i].name,database[i].fio_stud);
 
 }
 cprintf("-------------------------------------------------------------------------------\n\r",j);
 fclose(stream);
}
 
 
void read_bd1() // Функція для виведення книг даного автора
{
 FILE *stream;
 int i,j,ch;
 char buf[20],f_name[15];
 
 clrscr();
 cprintf("\n\rEnter FIO avtora :");
 cscanf("%s",buf);
 cprintf("\n\rKuda proizvodit vivod ? (1 - Screen, 2 - file) : "); cscanf("%i",&ch);
  if ((stream = fopen("data.txt", "r"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n\r");
    }
 fscanf(stream,"%i\n",&j);
 num_recs=j;
 cprintf("\n\r \xCa There is found  %i records in file data.txt . \n\r",j);
 cprintf("-------------------------------------------------------------------------------\n\r",j);
 cprintf("| # |    Shifr     |       FIO avtora     |     Book Name   |   FIO studenta  |\n\r",j);
 cprintf("-------------------------------------------------------------------------------\n\r",j);
 for (i=0;i<j;i++)
 {
   fscanf(stream,"%i",&database[i].shifr);
   fscanf(stream,"%s",database[i].fio_avt);
   fscanf(stream,"%s",database[i].name);
   fscanf(stream,"%s",database[i].fio_stud);
   if (ch==1 && database[i].fio_avt[1]==buf[1] && database[i].fio_avt[2]==buf[2]
             && database[i].fio_avt[3]==buf[3] && strlen(database[i].fio_avt)==strlen(buf))
   {
   cprintf("|%3i|   %6i     |%20s  |%17s|%17s|\n\r",i,database[i].shifr,database[i].fio_avt,database[i].name,database[i].fio_stud);
   }
 }
 if (ch==1) {
 cprintf("-------------------------------------------------------------------------------\n\r",j);
 cprintf("\n\r\n\r\n\rPress <Enter> to quit main menu ..."); getch(); while (getch()!=13); }
 fclose(stream);
 if (ch==2)
 {
  cprintf("\n\rEnter file name : "); cscanf("%s",f_name);
  if ((stream = fopen(f_name, "w+"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n\r");
    }
 cprintf("%s", "\n\r\n\r \xCa Writing to file...\n\r");
 for (i=0;i<j;i++)
 {
   if (database[i].fio_avt[1]==buf[1] && database[i].fio_avt[2]==buf[2]
     && database[i].fio_avt[3]==buf[3] && strlen(database[i].fio_avt)==strlen(buf))
   {
    fprintf(stream,"%i\n",database[i].shifr);
    fprintf(stream,"%s\n",database[i].fio_avt);
    fprintf(stream,"%s\n",database[i].name);
   }
 }
 fclose(stream);
 cprintf("\n\r \xCa Data saved to file %s ...\n\r",f_name);
 cprintf("\n\r\n\r\n\r\n\rPress <Enter> to quit main menu ..."); getch(); while (getch()!=13);
 }
}
 
void read_bd2() // Функкція для виведення ПІБ студента, який узяв дану книгу
{
 FILE *stream;
 int i,j,ch;
 char buf[20],f_name[15];
 
 clrscr();
 read_bd();
 cprintf("\n\rEnter name of book :");
 cscanf("%s",buf);
 cprintf("\n\rKuda proizvodit vivod ? (1 - Screen, 2 - file) : "); cscanf("%i",&ch);
  if ((stream = fopen("data.txt", "r"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n\r");
    }
 fscanf(stream,"%i\n",&j);
 num_recs=j;
 for (i=0;i<j;i++)
 {
   fscanf(stream,"%i",&database[i].shifr);
   fscanf(stream,"%s",database[i].fio_avt);
   fscanf(stream,"%s",database[i].name);
   fscanf(stream,"%s",database[i].fio_stud);
   if (ch==1 && database[i].name[1]==buf[1] && database[i].name[2]==buf[2]
             && database[i].name[3]==buf[3] && strlen(database[i].name)==strlen(buf))
   {
   cprintf ("\r\n\r\n \xCa Record #%i ",i);
   cprintf ("\r\n FIO studenta vzjvshego knigu %s - %s",buf,database[i].fio_stud);
   }
 }
 if (ch==1) { cprintf("\n\r\n\r\n\rPress <Enter> to quit main menu ..."); getch(); while (getch()!=13); }
 
 fclose(stream);
 
 if (ch==2)
 {
  cprintf("\n\rEnter file name : "); cscanf("%s",f_name);
  if ((stream = fopen(f_name, "w+"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n\r");
    }
 cprintf("%s", "\n\r\n\r \xCa Writing to file...\n\r");
 for (i=0;i<j;i++)
 {
   if (database[i].name[1]==buf[1] && database[i].name[2]==buf[2]
     && database[i].name[3]==buf[3] && strlen(database[i].name)==strlen(buf))
   {
    fprintf (stream," FIO studenta vzjvshego knigu %s - %s \n ",buf,database[i].fio_stud);
   }
 }
 fclose(stream);
 cprintf("\n\r \xCa Data saved to file %s ...\n\r",f_name);
 cprintf("\n\r\n\r\n\r\n\rPress <Enter> to quit main menu ..."); getch(); while (getch()!=13);
 }
 
}
void create_bd() //Функцяя створення нової бази даних
{
 FILE *stream;
 int i,j;
 clrscr();
 cprintf ("\r\n How much records you want enter (1-100): ");
 scanf("%i", &j);
 cprintf("%s", " \xCa Writing to file...\n\r");
  if ((stream = fopen("data.txt", "w+"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n\r");
    }
 
 fprintf(stream,"%i\n",j);
 for (i=0;i<j;i++)
 {
   clrscr();
   cprintf ("\r\n \xCa Entering record #%i =-",i);
   cprintf ("\r\n Enter shifr :"); scanf("%i",&database[i].shifr);
   fprintf(stream,"%i\n",database[i].shifr);
   cprintf ("\r\n Enter FIO avtora :"); scanf("%s[20]",database[i].fio_avt);
   fprintf(stream,"%s\n",database[i].fio_avt);
   cprintf ("\r\n Enter book name :"); scanf("%s[20]",database[i].name);
   fprintf(stream,"%s\n",database[i].name);
   cprintf ("\r\n Enter FIO studenta :"); scanf("%s[20]",database[i].fio_stud);
   fprintf(stream,"%s\n",database[i].fio_stud);
 }
 fclose(stream);
 cprintf("%s", " \xCa Data saved to file data.txt ...\n\r");
}
 
void save_bd() //Функція, яка записує базу даних на диск
{
 FILE *stream;
 int i;
 clrscr();
  if ((stream = fopen("data.txt", "w+"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n\r");
    }
 
 fprintf(stream,"%i\n",num_recs);
 for (i=0;i<num_recs;i++)
 {
   clrscr();
   fprintf(stream,"%i\n",database[i].shifr);
   fprintf(stream,"%s\n",database[i].fio_avt);
   fprintf(stream,"%s\n",database[i].name);
   fprintf(stream,"%s\n",database[i].fio_stud);
 }
 fclose(stream);
}
void delete_bd() //Функція, яка удаляє указаний запис з бази даних
{
 FILE *stream;
 int i,j;
 clrscr();
 read_bd();
 cprintf ("\n\r Enter number of record to delete ? :"); scanf("%i", &j);
  if ((stream = fopen("data.txt", "w+"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n\r");
    }
 fprintf(stream,"%i\n",num_recs-1);
 for (i=0;i<num_recs;i++)
 {
   if (i!=j){
   fprintf(stream,"%i\n",database[i].shifr);
   fprintf(stream,"%s\n",database[i].fio_avt);
   fprintf(stream,"%s\n",database[i].name);
   fprintf(stream,"%s\n",database[i].fio_stud);
   }
 }
 fclose(stream);
 read_bd;
 cprintf("\n\r\n\r\n\r\n\rPress <Enter> to continue ..."); getch(); while (getch()!=13);
}
void edit_bd() //Функція редактування указаного запису в базі даних
{
 int j;
 read_bd();
 cprintf ("\n\r Enter number of record to edit ? :"); scanf("%i", &j);
   cprintf ("\r\n \xCa Editing record #%i =-",j);
   cprintf ("\r\n Enter shifr :"); scanf("%i",&database[j].shifr);
   cprintf ("\r\n Enter FIO avtora :"); scanf("%s[20]",database[j].fio_avt);
   cprintf ("\r\n Enter book name :"); scanf("%s[20]",database[j].name);
   cprintf ("\r\n Enter FIO studenta :"); scanf("%s[20]",database[j].fio_stud);
   cprintf("\n\r\n\r\n\r\n\rPress <Enter> to continue ..."); getch(); while (getch()!=13);
 save_bd();
 read_bd();
 cprintf("\n\r\n\r\n\r\n\rPress <Enter> to continue ..."); getch(); while (getch()!=13);
}
void add_bd() //Функція добавлення запису в базу даних
{
 int i,j;
 read_bd();
 cprintf ("\r\n How much records you want add (1-100): ");
 scanf("%i", &j);
 for (i=0;i<j;i++)
 {
   cprintf ("\r\n \xCa Adding record #%i =-",num_recs+i);
   cprintf ("\r\n Enter shifr :"); scanf("%i",&database[num_recs+i].shifr);
   cprintf ("\r Enter FIO avtora :"); scanf("%s[20]",database[num_recs+i].fio_avt);
   cprintf ("\r Enter book name :"); scanf("%s[20]",database[num_recs+i].name);
   cprintf ("\r Enter FIO studenta :"); scanf("%s[20]",database[num_recs+i].fio_stud);
 }
   cprintf("\n\r\n\r\n\r\n\rPress <Enter> to continue ..."); getch(); while (getch()!=13);
 num_recs=num_recs+j;
 save_bd();
 read_bd();
 cprintf("\n\r\n\r\n\r\n\rPress <Enter> to continue ..."); getch(); while (getch()!=13);
}
 
void vivod()
{
 cprintf ("\n\r\n\r\n\r\n\r Programmy razrabotal student 333 gruppi \n\r\n\Ivanov I.I. ");
cprintf("\n\r\n\r\n\r\n\rPress <Enter> to continue ..."); getch();
}
 
void result() //Функция определяющая какой пункт меню выбран путем нажатия клавиши <ENTER>
{
        switch(menuitem) { //Якщо вибран ... пункт меню, то ...
case 0:         //Якщо вибран 1 пункт меню, то виконується  create_bd()          create_bd();
          cprintf ("\n\r Press <ENTER> to continue ...");
            getch();    MODE_8; clrscr();
           break;
            case 1:        //По аналогії з першим
          read_bd(); cprintf ("\n\r Press <ENTER> to continue ...");
            getch();    MODE_8;  clrscr();  break;
            case 2:read_bd1(); MODE_8;  clrscr();   break;
            case 3:read_bd2(); MODE_8;  clrscr();   break;
            case 4:edit_bd(); MODE_8;  clrscr();    break;
            case 5:add_bd(); MODE_8;  clrscr();     break;
            case 6:delete_bd(); MODE_8;  clrscr();  break;
         case 7:    MODE_0; clrscr(); exit(1); break;
         case 8: clrscr(); vivod(); MODE_8; clrscr();  break;
        }
}
void main(void) //Головна функція
{   int i;
    init();
    y=9;
    x=21;
    MODE_9;
    clrscr();
    while(1) {
        gotoxy(19,7);
        MODE_7;  // Рамка меню
        cprintf("\n\xc9\xCd\xCd\xCd\xCd\xCD\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCD\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCD\xCd\xCd\xCd\xCd\xCd\xCd\xbb\r");//Рисуем рамку меню
      for(i=menu_low; i<menu_high+1; i++)
        {
            gotoxy(19,i-menu_low+8);
            cprintf("\n\xba %-34s\xba\r",menu_names[i]); //Вписуємо в рамку назви пунктів меню
        }
      gotoxy(19,17);        cprintf("\n\xc8\xCd\xCd\xCxCCd\xCd\xCd\xCd\xCD\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xCd\xc\n\r");
      for(i=9; i<18; i++)
        {
        gotoxy(56,i);
        textcolor(BLACK);
      cprintf("ЫЫ");    // Тінь збоку
        }
        gotoxy(22,18);
        textcolor(BLACK);
    cprintf("\nЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЫ\r"); // Тінь знизу
 
        MODE_0;
        init();
        switch(getch()) { //Вибір натиснутої клавіши
            case '\x48':  //якщо натиснута клавіша "вверх", то
                menu_up(); //запуск menu_up();
                break;
            case '\x50': //якщо натиснута клавіша "вниз", то
                menu_down(); //запуск menu_down();
                break;
            case 13: //якщо натиснута клавіша <Enter>
         result(); //запуск функції вибору пункта меню
        break;
            case '\x1B': //Якщо натиснута клавіша <Esc>
            MODE_0;
            clrscr();
            exit(1);  //вихід з програми
            default:
            while(!kbhit());
        }
    }
}

Объяснение кода листинга программы

Ошибка W8012, которую вы видите, обычно возникает при попытке сравнить два значения разных типов. В вашем случае, похоже, что вы пытаетесь сравнить целочисленное значение с символом или строкой. В коде, который вы предоставили, эта ошибка может возникнуть в любой из функций, где вы пытаетесь сравнить значения. Но, судя по всему, проблема возникает в функции main(), когда вы пытаетесь получить ввод пользователя с помощью scanf(). Похоже, что вы пытаетесь считать строку, а затем сравниваете ее с числом, что вызывает ошибку. Вам нужно убедиться, что вы правильно обрабатываете ввод пользователя и сравниваете его с правильными типами данных. Если вы хотите считать строку, используйте функцию scanf(%s, buffer);, где buffer - это строка, которую вы можете определить в вашем коде. Затем вы можете использовать strcmp() для сравнения этой строки с другими строками. Важно также проверить, был ли успешно выполнен ввод пользователя перед его использованием. Вы можете сделать это, проверив возвращаемое значение scanf(). Если оно равно нулю, это означает, что произошла ошибка ввода. Наконец, убедитесь, что вы правильно обрабатываете ошибки и исключения в своем коде. Если ввод пользователя некорректен или не может быть преобразован в нужный тип данных, ваш код должен быть способен обработать эту ситуацию и сообщить пользователю об ошибке.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5