Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Tolmi »

спящий писал(а):подскажите как

printf("CMD1 proshlo uspeshno ",temp,"\r\n");
и
putchar(array[i]);


чтобы temp,array передавалось в виде числа

имеется в виду

printf("CMD1 proshlo uspeshno %d\r\n",temp);

или что?

Ну, и соответственно puts(itoa(array[i]));
In theory, theory and practice are the same. In practice, they're not.
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

чтобы temp,array передавалось в виде числа а не в ACSS коде,

Зачем вам это нужно? Если хотите, чтобы просто число вытащите его из функции printf ведь она именно этим и занимается- создает ASCII коды.
Сразу число можно отправить так

Код: Выделить всё


putchar
(temp);
 

Вообще уточняйте цель исследования, чтобы вам могли что нибудь дельное посоветовать, а то так только голову ломать зачем вам это нужно.
Реклама
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

Сейчас попробую обьяснить,я работаю с MMC картой памяти, пытаюсь привести к такому виду:

CMD0 proshlo uspeshno 01 -чтобы так выдавал,число это ответ с карты MMC
CMD0 proshlo uspeshno 00
CID chitaet 23123324

а у меня получается как на картинке,число невыдает(может быть надо +30?)

Спойлерdata(0x40);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);


while (temp!=0x01)
{
data(0xff);
temp= SPDR;
if (i>10)
{data(0x40);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
i=0;
}
i++;

}
printf("CMD0 proshlo uspeshno ",temp,"\r\n");




Спойлерdelay_ms(20);
printf("CID chitaet \r\n");
//CID ðåãèñòð ÷òåíèå áàéòîâ
data(0x4A);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
for (i=0;i<16;i++)
{
data(0xff);
array[i]=SPDR ;
}

for (i=0;i<16;i++)
{
putchar(array[i]);
}
Вложения
Безымянный.GIF
(40.4 КБ) 259 скачиваний
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Tolmi »

спящий, при выводе число сначала надо преобразовать в последовательность символов. Посмотрите тогда, что я перед этим ответил, это то, что Вам нужно.
In theory, theory and practice are the same. In practice, they're not.
Реклама
Эиком - электронные компоненты и радиодетали
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Вопросы по С/С++ (СИ)

Сообщение спящий »

проблема в том что что huper terminal,кодевисион работают только в ACSS или hex(16ричной) выдаю на экран.Тоесть сило 01в ACSS невыдает число а просто пробел,вот мне нужно чтобы переменная в которой записываю просто число выдавала в ACSS это число.
Реклама
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Tolmi »

спящий писал(а):проблема в том что что huper terminal,кодевисион работают только в ACSS или hex(16ричной) выдаю на экран.Тоесть сило 01в ACSS невыдает число а просто пробел,вот мне нужно чтобы переменная в которой записываю просто число выдавала в ACSS это число.

:facepalm:
За безумным количеством ошибок просто теряется смысл вопроса. Ещё раз, число на экране ( в окне hyperterminal в том числе) - это последовательность символов(байт, с определённым кодом ASCII), и этих символов может быть от одного до бесконечности. Для того, чтобы преобразовать байт 0xFF в памяти (регистре, переменной) в эту последовательность символов (три символа, '2','5',5' в десятичном виде, или два 'F','F' в шестнадцатиричном) , нужна специальная процедура. Или нужно использовать printf со специальными метасимволами форматирования, например printf("Value=%d\n\r",value);
либо преобразовать число в строку и потом вывести строку, к примеру puts(itoa(value,&buf,10)) сохраняет полученную строку в буфер ( предварительно подготовленный и достаточной длины) в десятичном представлении и выводит её через puts.
In theory, theory and practice are the same. In practice, they're not.
Реклама
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

Всем привет
понадобилась функция int2hex. откопал в своих старых записях 6 строчек кода. вопрос : Почему первый код исправно работает, а второй выдаёт неведомую .. херню ?

Код: Выделить всё

    static const char* hex_digits="0123456789ABCDEF";
    unsigned int b = 0xAB;
    unsigned char c[3];
    c[2] ='\0';
    c[0] = hex_digits[b >> 4];
    c[1] = hex_digits[b & 0x0F];


Код: Выделить всё

    static const char* hex_digits="0123456789ABCDEF";
    unsigned int b = 0xABCD;
    unsigned char c[5];
    c[4] ='\0';

    c[0] = hex_digits[b >> 12];
    c[1] = hex_digits[b >> 8];
    c[2] = hex_digits[b >> 4];
    c[3] = hex_digits[b & 0x000F];

вывод в консоль писал(а):43981 = A,�,,D

Я уже всю голову себе сломал.
кстати, есть ли в с++ стандартный способ преобразования представлений (int2hex, int2str, hex2str, str2hex и т.д.) ?
наверняка кто-то предложит itoa, sprintf или stringstream.. что из них ест меньше памяти при многократном вызове ? код будет использоваться под андроидом, а там с памятью печально.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: Вопросы по С/С++ (СИ)

Сообщение Rusja2008 »

А почему Вы "обрезаете" адрес (& 0x000F) только последнего элемента в массива с[3]?
Ограничте каждый:

Код: Выделить всё

    static const char* hex_digits="0123456789ABCDEF";
    unsigned int b = 0xABCD;
    unsigned char c[5];
    c[4] ='\0';

    c[0] = hex_digits[(b >> 12) & 0xF];
    c[1] = hex_digits[(b >> 8) & 0xF];
    c[2] = hex_digits[(b >> 4) & 0xF];
    c[3] = hex_digits[b  & 0xF];
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

а смысл ? хмм.. сработало. демон ! как ты это делаешь ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

А если почему не воспользоваться стандартной возможностью printf непосредственно выводить число в HEX-формате?

Код: Выделить всё

printf("Число %03dD и %02XH\n\r",25,25);
С уважением,
Виктор.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

потому что.. мне надо выводить в строку. а тут поможет sprintf , но у мне не хочется его использовать (если мне не изменяет память, то функция обьявлена как inline со всеми вытекающими).

кстати, может кому понадобится форматированный вывод в c++

Код: Выделить всё

    cout.setf(ios_base::hex,ios_base::basefield);
    cout.setf(ios_base::showbase);
    cout.width(6);
    cout.fill('0');
    cout << 347 << endl;
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Та ну, так выписывать — рехнуться можно лучше уж printf.
Надо так:

Код: Выделить всё

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
        cout << hex << showbase << setw(6) <<  347 << setw(10) << dec << 347 << endl;
}
 

Manipulators внизу странички
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

на самом деле нет. если вам надо вывести единовременно что-то в хексе, то да такой способ

Код: Выделить всё

cout << hex << showbase << setw(6) <<  347 << setw(10) << dec << 347 << endl;


подойдет. в общем под разные задачи и разная запись. кому как удобнее
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Почему «единовременно»? Поясните.
Манипуляторы делают то же самое, что и вызовы методов, они просто inline превращаются в вызовы методов.
Т.е. запись

Код: Выделить всё

cout << hex << 20;
абсолютно эквивалентна

Код: Выделить всё

cout.setf(ios_base::hex, ios_base::basefield);
cout << 20;
и с остальными то же самое.

p.s. Исправил ошибку -- «абсолютно эквивалентна» не cout.setf(ios_base::hex), как в начале написал, а так, как теперь. Эта разница несущественна, если использовать только манипуляторы hex, dec, oct, но существенно, если делать микс из манипуляторов и вызовов методов setf/unsetf.
Последний раз редактировалось avreal Пн окт 01, 2012 15:16:54, всего редактировалось 1 раз.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

ладно я не спорю.. хотя.. привидите свой вариант записи cout.unsetf(ios_base::dec) мне просто интересно
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Вот чего не использовал, так это unsetf(dec)... Конечно, если постараться, я могу придумать ситуацию, когда оно нужно.
Но мне проще при необходимости явно послать нужную базу (dec, hex, oct), чем setf(dec), вывод, unsetf(dec).

Тем, что есть, unsetf(dec) не сделать, так как посылка cout << dec эквивалентна
setf(ios_base::dec, ios_base::basefield). Т.е. после этого уже нет смысла в unsetf.

Но если вместо посылки dec посілать самописный нижеприведенный setdec, то всё нормально :-)

Код: Выделить всё

inline ios_base& setdec(ios_base& __base)
{
        __base.setf(ios_base::dec);
        return __base;
}

inline ios_base& unsetdec(ios_base& __base)
{
        __base.unsetf(ios_base::dec);
        return __base;
}

    cout << hex << 0xDE << " send setdec " << setdec << 0xDE << " send unsetdec " << unsetdec << 0xDE << endl; 
Просто это дело сразу имеет operator << и operator >> для функций, принимающих и возвращающих базу io. Работа операторов состоит в вызове данной функции применительно к потоку, в которую её «вывели» (или из которого её «ввели»).
Через эти операторы работает часть манипуляторов и можна написать свои как указано выше.

p.s. а всякие showbase/showpoint сразу имеют парные noshowbase/noshowpoint
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Кислый писал(а):а смысл ? хмм.. сработало. демон ! как ты это делаешь ?

Так это же арифметика если большое число сдвинуть на четыре право то получится большое число, но на одну тетраду короче.А вам нужно было маленькое число, таким образом как вам показали получается избавились от большого числа и получили маленькое.А в вашем случае получились два символа правильно, так как а последнем младшем символе вы избавились от большого числа, в первом же просто случайно полученное число оказалось подходящим к вашей таблице, так как при сдвиге в число с другой стороны задвигаются нули.
А со средними все понятно, они просто обрезались до нужного размера и опять же от начала массива отступилось необходимое количество символов.Что там было, то и было показано.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

довольно часто встречаю следующие формы записи:

Код: Выделить всё

1) if (a>10) {if (b<5) {x++;}} else {x--;};

2) if ((a>10)&&(b<5)) {x++;} else {x--;};


взаимозаменяемые ли данные строки ? если нет, то в чем разница ?
Tell Me The Truth
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Tolmi »

FreshMan писал(а):

Код: Выделить всё

1) if (a>10) {if (b<5) {x++;}} else {x--;};

2) if ((a>10)&&(b<5)) {x++;} else {x--;};


взаимозаменяемые ли данные строки ? если нет, то в чем разница ?

Нет, в первом случае x-- будет выполнено только если a<=10 и любом b, а во втором - если a<=10 и любом b ИЛИ если b>=5 и любом a
In theory, theory and practice are the same. In practice, they're not.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Ну а проанализировать код? Там же всего четыре варианта:

Код: Выделить всё

a>10    b<5      1)        2)

false   false    x--       x--
false   true     x--       x--
true    false    ничего    x--
true    true     x++       x++
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Ответить

Вернуться в «Разные вопросы по МК»