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

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

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

Сообщение FreshMan »

Tolmi писал(а): в первом случае x-- будет выполнено только если a<=10 и любом b

вот этот момент мне и не понятем
можете разжевать почему именно так а не иначе ?
Tell Me The Truth
Реклама
Аватара пользователя
eess9
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

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

Сообщение eess9 »

народ подскажите плиз!

2 семисегментных индикатора включены каждый на свой 74HC4094. Регистры включены последовательно. Надо вывести двухзначное число data1 (тип int) на индикаторы. Использовал следующий код (data2 тоже int)

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

data2=data1/10;
   inder(data1);
   inder(data1-data2*10);

Но выводится только младший разряд. Причем функция inder() работает корректно. Если, например, написать

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

inder(1);inder(2);

То 12 выдается нормально на индикаторы. в чем я туплю? Ведь если допустим data1=24; то data2=data1/10; даст 24/10=2 (ведь тип то int), а дальше data1-data2*10
- 24-2*10=4. Вроде все корректно.
Реклама
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

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

Сообщение Tolmi »

FreshMan писал(а):вот этот момент мне и не понятем
можете разжевать почему именно так а не иначе ?

Учитесь читать код. Иначе как писать программы, если Вы даже не может их прочесть ?
In theory, theory and practice are the same. In practice, they're not.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

как работает оператор if я знаю......., а вот смысл вышеизложенной команды я толком понять не могу :)
Tolmi писал(а):Учитесь читать код.

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

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

Сообщение Tolmi »

eess9 писал(а):

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

data2=data1/10;
   inder(data1);
   inder(data1-data2*10);


А почему не использовать

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

inder(data/10);
inder(data%10);

Так заработает ? :tea: И симпатичнее...





FreshMan писал(а):как работает оператор if я знаю......., а вот смысл вышеизложенной команды я толком понять не могу :)


А если записать лесенкой, так будет понятнее?

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

if (a>10) 
   {
    if (b<5)
        {
         x++;
    }
}
else
  {
   x--;
};
In theory, theory and practice are the same. In practice, they're not.
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

eess9 писал(а):Надо вывести двухзначное число data1 (тип int) на индикаторы. Использовал следующий код (data2 тоже int)

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

data2=data1/10;
   inder(data1); <<<<<<<<<<< ЕСЛИ data1 ТУТ БОЛЬШЕ 9, ТО ЧТО НА ИНДИКАТОР ВЫВЕДЕТ ФУНКЦИЯ ???? НАВЕРНОЕ data2 ДОЛЖНО БЫТЬ???
   inder(data1-data2*10);
в чем я туплю?
И что вы тупите :)) :)) :)) Внимательнее надо быть.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Уважаемые любители валерьянки, поделитесь ссылочками на сравнение по размеру/качеству/корректности кода различный версий avr-gcc. Может у кого на примете есть какой материал? Порылся в гугле и очень мало чего нашёл толкового. В основном тесты avr-libc, да на форумах по мелочи. Про "не так искал" - вполне допускаю. :) Поэтому и спрашиваю.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

FreshMan, скачайте же Вы, наконец, книгу по Си и почитайте хоть чуть-чуть, Вы половину темы завалили подобными глупыми вопросами. Иначе так и будете всю жизнь учиться...
Столько учиться и задавать вопросы про простейший оператор - :facepalm:

eess9, а для чего эта строка

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

data2=data1/10;
, если Вы data2 даже и не пытаетесь вывести на индикатор ?
Подсчитать 10-тки подсчитали, а выводить их кто будет ? :)
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Аlex писал(а):почитайте хоть чуть-чуть

читал и не единожды !
Аlex писал(а):Иначе так и будете всю жизнь учится...

каждому свое.....
Аlex писал(а):Вы половину темы завалили подобными глупыми вопросами.

спасибо за понимание....., всегда знал что на Вас можна расчитывать в трудную минуту....., больше спрашивать не буду.
Tell Me The Truth
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

А что Вы огорчаетесь ? Вы задали вопрос - Вам ответили, причём нормально... всё разжевали...
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Аlex писал(а):А что Вы огорчаетесь ?

а Вы сами подумайте, на языке Си :wink: , понравится ли Вам когда Вас будут обзывать дураком, в косвенной форме ?
Tell Me The Truth
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

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

Вопрос:main должна быть обязательно в конце?
И главный вопрос на счет char array[512] ; пишет ошибку на счет Hardware Stack has a dangerous low value; -200, мне очень желательно чтобы буфер array был на 512 байт чтобы читать блоками,как настроить?




Спойлер#include <stdio.h>
#include <mega48.h>
#include <delay.h>
#include <string.h>
#include <io.h>

#define data(x) SPDR=x; while (!( SPSR&(1<<7)));

int i,temp;
char array[512] ;




void main() {

DDRB=0b11101111;



// 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;




//настройка SPI
SPCR=0b01010011;
SPSR=1;


//подаем 74 импульса
PORTB.2=1;
delay_ms(10);

for(i=0;i<10;i++)
{

data(0xff)
}
PORTB.2=0;


printf(" ---------- \r\n");

//CMD0


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=%d\n\r",temp,"\r\n");

//CMD1
data(0x41);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while (temp!=0x00)
{data(0xff);
temp= SPDR;
if (i>20)
{data(0x41);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
i=0;
}
i++;
}

printf("CMD1 proshlo uspeshno temp=%d\n\r",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++)
{
printf(" %d",array[i]," ") ;
}
printf("\r\n") ;

printf("CSD 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++)
{
printf(" %d",array[i]," ") ;
}
printf("\r\n") ;

read(2) ;
}






void read(int m) // сколько секторов читаем
{
//CMD17 чтение байтов
data(0x52);
data(0x00);
data(0x03);
data(0xf6);
data(0x00);
data(0x95);
i=0;
while (temp!=0xfe)
{ data(0xff);
temp= SPDR;
}
printf("CMD17 proshlo uspeshno temp=%d\n\r",temp,"\r\n");

for (i=0;i<m;i++) //чтение 512 кб
{
for (i=0;i<512;i++) //чтение 512 кб
{
data(0xff);
array[i]=SPDR ;
}

for (i=0;i<m;i++)
{
if (array[i]!=0x00)
putchar(array[i]) ;
}
}
data(0x4С);
data(0x00);
data(0x03);
data(0xf6);
data(0x00);
data(0x95);
i=0;
}
Вложения
Безымянный.GIF
(51.79 КБ) 295 скачиваний
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

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

Сообщение U235 »

спящий писал(а):главный вопрос на счет char array[512] ; пишет ошибку на счет Hardware Stack has a dangerous low value; -200, мне очень желательно чтобы буфер array был на 512 байт чтобы читать блоками,как настроить?

Никак не настроить - у Вашего МК 512 байт - это вся оперативная память. Вы пытаетесь всю её занять, а ведь нужно ещё место и под стек и под переменные.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

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

тоесть у меня неполучиться сделать буфер на 512 цифр?
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

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

Сообщение Goldsmith »

спящий писал(а):Вопрос:main должна быть обязательно в конце?
Нет.
спящий писал(а):тоесть у меня неполучиться сделать буфер на 512 цифр?
Может получиться, если будете хранить по 2 цифры в байте. При таком объеме оперативной памяти нужно быть экономнее.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

FreshMan писал(а):
Аlex писал(а):А что Вы огорчаетесь ?

а Вы сами подумайте, на языке Си :wink: , понравится ли Вам когда Вас будут обзывать дураком, в косвенной форме ?
Никто Вас дураком не называл, даже в косвенной форме. Я Вас назвал лентяем. И книжек Вы не читали по множеству раз, не врите... всё очевидно...
Мне вообще не понятно, как Вы пишете программы, не зная даже как работает оператор if ... :roll: А в книжки про него можно подробно прочитать, не лазая на форумы.
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

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

Сообщение Cheba »

спящий писал(а):тоесть у меня неполучиться сделать буфер на 512 цифр?

А зачем нужно делать такой огромный буфер? Он вообще нужен?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

я тоже думаю что он такой огромный не нужен.Можно ведь читать именно то, что нужно, а если невозможно добраться сразу до того, что нужно- то можно просто ненужную информацию пропустить.
Видимо на этом говорилGoldsmith
Goldsmith писал(а):Может получиться, если будете хранить по 2 цифры в байте. При таком объеме оперативной памяти нужно быть экономнее.


скажем так можно хранить только 256 байт пусть из первой половины блока потом если нужно то храним из второй половины.А то что не попадает в нужную область памяти можно просто пропускать.
Простите за повторение, просто хотелось чтобы было понятнее.
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

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

Сообщение Cheba »

vitalik_1984 писал(а):скажем так можно хранить только 256 байт пусть из первой половины блока потом если нужно то храним из второй половины.

даже 256 - обычно много. Что там такого ценного, чтобы хранить даже половину блока? Всё равно обрабатываются как правило кусочки совсем небольшой длины. Или там RAR архив на флэшке?
Тогда выбор МК для решения задачи не оправдан.

Да, есть ещё задачи, когда обязательно нужно выбрать из какого-то устройства весь блок в 512 байт, даже если он целиком не нужен. Но для таких целей лучше использовать внешнюю RAM, перелить в неё, а потом уж искать нужное в ней и выбирать для работы в МК.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

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

как найтислово в массиве так,и вывод индекса I ?(слово lol):

for (i=0;(i<200&&(array[i]!='l')&&(array[i+1]!='o')&&(array[i+2]!='l'));i++)
{
}

printf("vivod indeksa lol",i,"\r\n");
Ответить

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