Ошибка 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"»
#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()
. Если оно равно нулю, это означает, что произошла ошибка ввода.
Наконец, убедитесь, что вы правильно обрабатываете ошибки и исключения в своем коде. Если ввод пользователя некорректен или не может быть преобразован в нужный тип данных, ваш код должен быть способен обработать эту ситуацию и сообщить пользователю об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д