Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.62
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
#1

Visual Studio - ошибка в функции scanf - C++

27.04.2012, 15:51. Просмотров 4740. Ответов 4
Метки нет (Все метки)

Задумал решить задачку.
Вася не любит английский язык, но каждый раз старается получить хотя бы четверку за четверть, чтобы оставаться ударником. В текущей четверти Вася заметил следующую закономерность: по нечетным дням месяца он получал тройки, а по четным – четверки. Так же он помнит, в какие дни он получал эти оценки. Поэтому он выписал на бумажке все эти дни для того, чтобы оценить, сколько у него троек и сколько четверок. Помогите Васе это сделать, расположив четные и нечетные числа в разных строчках. Вася может рассчитывать на оценку 4, если четверок не меньше, чем троек.
Ерунда, подумал я! Читаем числа из файла по порядку, нечётные в один массив, чётные сразу вывожу в первую строчку.Затем в цикле вывожу массив нечётных чисел во вторую строчку. Ну и там чего больше заодно подсчитываем.

Так вот моя программа:
причём, ошибка возникает, если переменные делать внешними.
Если объявить их локальными, ошибки не будет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
 
unsigned char date;
unsigned char asize;
unsigned char a[100];
int N;//WRONG
int i;
int main(){
//int i; int N;// Если б я написал так, всё работало бы верно.
freopen("INPUT.TXT", "r", stdin);
freopen("OUTPUT.TXT", "w", stdout);
scanf("%d", &N);
asize=0;
i=N;
///i=N=5
while(i--){
    scanf("%d", &date);//date=4; i=0 уже в первом проходе цикла WTF???
                                    //сразу после scanf
    if(date&1){
        printf("%d ", date);
    }else{
        a[asize]=date;
        asize++;
    }
 
}
printf("\n");
N-=(asize<<1);
while(asize--)printf("%d ", a[asize]);
if (N>=0)printf("\nYES");else printf("\nNO");
return 0;
}
Причём ошибка происходит где-то в функции scanf
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
scanf("%d", &N);
00C81439  mov         esi,esp 
00C8143B  push        offset N (0C871ACh) 
00C81440  push        offset string "%d" (0C85750h) 
00C81445  call        dword ptr [__imp__scanf (0C882CCh)] 
00C8144B  add         esp,8 
00C8144E  cmp         esi,esp 
00C81450  call        @ILT+325(__RTC_CheckEsp) (0C8114Ah) 
asize=0;
00C81455  mov         byte ptr [asize (0C87140h)],0 
i=N;
00C8145C  mov         eax,dword ptr [N (0C871ACh)] 
00C81461  mov         dword ptr [i (0C87144h)],eax 
;///i=N=5
while(i--){
00C81466  mov         eax,dword ptr [i (0C87144h)] 
00C8146B  mov         dword ptr [ebp-0C4h],eax 
00C81471  mov         ecx,dword ptr [i (0C87144h)] 
00C81477  sub         ecx,1 
00C8147A  mov         dword ptr [i (0C87144h)],ecx ;//i--, всё нормально i стало равно 4
00C81480  cmp         dword ptr [ebp-0C4h],0 
00C81487  je          main+136h (0C814F6h) ;//условие цикла тоже выполнилось, заходим в while
    scanf("%d", &date);
00C81489  mov         esi,esp 
00C8148B  push        offset date (0C87141h) 
00C81490  push        offset string "%d" (0C85750h) 
00C81495  call        dword ptr [__imp__scanf (0C882CCh)] 
;///И вот после этого scanfa i обнуляется.!!!!
00C8149B  add         esp,8 ;          WTFWTFWTFWTFWTFWTF
00C8149E  cmp         esi,esp 
00C814A0  call        @ILT+325(__RTC_CheckEsp) (0C8114Ah) ; дальше ещё тело цикла и переход в конце
Добавлено через 5 минут
может это как-то связано с типом unsigned char???
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2012, 15:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Visual Studio - ошибка в функции scanf (C++):

Имеются ли отличия в компиляторах у сред разработки Visual Studio 2006 и Visual Studio 2015 ? - C++
скажите а где найти среду 2006 года? или можно использовать 2015 год?

Visual Studio Team Foundation Serverl или Visual Studio Professional - C++
Visual Studio Team Foundation Server 2010 Кто пользовался Visual Studio Team Foundation Server 2010, и чем она отличаеться от Visual...

Ошибка в Visual Studio - C++
Привет всем) Я нуб в игрострое) Помогите мне с проблемкой. Делал игру на Visual Studio 2010 Pro по этому уроку...

Visual studio. Ошибка - C++
При компиляции вылетает данная ошибка. Пробовал на разных устройствах и версиях Visual Studio. Появляется в MFC на дмиалоговых окнах, либо...

Аналог функции в Visual Studio - C++
cout &lt;&lt; endl.....как записать это для Visual Studio

Visual Studio - нормально, g++ - ошибка - C++
Здравствуйте. Осваиваю умные указатели, взял самый простой пример. #include &lt;iostream&gt; using namespace std; class Object ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.04.2012, 16:11 #2
new.cpp: В функции «int main()»:
new.cpp:17:22: предупреждение: format «%d» expects argument of type «int*», but argument 2 has type «unsigned char*» [-Wformat]
Как бэ намекает.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
27.04.2012, 16:12  [ТС] #3
Поставил эксперимент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned char date[4]={0xFF, 0xFF, 0xFF, 0xFF};
int i;
//...
int main(){
///...
///...
while(i--){
//до date[4]={0xFF, 0xFF, 0xFF, 0xFF}
scanf("%d", date);//ввод 4
//после date[4]={0x04, 0x00, 0x00, 0x00}
//КАКОГО ЛЕШЕГО??? Я же вам передавал только адрес ПЕРВОГО ЭЛЕМЕНТА???
}
///...
///...
}
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.04.2012, 16:20 #4
Kuzia domovenok, Ну а спецификатор "%d" соответствует sizeof(int). Т.е. в данном случае 4 байта.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>
 
void trace_bytes(const unsigned char* bytes, size_t length)
{
   for (size_t i = 0; i < length; ++i)
   {
      printf("%d", bytes[i]);
   }
   printf("\n");
}
 
int main()
{
   unsigned char bytes[] = {0x1, 0x2, 0x3, 0x4};
   trace_bytes(bytes, sizeof(bytes));
   scanf("%c", bytes);
   trace_bytes(bytes, sizeof(bytes));
}
Bash
1
2
3
4
forever@pterois:~/My_pro1/cpp_pro$ ./new 
1234
0
48234
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
27.04.2012, 16:20  [ТС] #5
да, лопухнулся. Как-то я это только сейчас узнал.
Получается невозможно сохранить десятичное число до 255 в однобайтовой переменной?
Почему-то всегда думал, что %d означает десятичная сис.счисления, а для разных размеров есть %ld и.т.п.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2012, 16:20
Привет! Вот еще темы с ответами:

Ошибка в visual studio 2010 - C++
как исправить эту ошибку ?

Ошибка LNK1561/Visual Studio/ С++ - C++
Пишет LNK1561 точка входа должна быть определена,т.е. мне нужно ввести функцию main(), но при вводе возникает проблема, одну из фигурных...

Ошибка в Visual Studio 2010 - C++
Здравствуйте, буду признателен, если поможете разобраться) Установил вот Visual Studio 2010, решил опробовать, а он при компиляции вот...

Ошибка в visual studio 2010 c++ - C++
Доброго времени суток, друзья! У меня такая проблема, что при запуске программы vs10 выдает ошибку(см.скрин ниже). Знаю, что у многих...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.04.2012, 16:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru