555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
1

Переменная не может принять размер int64

12.02.2015, 12:48. Показов 2020. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Рабочий код на D:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import std.stdio;
 
void main()
{
    byte h;
    long n, ans = 0;
 
    readf(" %s %s", &h, &n);    
    --n;
 
    bool mv = 0;
    foreach_reverse (i; 0..h) {
        auto temp = !!(n & (1L << i));
        if (mv != temp) {
            ans += ((1L << (i + 1)) - 1);
            mv ^= 1;
        }
        mv ^= 1;
        ans++;
    }
 
    writeln(ans);
}
Почему итератор цикла не может принять значение int64?
Код
open System

let a = Console.ReadLine().Split()

let mutable mv = 0L
let mutable ans = 0L
let mutable tmp = 0L
let mutable temp = 0L
let n = int64(a.[0]) - 1L
let mutable i = n

let f = while i >= 0L do
            if ((n &&& (1L <<< i)) = 0L) then
                temp <- 0L;
            else
                temp <- 1L;
            if (mv <> temp) then
                ans <- ans + ((1L <<< (i + 1L)) - 1L);
                mv <- mv ^^^ 1L
            mv <- mv ^^^ 1L
            ans <- ans + 1L
            i <- i - 1L
        printfn "%i" ans
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2015, 12:48
Ответы с готовыми решениями:

Определить максмальный размер, который может принимать переменная
Здравствуйте подскажите как реализовать следующубю задачу. Дана переменная re типа int и нужно...

не может принять аргументы
У меня такая проблема выдает такую ошибку Fatal error: Destructor DataBase::__destruct() cannot...

Слушающий сокет не может принять соединение
#include &lt;iostream&gt; #include &lt;winsock2.h&gt; void WSAmel(){ WSADATA w; if...

Размер поля недостаточен, чтобы принять добавляемые данные
Привет! Нужно выполнить запрос, код ниже. При попытке выполнения ошибка: &quot;Размер поля...

21
Заблокирован
12.02.2015, 13:09 2
Лучший ответ Сообщение было отмечено Dennis Ritchie как решение

Решение

Dennis Ritchie, на D у вас тип не int64 для h...
F#
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
open System
 
let a = Console.ReadLine().Split()
 
let n = int64(a.[1]) - 1L
 
let mutable mv = 0L
let mutable ans = 0L
let mutable tmp = 0L
let mutable temp = 0L
let mutable i = int(a.[0]) - 1
 
let f = while i >= 0 do
            if ((n &&& (1L <<< i)) = 0L) then
                temp <- 0L;
            else
                temp <- 1L;
            if (mv <> temp) then
                ans <- ans + ((1L <<< (i + 1)) - 1L);
                mv <- mv ^^^ 1L
            mv <- mv ^^^ 1L
            ans <- ans + 1L
            i <- i - 1
        printfn "%i" ans
 
f
Код
3 4
4
Для продолжения нажмите любую клавишу . . .
Добавлено через 9 минут
Dennis Ritchie, и теперь ответ на ваш вопрос:
Побитовый оператор сдвига влево. Результатом является первый операнд с битами, смещенными влево на число битов второго операнда. Биты, смещенные из наиболее важного положения не перемещаются в наименее важное положение. Наименее важные биты заполняются нулями. Тип второго аргумента — int32.
https://msdn.microsoft.com/ru-... 69495.aspx
и я бы немного переписал код:
Код
open System
 
let a = Console.ReadLine().Split()
let n = int64(a.[1]) - 1L
let h = int(a.[0]) - 1
 
let f (h:int) (n:int64)= 
    let mutable i = h
    let mutable mv = 0L
    let mutable ans = 0L
    let mutable tmp = 0L
    let mutable temp = 0L
    while i >= 0 do
            if ((n &&& (1L <<< i)) = 0L) then
                temp <- 0L;
            else
                temp <- 1L;
            if (mv <> temp) then
                ans <- ans + ((1L <<< (i + 1)) - 1L);
                mv <- mv ^^^ 1L
            mv <- mv ^^^ 1L
            ans <- ans + 1L
            i <- i - 1
    printfn "%i" ans

f h n
1
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
12.02.2015, 13:09  [ТС] 3
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Dennis Ritchie, на D у вас тип не int64 для h...
Нет разницы.
0
Заблокирован
12.02.2015, 13:10 4
Dennis Ritchie, ответ см. выше.
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
12.02.2015, 13:19  [ТС] 5
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
f h n
Зачем так делать?
0
Заблокирован
12.02.2015, 13:21 6
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Зачем так делать?
Dennis Ritchie, хм...функция есть функция и внутри неё нужно стараться избегать использования внешних переменных.
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
12.02.2015, 13:24 7
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Биты, смещенные из наиболее важного положения не перемещаются в наименее важное положение.
это гуглоперевод?
0
Заблокирован
12.02.2015, 13:30 8
Цитата Сообщение от castorsky Посмотреть сообщение
это гуглоперевод?
castorsky, да ("Эта статья переведена вручную"), в оригинале:
Bitwise left-shift operator. The result is the first operand with bits shifted left by the number of bits in the second operand. Bits shifted off the most significant position are not rotated into the least significant position. The least significant bits are padded with zeros. The type of the second argument is int32.
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
12.02.2015, 13:31  [ТС] 9
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
https://msdn.microsoft.com/ru-ru/library/dd469495.aspx
В книге не было про это написано:
Тип второго аргумента — int32.
Поэтому я и ошибся.
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
хм...функция есть функция и внутри неё нужно стараться избегать использования внешних переменных.
Ev_Hyper, да, это я и так знаю. Я не понимаю, что эти f h n три буквы делают. Они закрывают функции? Или что?
0
Заблокирован
12.02.2015, 13:32 10
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Я не понимаю, что эти f h n три буквы делают. Они закрывают функции? Или что?
Dennis Ritchie, нет, это обычный вызов функции
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
12.02.2015, 13:42 11
Dennis Ritchie, если Вам нужны ответы на вопросы, Вы получите их тут. Это замечательный учебник в котором рассматривается то что в названии книги. Пока что Вы накладываете всё новое на свои шаблоны. Рассматривается детально и понятно на специальном учебном языке Oz, который придумали для этого курса. Там Вы узнаете почему надо писать по другому. Ну и так, в довесок, в языке Oz одну переменную можно связать со значением только однажды и больше никогда (это я про мутабельность Ваших переменных). Следовательно придется ломать свои привычки и не задавать глупых вопросов.

Добавлено через 6 минут
Ev_Hyper, получается (тоже вольный) биты, сдвинутые из старших позиций не перемещаются в младшие позиции, т.е. арифметический сдвиг.
1
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
12.02.2015, 13:49  [ТС] 12
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
нет, это обычный вызов функции
Ev_Hyper, я так и не понял. Откуда вообще функции вызываются? Или где прочитать про эту фишку?

Добавлено через 1 минуту
Цитата Сообщение от castorsky Посмотреть сообщение
Следовательно придется ломать свои привычки и не задавать глупых вопросов.
Какие привычки? Императивные.
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
12.02.2015, 13:59 13
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Какие привычки? Императивные.
да, начните с того что все переменные (кстати у этого термина 2 значения) неизменны и вместо циклов используется рекурсия (компилятор сам ее переделает в цикл).
0
Заблокирован
12.02.2015, 14:05 14
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Ev_Hyper, я так и не понял. Откуда вообще функции вызываются? Или где прочитать про эту фишку?
Dennis Ritchie, что значит откуда? из программы:
http://ideone.com/CpljwK
Или вы о том, что нету привычного main?
Хорошая книга: Крис Смит "Программирование на языке F#"
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
12.02.2015, 14:10  [ТС] 15
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Хорошая книга: Крис Смит "Программирование на языке F#"
Я именно эту книгу и читал. Она уже устарела.
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Или вы о том, что нету привычного main?
Да, я про это.
0
Заблокирован
12.02.2015, 14:41 16
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Я именно эту книгу и читал. Она уже устарела.
Dennis Ritchie, да неужели? Значит вы невнимательно читали...
Переменная не может принять размер int64
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
12.02.2015, 14:51  [ТС] 17
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
да неужели?
Ev_Hyper, 4 года - это существенное время для ЯП.

Добавлено через 3 минуты
Попробую объяснить по-другому.

Чем отличается этот вариант программы:
Код
open System
 
let a = Console.ReadLine().Split()
let n = int64(a.[1]) - 1L
let h = int(a.[0]) - 1
 
let f (h:int) (n:int64)= 
    let mutable i = h
    let mutable mv = 0L
    let mutable ans = 0L
    let mutable tmp = 0L
    let mutable temp = 0L
    while i >= 0 do
            if ((n &&& (1L <<< i)) = 0L) then
                temp <- 0L;
            else
                temp <- 1L;
            if (mv <> temp) then
                ans <- ans + ((1L <<< (i + 1)) - 1L);
                mv <- mv ^^^ 1L
            mv <- mv ^^^ 1L
            ans <- ans + 1L
            i <- i - 1
    printfn "%i" ans
 
f h n
От этого:
Код
open System
 
let a = Console.ReadLine().Split()
let n = int64(a.[1]) - 1L
let h = int(a.[0]) - 1
 
let f (h:int) (n:int64)= 
    let mutable i = h
    let mutable mv = 0L
    let mutable ans = 0L
    let mutable tmp = 0L
    let mutable temp = 0L
    while i >= 0 do
            if ((n &&& (1L <<< i)) = 0L) then
                temp <- 0L;
            else
                temp <- 1L;
            if (mv <> temp) then
                ans <- ans + ((1L <<< (i + 1)) - 1L);
                mv <- mv ^^^ 1L
            mv <- mv ^^^ 1L
            ans <- ans + 1L
            i <- i - 1
    printfn "%i" ans
0
Заблокирован
12.02.2015, 15:02 18
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Чем отличается этот вариант программы:
Dennis Ritchie, Эта строка:
Код
f h n
просто вызов функции. Как вы думаете, каков будет результат, если её убрать?
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
12.02.2015, 15:12  [ТС] 19
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
просто вызов функции. Как вы думаете, каков будет результат, если её убрать?
Всё понял. Чего-то меня заклинило.
А чем эти две программы отличаются?
Код
open System
 
let a = Console.ReadLine().Split()
 
let n = int64(a.[1]) - 1L
 
let mutable mv = 0L
let mutable ans = 0L
let mutable tmp = 0L
let mutable temp = 0L
let mutable i = int(a.[0]) - 1
 
let f = while i >= 0 do
            if ((n &&& (1L <<< i)) = 0L) then
                temp <- 0L;
            else
                temp <- 1L;
            if (mv <> temp) then
                ans <- ans + ((1L <<< (i + 1)) - 1L);
                mv <- mv ^^^ 1L
            mv <- mv ^^^ 1L
            ans <- ans + 1L
            i <- i - 1
        printfn "%i" ans
Код
open System
 
let a = Console.ReadLine().Split()
 
let n = int64(a.[1]) - 1L
 
let mutable mv = 0L
let mutable ans = 0L
let mutable tmp = 0L
let mutable temp = 0L
let mutable i = int(a.[0]) - 1
 
let f = while i >= 0 do
            if ((n &&& (1L <<< i)) = 0L) then
                temp <- 0L;
            else
                temp <- 1L;
            if (mv <> temp) then
                ans <- ans + ((1L <<< (i + 1)) - 1L);
                mv <- mv ^^^ 1L
            mv <- mv ^^^ 1L
            ans <- ans + 1L
            i <- i - 1
        printfn "%i" ans
 
f
0
Эксперт Java
4452 / 2684 / 483
Регистрация: 28.04.2012
Сообщений: 8,539
12.02.2015, 16:54 20
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А чем эти две программы отличаются?
Ничем, в обоих f — не функция, а значение.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2015, 16:54
Помогаю со студенческими работами здесь

[ADO] Размер поля недостаточен, чтобы принять добавляемые данные
Имеется такой код: for i := 1 to Q.RecordCount do begin Q.SQL.Clear; ...

Определить длину строки которую может принять wcf сервис
Здравствуйте форумчане. Подскажите новичку как определить максимальную длину строки которую может...

Ящик не может принять наследство по классам (размеры, вес и цвет)
Здравствуйте! Детская задача, но что-то не стыкуется. Не могу сообразить: чего не хватает ящику,...

какой объём картинки (MMS) может принять NOKIA 5300?
Человек в деревне живёт, надо скинуть ему картинку на сотовый, а он не знает такой характеристики,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru