С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Alex83
13 / 13 / 1
Регистрация: 06.02.2010
Сообщений: 19
1

Странное поведение (сдвиг)

06.02.2010, 15:29. Просмотров 512. Ответов 8
Метки нет (Все метки)

Здравствуйте.Прошу помочь с задачкой.
Программа , должна "сдвигать" данные в один бит(128), но при вызове функции с разными параметрами, выводит дублирующиеся значения результатов.
Суть проблемы: Не воспринимается изменение входящих параметров: этот кусок программы выводит белиберду такого вида....
!!!!!!54 : 0
SHIFT byte:54////////54-55 дубляж ! , но ведь значения функция принимает разные в каждом случае.
0011011
!!!!!!55 : 0
SHIFT byte:55
0011011

!!!!!!56 : 0
SHIFT byte:56/////////56-57 дубляж !
!!!!!!57 : 0
SHIFT byte:57
0011100
............................................

!!!!!!126 : 0
SHIFT byte:126///////////////////////126-127 дубляж ! Почему так ?
0111111
!!!!!!127 : 0
SHIFT byte:127
0111111

!!!!!!128 : 128
SHIFT byte:128
1000000// С чего вдруг , он соизволил вывести правильно ?
Press any key to continue

//////////////// А вот и исходник этой "беды"......
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
#include <iostream.h>
#include<conio.h>
#include<stdlib.h>
#include <stdio.h>
 
void padla(int addr)
{int a, p=0;
cout<<"SHIFT byte:"<<addr<<endl;
    for(p=7;p>0;p--)
    {
    if(!(addr&128)){cout<<"0";}
    else{cout<<"1";}
    addr=addr<<1;
    }
}
void main(){
 
int i;
for(i=0;i<129;i++)
{
    cout<<endl<<"!!!!!!"<<i<<" : "<<(i&128)<<endl;
    padla(i);cout<<endl;}
 
getch();
}
Для чего шифтуется "адрес": это клочек кода рабочей в принципе программы(и на 100% рабочей железки) , которая читает/пишет микросхему памяти (eeprom) 93с46 навешенную на LPT. Соответственно мне необходимо передавать опкод-адрес-данные.....И все в последовательной форме , через такой шифтинг.Ну вы представляете , во что превратится дамп после такой адресации.(64 по-парно одинаковых выходных значений при разном адресе на входе.) Вот только с функцией ,работающей с данными ,проблем нет(там уже8 бит, но похожий код). Мистика ?

Добавлено через 21 минуту
Если интересно.... Так сейчас выглядит сама функция вывода адреса в порт.

C++
1
2
3
4
5
6
7
8
9
10
11
void paddre(int addr)
{int p=0;
cout<<"paddre:::Send adress of byte:"<<addr<<endl;/// для того,чтобы увидеть принимаемое значение
    for(p=7;p>0;p--)
    {
    if(!(addr&128)){dsetlow();pclc();a=0;}//(если бит адреса=1) =/то выводим еденицу в порт
    if((addr&128)){dsethi();pclc();a=1;}//(если бит адреса=0) =/то выводим ноль в порт(там инвертер)
    addr=addr<<1;// здесь сдвигаем исходное значение влево , под "селектор".
    }//повторяем 7 раз , пока не пошлем весь адрес.
dsetlow(); // просто роняем шину и выходим...
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2010, 15:29
Ответы с готовыми решениями:

Странное поведение
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс...

Странное поведение new
Объясните почему оператор new выделяет неверное количество памяти? # include...

Странное поведение указателя
Здравствуйте, наткнулся на непонятное мне поведение указателя или точнее...

Странное поведение строки
Есть класс со связным списком(в связных списках символы)(файл1). Перегружаю...

Странное поведение указателей
Здравствуйте, может кто-нибудь объяснить столь странное поведение указателя....

8
odip
Эксперт С++
7164 / 3222 / 77
Регистрация: 17.06.2009
Сообщений: 14,160
06.02.2010, 19:07 2
На редкость кривой способ написания кода.
А не работает понятно почему, должно быть так:
C
1
2
3
4
5
6
7
8
9
10
void padla(int addr)
{int a, p=0;
cout<<"SHIFT byte:"<<addr<<endl;
        for(p=7;p>=0;p--)
        {
        if(!(addr&128)){cout<<"0";}
        else{cout<<"1";}
        addr=addr<<1;
        }
}
Это все если ты не перепутал порядок битов - у тебя вывод идет от старшего к младшему,
а возможно что выводить нужно от младшего к старшему.

//повторяем 7 раз , пока не пошлем весь адрес.
А ничего что в байте 8 бит, а не 7 ?
1
Alex83
13 / 13 / 1
Регистрация: 06.02.2010
Сообщений: 19
06.02.2010, 19:30  [ТС] 3
Тут всё дело в том , что адрес ,который передается в последовательном виде таким вот смещением - это семь(7)бит.Именно задом на перед.Ошибки там нет , и не спорю , в байте 8 бит (0-7).
Просто микросхема предоставляет в том режиме 128 ячеек для записи/чтения (а0-а6).
А в другом (16х) - и того меньше (64 ячейки).
Код я ровным не считаю это просто пример.
Будем исправляться.

Добавлено через 11 минут
Буду очень признателен , если укажете , как не писать коряво.
Понимаю , что именно в таких условиях баги лучше всего лезут.
Еще раз спасибо.
0
Evg
Эксперт CАвтор FAQ
19360 / 7209 / 538
Регистрация: 30.03.2009
Сообщений: 20,160
Записей в блоге: 30
07.02.2010, 00:35 4
Alex83, а можешь немного подробнее объяснить суть задачи? Что значит "Программа , должна "сдвигать" данные в один бит(128)"?
1
Alex83
13 / 13 / 1
Регистрация: 06.02.2010
Сообщений: 19
07.02.2010, 03:21  [ТС] 5
Да ,конечно же.
Мне нужен кусок кода, который введеное значение (0<= число <=127) переводит в последовательность бит , его составляющих... НО левый("старший") бит идет первым.
Так , бит за битом переходим к выбору последовательности действий.
если 0 - то одни ;если 1-ца - другие...
Я сделал так:
выполняю логическое "и" по маске 128(извините , если не так выражаюсь)-т.е с 6-м битом(первый ведь 0 ?) -- & -- со значением адреса , которое с каждой итерацией "сдвигается" влево.
Естественно , что если подставленный бит ,в уже смещенном адресе, установлен .... получаем еденицу на опреции сранения...(у меня в ифах) и выполняем соответств. действия.Так и с нулем.

Я понимаю , что можно и проще - например делить 128 на 2 ,пока >1 в каждой итерации и будем получать новую маску.(у меня всего 7 бит надо выделить =7 масок) Тогда адрес не трогаем... опять сравниваем...

Так 7(семь =)) раз - такова специфика задачи (я выше писал про память на 93с46) .
Но , я не могу понять , что не так ! Убейте меня пожалуйста.
Но сперва обьясните. Скомпилим пример товарища выше.... Работает !!!!
меняем размерность адреса (8,7, 6 или5).... Работает !!!! В цикле (просто от 0 до Х) подставляем на вход функции разные адреса..... Работает гадина !!!!
Окей. Ставим кусок в код. Шлем адреса и всё снова так , как было с первых строк этой зпопеи.
Скажите ,пожалуйста , как лучше. "Сдвигать" адрес , маску , как ?
0
Evg
Эксперт CАвтор FAQ
19360 / 7209 / 538
Регистрация: 30.03.2009
Сообщений: 20,160
Записей в блоге: 30
07.02.2010, 11:11 6
Alex83, я правильно понимаю, что функция padla должна распечатать двоичное представление младших 7 бит (начиная со старшего) значения, поданного в качестве параметра addr?

Добавлено через 4 минуты
Если ответ на этот вопрос утвердительный, то тебе надо 128 заменить на 64. Потому как "and 128" - это восьмой бит (если отсчёт начинать с единицы). Поэтому твоя программа печатает не младшие 7 бит, а биты с 2 по 8 (если самый младший считать битом номер один). Поэтому для нечётного числа делается такая же печать, как и для чётного на единицу меньше
1
Alex83
13 / 13 / 1
Регистрация: 06.02.2010
Сообщений: 19
07.02.2010, 13:05  [ТС] 7
Благодарю. Теперь действительно стало понятно.
А то прям мистика =)
0
Alex83
13 / 13 / 1
Регистрация: 06.02.2010
Сообщений: 19
07.02.2010, 14:22  [ТС] 8
А вот чего я добивался ...
Странное поведение (сдвиг)

Спасибо , EVG !
0
Evg
Эксперт CАвтор FAQ
19360 / 7209 / 538
Регистрация: 30.03.2009
Сообщений: 20,160
Записей в блоге: 30
07.02.2010, 14:30 9
Цитата Сообщение от Alex83 Посмотреть сообщение
А вот чего я добивался ...
Круто, правда я ничего в этом не понимаю

Цитата Сообщение от Alex83 Посмотреть сообщение
Спасибо , EVG !
Для тебя эта тема должна быть наглядным примером того, что правильно поставленный вопрос - это половина ответа
1
07.02.2010, 14:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2010, 14:30

Странное поведение транслятора
В следуюшем примере код компилируется нормально, но объект класса b не содается...

Странное поведение программы
Здравствуйте, у меня проблема. В силу какой-то причины результатом вычисления...

Странное поведение программы
Перечитываю Герберт Шилдт: С++ базовый курс. Простая программа: #include...


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

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

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