непонимаю в чем проблема - перевод символов

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 118
Зарегистрирован: Ср фев 05, 2014 18:54:39

Сообщение jazz393 »

здравствуйте
есть такой код для перевода символов для ЖКИ, если подставлять его тупо в массив то всё ок работает, но это неудобно, поэтому написал пару функций:
Спойлер

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

unsigned char alf(char a)
{
	switch (a)
	{
		case 'А': return 0x41; case 'а': return 0x61; break;
		case 'Б': return 0xA0;case 'б': return 0xB2; break;
//пропускаю таблицу дабы сэкономить место
		case ' ': return 0x20; case ',': return 0x2C; break;
	}
}
есть такая функция для ввода в глобальный массив S:
Спойлер

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

void getChar(char *a)
{
	for (i=0;i<21;i++)
	{
	S[i]=alf(a[i]);
		if (a[i]=='А')    // сравниваю тупо вручную русский симол А с массивом
		PORTA=0x10;  // 
	}
i=0;
}
сам вызов функции:

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

getChar("АБВГДЖЗ        ");
вообще эффекта ноль, толи оишбка в том что не получается инициализировать char* a строкой вида "АБВГДЖЗ ") , Толи я уж теряюсь....

пробовал оптимизатор выкл/вкл, не то
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Строка это const char*, у вас аргумент char*, возможно дело в этом. Компилятор какой?
попробуйте так

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

void getChar(const char *a)
Контактная информация:
Реклама
Встал на лапы
Сообщения: 118
Зарегистрирован: Ср фев 05, 2014 18:54:39

Сообщение jazz393 »

atmel studio 6 ,
GCC avr там вроде

const char* тоже не принёс результатов
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

CHAR- это размер переменной. 1 байт в твоем случае. Ты передаешь в функцию значение "АБВ ". В шестнадцатиричном виде это выглядит как набор байтов. Поскольку у тебя размер CHAR, то у тебя функция тупо берет последний (младший) байт. Т.е. пробел и что-то с ним делает.
Если ты хочешь работать со строкой, значит объяви ее как массив где-либо в памяти. А в свою функцию передавай указатель на этот массив. В функции можешь реализовать операции с массивом, его модификацию и т.д. А возвращать из нее также либо указатель на этот модифицированный массив, либо на вновь созданный в ходе перевода.

P.C. Напрограммируются на всяком строго нетипизированном говне типа JavaScript, где мозг включать не надо, а потом обижаются, что в нормальных языках ничего не работает.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

У него функция принимает char* а не char, причем тут 1 байт?
ИС-пытатель писал(а): строго нетипизированном говне
это как? :) :facepalm:
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

А.. Прошу прощения. Бегло просмотрел. Все равно ошибка. Должен функции передавать адрес на строку (то бишь указатель на массив), а передает значение. Вот у него и не робит ничего. Плюс, где разыименование указателя в функции? и все равно функция берет последние 2 байта из переданного ей значения.

А про нетипизированные, это когда нет типов переменных. Тупо пишешь a = 10 - и компилятор понимает. пишешь b = "АБВ" и компилятор тоже понимает. а потом пишешь с = a + b... И компилятор, сцуко, тоже понимает как это обработать...
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Бывает сильная типизация и слабая.
Си - язык с со слабой типизацией, кстати...
То что написали вы, называется динамической типизацией, которая, например в питоне, является сильной. Одно другому не мешает.
Ладно тема не об этом :)
Плюс, где разыименовывание указателя в функции?
он берет по индексу значение
ИС-пытатель писал(а):а передает значение
стандартная функция sprintf() принимает в качестве аргумента char*, и вполне понимает когда ей передают строку.

ТС, попробуй для эксперимента так:

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

char * str = "АБЫРВАЛГ  ";
getChar(str);
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Я сейчас не говорю про стандартные функции (и не факт, что они в АВР работают так, как Вы говорите). Я сейчас говорю про этот код. Чтобы у него заработало, он должен передать не значение, а адрес. т.е. создать массив символов и в функцию уже передать имя массива
. И в самой функции обращаться как к разыменованной переменной. А он обращается напрямую (т.е. к адресу). То есть надо сделать так, как Вы сказали выше.

+ Не факт, что если в СИ для PC массив - это адрес первого значения (т.е. по сути, указатель), то и здесь также. Если после Вашего объявления не заработает, то можно попробовать пользовать переменную не так a, а вот так: (*a+i)

Динамическая типизация - немного другое. А вот JavaScript, например, нетипизированный. потому что вы можете одной и той же переменной присвоить абсолютно любое значение и компилятор Вас не обматерит.
Последний раз редактировалось ИС-пытатель Пт мар 28, 2014 18:38:43, всего редактировалось 1 раз.
Встал на лапы
Сообщения: 118
Зарегистрирован: Ср фев 05, 2014 18:54:39

Сообщение jazz393 »

ИС-пытатель писал(а):А.. Прошу прощения. Бегло просмотрел. Все равно ошибка. Должен функции передавать адрес на строку (то бишь указатель на массив), а передает значение. Вот у него и не робит ничего. Плюс, где разыименование указателя в функции? и все равно функция берет последние 2 байта из переданного ей значения.
А про нетипизированные, это когда нет типов переменных. Тупо пишешь a = 10 - и компилятор понимает. пишешь b = "АБВ" и компилятор тоже понимает. а потом пишешь с = a + b... И компилятор, сцуко, тоже понимает как это обработать...
обычно пишу на нетипизированном как вы выразились ... - С++ =))
В функцию я передаю указатель, вызываю по индексу, что собственно равноценно

в таблицу с кодировкой символов я добавляю скажем case 's':PORTA=0x08; - и при вызове getChar(" s ") диод привязанный к 4 порту А горит, т.е. всё тоже самое с латиницей работает... проблема о всей видимости в кодировке в самой atmel studio , хотя не нашёл там в настойках где её менять...=((
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

ИС-пытатель писал(а):не факт, что они в АВР работают так, как Вы говорите
факт
ИС-пытатель писал(а):А он обращается напрямую (т.е. к адресу).
покажите мне, пожалуйста, где он обращается К АДРЕСУ?
ИС-пытатель писал(а):Динамическая типизация - немного другое. А вот JavaScript, например, нетипизированный.
http://ru.wikipedia.org/wiki/%D0%94%D0% ... 0%B8%D1%8F
т.е. создать массив символов и в функцию уже передать имя массива
я выше написал ему, попробовать так сделать

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

char * str = "АБЫРВАЛГ  ";
getChar(str);
но что это поменяет, я не знаю
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

СИ++ слабо типизированный.
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

jazz393 писал(а):в таблицу с кодировкой символов я добавляю скажем case 's':PORTA=0x08; - и при вызове getChar(" s ") диод привязанный к 4 порту А горит
у меня была такая мысля, кодвижн таким страдает, gcc не слышал чтобы. Но видимо все-таки дело в этом.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

я выше написал ему, попробовать так сделать

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

char * str = "АБЫРВАЛГ  ";
getChar(str);
но что это поменяет, я не знаю
Еще раз говорю, в таком случае, Вы передадите адрес на массив. А в его случае он передает значение. А функция думает, что это адрес. Или же пусть попробует в объявлении функции указать
void GetChar (char *a[]) или (char a[]). Лишь бы компилятор не заругался на отсутствие размера массива.. Все-таки не PC..
может, так прокатит, если вы говорите, что стандартные функции понимают, когда им так запихиваешь значение.
Последний раз редактировалось ИС-пытатель Пт мар 28, 2014 18:50:35, всего редактировалось 1 раз.
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

BCluster, Вы ссылаетесь на википедию, а я ссылаюсь на литературу, которую читал по JavaScript, в которой написано именно так, как говорю сейчас я. Поскольку однозначного определения нет данного понятия, то и Ваше мнение, и мое, и Википедии - всего лишь точки зрения.
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

http://anpaza.livejournal.com/16361.html
тут про кодировки, в ключах компилятора ставится. Почитай, может поможет
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Вся проблема, что значение 'АБВ ' никакой переменной не присвоено. И компиль думает, что это просто числовая константа. Вот и пихает ее в функцию. А если присвоите переменной - то это будет уже адрес
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

1231231.png
(21.7 КБ) 738 скачиваний
ИС-пытатель писал(а):void GetChar (char *a[])
массив указателей зачем? Вы вообще понимаете о чем говорите?
Еще раз говорю, в таком случае, Вы передадите адрес на массив. А в его случае он передает значение.
неправда. Прямо сейчас попробовал сделать...
Изображение
ИС-пытатель писал(а):может, так прокатит, если вы говорите, что стандартные функции понимают, когда им так запихиваешь значение.
у стандартных функций аргумент char*
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Вот теперь верю. )
А что у Вас за ассемблер такой интересный? ) и что за среда разработки?
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Это IAR
,ассемблер thumb2 вроде. Cortex M4F, с АВР давно не работаю, но думаю, тоже самое и там )
Тем более товарищ написал что проблемы именно с кириллицей
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

То-то я смотрю, команды другие... Желательно бы проверить все-таки для АВР... Арм -уровень другой.
Ответить

Вернуться в «AVR»