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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Спойлер
blackx писал(а):На форуме 90% новых тем "от начинающих", раздел смысла делать нет.
Прошу прощения, Вы что, их считали?
Хотя бы не пускать в серьезные разделы новичков и разгоряченных малолеток Shift-ящих на всех и вся, если им чей-нибудь ответ не угодил.
Ввести проверку на глупость, например 10 вопросов по теме форума (Например, чтобы активировать возможность писать что-либо в форуме "Микроконтроллеры и ПЛИС", нужно правильно ответить на 10 вопросов по этой теме. Вопросы не сложные, ответы на которые могут формировать основу для начинающего программиста МК и ПЛИС), если не прошел проверку - отправлять в раздел для новичков, а серьезные разделы для них read-only.
Ну или на крайний случай помечать подобную тему особым значком. Мол здесь малыши возятся.

Я вообще забанил бы 0259 на пару деньков. Для профилактики.
Ставим плюсы: )
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

0259 я фигею
тебе дали ссылку http://yandex.ru/yandsearch?clid=9582&t ... D0%B5&lr=2

отркрываем первую попавшуюся
http://www.mir-koda.ru/full_leson_cpp.php?id=4

читаем
Переменная в языке си - это именованная область памяти, в которой содержится определенное значение.

тип имя переменной [= значение];

Рассмотри подробнее каждый элемент синтаксиса переменной:

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

int a,b,c; /* Объявляем три переменные типа int без указания имени */

float d = 2.01, f; /* Одну переменную просто объявляем, а вторую инициализируем значением */
дальше описывается какие бывают типы переменных и многое другое

непонятно? открывай другую ссылку, изучай, потом сформулируй что конкретно тебе непоятно - помогут
а насильно впихивать в твою голову то, что тебе самому лень впихнуть никто не должен

ну а если после всего этого до тебя не дошло - бросай программирование и иди пасти баранов
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

0259 писал(а):Я ПОНЯЛ ХОЧЕШЬ ДОБИТЬСЯ ИЩИ САМ ДОЛЬШЕ БУДИТ НО НАВЕРНЯКА
Можно считать верхом грамотности.

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

      delay_ms(100);
ВОТ И МОЙ КОД БЕЗ ВСЯКИХ ПЕРЕМЕННЫХ
Нет переменных? Вы уверены? Вы знаете, что кроется за этой строчкой?
Все-таки начинайте читать. Учебник русского языка. Программирование оставьте "на потом".
С уважением,
Виктор.
Родился
Аватара пользователя
Сообщения: 11
Зарегистрирован: Вт фев 12, 2013 08:59:56

Сообщение PRTSC »

Помогите, не могу додуматься. Есть код, при нажатии на кнопку начинает мигать светодиод. Как сделать так чтобы при мигающем светодиоде нажать кнопку и тем самым прекратить процесс мигания?

Пытаюсь сделать так не получается:
Спойлер

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

...
if(PINB==0x00){
			PORTC=0х00;
		}
...
Сам код:
Спойлер

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

#include <avr/io.h>
#include <util/delay.h>

int main(void){
	DDRB=0x00;
	PORTB=0xFF;
	DDRC=0xFF;
	PORTC=0x00;
	while(1){
		if(PINB==0xFF){
			PORTC=~PINB;
		}
		else{
			PORTC=0;
			_delay_ms(200);
			PORTC=1;
			_delay_ms(200);
		}
	}
}
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Сообщение Совесть »

Если я я правильно понял вопрос: в вашем коде по умолчанию светодиод горит(потушен), при нажатии на кнопку - мигает. А вы хотите наоборот, по умолчанию мигает, при нажатии горит(потушен). Тогда это будет так:

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

while(1){
      if(PINB!=0xFF){
         PORTC=~PINB;
      }
      else{
         PORTC=0;
         _delay_ms(200);
         PORTC=1;
         _delay_ms(200);
      }
   }
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

а где сказано что в порт С должно выводиться состояние порта B?

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

while(1)
{
	if(PINB==0xFF)
	{
		PORTC=0;
		_delay_ms(200);
		PORTC=1;
		_delay_ms(200);
    }
//else ничего не делать вообще
}
PS. Если нужно сделать наоборот, меняй местами содержимое блоков if и else
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

Я просто в шоке. Честно говоря, я и до встречи этого персонажа был немного в шоке от количества тем вида "Памогите нероботает кодне зопускается атмега хэлп". Все-таки технический форум, программирование, электроника, а тут такое, что кровь из глаз течет. Но он просто меня добил. Какое там программирование микроконтроллеров, там даже до программирования на PHP - как до Пекина раком! Черт, да моя бабушка уже давно бы поняла, как объявлять переменную.

Ну не знаю... Пойду протру стол от крови, которая из ушей и глаз натекла.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

menzoda , вы бы уточняли про какого персонажа говорите, а то тут уже после этого персонажа несколько сообщений появилось.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

vitalik_1984 писал(а): menzoda , вы бы уточняли про какого персонажа говорите, а то тут уже после этого персонажа несколько сообщений появилось.
главный кандидат с четырехзначным ником нольдвапятьдевять
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Нашел транзистор. Понюхал.
Сообщения: 185
Зарегистрирован: Вс ноя 06, 2011 20:47:11

Сообщение Staska »

Помогите советом/покритикуйте такой вариант хранения многоязычного календаря в Си, в для атмеги.

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

uint8_t *Weekdays[3][8] ={
		{(uint8_t*)1,
		(uint8_t*)Monday,	
		(uint8_t*)Tuesday,	
		(uint8_t*)Wednesday,	
		(uint8_t*)Thursday,	
		(uint8_t*)Friday,	
		(uint8_t*)Saturday,
		(uint8_t*)Sunday},
		
		{
		(uint8_t*)1,
		(uint8_t*)MondayP,	
		(uint8_t*)TuesdayP,	
		(uint8_t*)WednesdayP,	
		(uint8_t*)ThursdayP,	
		(uint8_t*)FridayP,	
		(uint8_t*)SaturdayP,
		(uint8_t*)SundayP
		},
		
		{
		(uint8_t*)1,
		(uint8_t*)MondayL,	
		(uint8_t*)TuesdayL,	
		(uint8_t*)WednesdayL,	
		(uint8_t*)ThursdayL,	
		(uint8_t*)FridayL,	
		(uint8_t*)SaturdayL,
		(uint8_t*)SundayL
		}
		
		};

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

//Weekdays
const uint8_t Monday[] PROGMEM="Mon";  итд..
В программе храню только ссылку на:

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

(uint8_t*)&Weekdays
, первый элемент - текущий день недели. Сдвиг адреса на 1 и текущий день - текст дня недели. Умнжение адреса на 8*переменная языка - текст в другом языке..

Имхо работает, но хочется как боле читабельно.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Так вы уже создали фактически тип данных Weekdays, создайте еще и тип Week, тогда можно создать массив из недель и указатель уже на этот тип данных делать.
Последний раз редактировалось vitalik_1984 Пт фев 15, 2013 18:12:43, всего редактировалось 1 раз.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 185
Зарегистрирован: Вс ноя 06, 2011 20:47:11

Сообщение Staska »

vitalik_1984 писал(а):Так вы уже создали тип данных Weekdays, создайте еще и тип Week, тогда можно создать массив из и указатель уже на этот тип данных делать.
Но это не красиво... Хочется подобия: http://easyelectronics.ru/organizaciya- ... menyu.html
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Ваша организация меню как-то не похожа на то, что вы хотите получить.
Что некрасивого в структуре?
Менюшка менюшкой, а язык языком. Язык это смещение к нулевому элементу перечисления адресов для строк пункта меню.
А структура создается для более удобного смещения.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

более читабельно - разные структуры(можно и массивы) для каждого языка

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

typedef struct WeekDays
{
	char *Rus[] = {"Понедельник", "Вторник", "Среда", ... };
	char *Eng[] = {"Monday", "Tuesday", ...};
	char *Deu[] = {"Monntag", "Dienstag", ...};
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Это то же самое, что и в первоначальном варианте.
Нужно разделить дни разных языков,

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

 typedef struct WeekDays ={
      {(uint8_t*)Today, // это спорный  элемент, как его вообще можно было дать ему имя 1?
 //и как им пользоваться, если он во флеш?
//при смене языка будет всегда меняться на понедельник?
      (uint8_t*) Monday,   
      (uint8_t*)Tuesday,   
      (uint8_t*)Wednesday,   
      (uint8_t*)Thursday,   
      (uint8_t*)Friday,
      (uint8_t*)Saturday,
      (uint8_t*)Sunday,
} 

WeekDays *weekday[3] PROGMEM = { English,Deutsche, Spainish}

display= *weekday[current_lang];

ну или как там правильно нужно
использовать сейчас негде пока посмотреть, а как точно я не знаю.
Можно и макрос оформить, как в ссылке.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

ИМХО проще обратиться

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

myDay = Weekdays.Rus[1]
чем помнить порядковый номер каждого языка и выискивать нужный день в многомерном массиве
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Порядковый номер языка помнить не придется, если заблаговременно создать соответствующее перечисление (enum). "Магические" константы вообще отнюдь не украшают программу, а перечисление легко расширяется при необходимости добавления новых языков.

Если инкапсулировать словарь в отдельном модуле, достаточно реализовать в этом модуле свойство (вроде CurrentLanguage), устанавливать его при инициализации программы и дальше вообще не заморачиваться языковыми проблемами (ну или переключать по ходу выполнения программы, если вдруг реально потребуется смена языка "на ходу").
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Goldsmith :beer: , и я о том же
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 185
Зарегистрирован: Вс ноя 06, 2011 20:47:11

Сообщение Staska »

Goldsmith писал(а):Порядковый номер языка помнить не придется, если заблаговременно создать соответствующее перечисление (enum). "Магические" константы вообще отнюдь не украшают программу, а перечисление легко расширяется при необходимости добавления новых языков.

Если инкапсулировать словарь в отдельном модуле, достаточно реализовать в этом модуле свойство (вроде CurrentLanguage), устанавливать его при инициализации программы и дальше вообще не заморачиваться языковыми проблемами (ну или переключать по ходу выполнения программы, если вдруг реально потребуется смена языка "на ходу").
Спасибо. У меня в принципе так и реализовано.

Плюс - каждый пункт меню имеет указатель на переменную и знает тип переменной для манипуляции с оной (как читать, изменит, отобразит итд..)

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

enum {
    STATIC_TEXT,
VARIABLE_TEXT,
    EPPROM,
    UNSIGNEDNUMBER,
    SIGNEDNUMBER,
ARRAYOFSTRINGS,
EPPROMARRAYOFSTRINGS,
};


Для удобства.

Дни недели - ARRAYOFSTRINGS, в раме держу саму переменную дня недели и указатели на тектст во флеш памяти. Но хочется держать только указатель на переменную, а дни недели во флеше. Да и боле читабельно сделать, а не через двухмерный массив.
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

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

- typedef enum Language ... - собственно тип для выбора языка;
- typedef enum DayOfWeek ... - тип для дней недели;
- void setCurrentLanguage(Language l) / Language getCurrentLanguage(void) - пара мутатор/аксессор для установки и определения свойства текущего языка;
- const char *DayOfWeekToString(DayOfWeek dw) - получить текстовое представление данного дня недели (для текущего языка).

IMHO программа должна достаточно легко читаться, если клиент будет взаимодействовать с модулем календаря только через этот интерфейс (само собой, подправить в случае хранения строк во FLASH/EPROM).
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Ответить

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