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

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

Восстановить пароль Регистрация
 
Alex83
 Аватар для Alex83
13 / 13 / 0
Регистрация: 06.02.2010
Сообщений: 19
06.02.2010, 15:29     Странное поведение (сдвиг) #1
Здравствуйте.Прошу помочь с задачкой.
Программа , должна "сдвигать" данные в один бит(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(); // просто роняем шину и выходим...
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2010, 15:29     Странное поведение (сдвиг)
Посмотрите здесь:

C++ Странное поведение транслятора
C++ Странное поведение
C++ Странное поведение getline
Странное поведение wstring C++
странное поведение указателя C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
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 ?
Alex83
 Аватар для Alex83
13 / 13 / 0
Регистрация: 06.02.2010
Сообщений: 19
06.02.2010, 19:30  [ТС]     Странное поведение (сдвиг) #3
Тут всё дело в том , что адрес ,который передается в последовательном виде таким вот смещением - это семь(7)бит.Именно задом на перед.Ошибки там нет , и не спорю , в байте 8 бит (0-7).
Просто микросхема предоставляет в том режиме 128 ячеек для записи/чтения (а0-а6).
А в другом (16х) - и того меньше (64 ячейки).
Код я ровным не считаю это просто пример.
Будем исправляться.

Добавлено через 11 минут
Буду очень признателен , если укажете , как не писать коряво.
Понимаю , что именно в таких условиях баги лучше всего лезут.
Еще раз спасибо.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16822 / 5243 / 318
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
07.02.2010, 00:35     Странное поведение (сдвиг) #4
Alex83, а можешь немного подробнее объяснить суть задачи? Что значит "Программа , должна "сдвигать" данные в один бит(128)"?
Alex83
 Аватар для Alex83
13 / 13 / 0
Регистрация: 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 до Х) подставляем на вход функции разные адреса..... Работает гадина !!!!
Окей. Ставим кусок в код. Шлем адреса и всё снова так , как было с первых строк этой зпопеи.
Скажите ,пожалуйста , как лучше. "Сдвигать" адрес , маску , как ?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16822 / 5243 / 318
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
07.02.2010, 11:11     Странное поведение (сдвиг) #6
Alex83, я правильно понимаю, что функция padla должна распечатать двоичное представление младших 7 бит (начиная со старшего) значения, поданного в качестве параметра addr?

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

Странное поведение new C++
Странное поведение присваивания C++
C++ Странное поведение программы

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16822 / 5243 / 318
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
07.02.2010, 14:30     Странное поведение (сдвиг) #9
Цитата Сообщение от Alex83 Посмотреть сообщение
А вот чего я добивался ...
Круто, правда я ничего в этом не понимаю

Цитата Сообщение от Alex83 Посмотреть сообщение
Спасибо , EVG !
Для тебя эта тема должна быть наглядным примером того, что правильно поставленный вопрос - это половина ответа
Yandex
Объявления
07.02.2010, 14:30     Странное поведение (сдвиг)
Ответ Создать тему
Опции темы

Текущее время: 18:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru