Страница 1 из 4

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

Добавлено: Пт мар 28, 2014 13:21:27
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 строкой вида "АБВГДЖЗ ") , Толи я уж теряюсь....

пробовал оптимизатор выкл/вкл, не то

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

Добавлено: Пт мар 28, 2014 13:45:06
BCluster
Строка это const char*, у вас аргумент char*, возможно дело в этом. Компилятор какой?
попробуйте так

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

void getChar(const char *a)

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

Добавлено: Пт мар 28, 2014 13:51:38
jazz393
atmel studio 6 ,
GCC avr там вроде

const char* тоже не принёс результатов

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

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

P.C. Напрограммируются на всяком строго нетипизированном говне типа JavaScript, где мозг включать не надо, а потом обижаются, что в нормальных языках ничего не работает.

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

Добавлено: Пт мар 28, 2014 17:26:21
BCluster
У него функция принимает char* а не char, причем тут 1 байт?
ИС-пытатель писал(а): строго нетипизированном говне
это как? :) :facepalm:

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

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

А про нетипизированные, это когда нет типов переменных. Тупо пишешь a = 10 - и компилятор понимает. пишешь b = "АБВ" и компилятор тоже понимает. а потом пишешь с = a + b... И компилятор, сцуко, тоже понимает как это обработать...

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

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

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

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

char * str = "АБЫРВАЛГ  ";
getChar(str);

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

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

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

Динамическая типизация - немного другое. А вот JavaScript, например, нетипизированный. потому что вы можете одной и той же переменной присвоить абсолютно любое значение и компилятор Вас не обматерит.

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

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

в таблицу с кодировкой символов я добавляю скажем case 's':PORTA=0x08; - и при вызове getChar(" s ") диод привязанный к 4 порту А горит, т.е. всё тоже самое с латиницей работает... проблема о всей видимости в кодировке в самой atmel studio , хотя не нашёл там в настойках где её менять...=((

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

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

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

char * str = "АБЫРВАЛГ  ";
getChar(str);
но что это поменяет, я не знаю

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

Добавлено: Пт мар 28, 2014 18:41:14
ИС-пытатель
СИ++ слабо типизированный.

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

Добавлено: Пт мар 28, 2014 18:45:52
BCluster
jazz393 писал(а):в таблицу с кодировкой символов я добавляю скажем case 's':PORTA=0x08; - и при вызове getChar(" s ") диод привязанный к 4 порту А горит
у меня была такая мысля, кодвижн таким страдает, gcc не слышал чтобы. Но видимо все-таки дело в этом.

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

Добавлено: Пт мар 28, 2014 18:46:28
ИС-пытатель
я выше написал ему, попробовать так сделать

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

char * str = "АБЫРВАЛГ  ";
getChar(str);
но что это поменяет, я не знаю
Еще раз говорю, в таком случае, Вы передадите адрес на массив. А в его случае он передает значение. А функция думает, что это адрес. Или же пусть попробует в объявлении функции указать
void GetChar (char *a[]) или (char a[]). Лишь бы компилятор не заругался на отсутствие размера массива.. Все-таки не PC..
может, так прокатит, если вы говорите, что стандартные функции понимают, когда им так запихиваешь значение.

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

Добавлено: Пт мар 28, 2014 18:49:22
ИС-пытатель
BCluster, Вы ссылаетесь на википедию, а я ссылаюсь на литературу, которую читал по JavaScript, в которой написано именно так, как говорю сейчас я. Поскольку однозначного определения нет данного понятия, то и Ваше мнение, и мое, и Википедии - всего лишь точки зрения.

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

Добавлено: Пт мар 28, 2014 18:52:10
BCluster
http://anpaza.livejournal.com/16361.html
тут про кодировки, в ключах компилятора ставится. Почитай, может поможет

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

Добавлено: Пт мар 28, 2014 18:53:07
ИС-пытатель
Вся проблема, что значение 'АБВ ' никакой переменной не присвоено. И компиль думает, что это просто числовая константа. Вот и пихает ее в функцию. А если присвоите переменной - то это будет уже адрес

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

Добавлено: Пт мар 28, 2014 19:01:36
BCluster
1231231.png
(21.7 КБ) 738 скачиваний
ИС-пытатель писал(а):void GetChar (char *a[])
массив указателей зачем? Вы вообще понимаете о чем говорите?
Еще раз говорю, в таком случае, Вы передадите адрес на массив. А в его случае он передает значение.
неправда. Прямо сейчас попробовал сделать...
Изображение
ИС-пытатель писал(а):может, так прокатит, если вы говорите, что стандартные функции понимают, когда им так запихиваешь значение.
у стандартных функций аргумент char*

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

Добавлено: Пт мар 28, 2014 19:23:35
ИС-пытатель
Вот теперь верю. )
А что у Вас за ассемблер такой интересный? ) и что за среда разработки?

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

Добавлено: Пт мар 28, 2014 20:36:36
BCluster
Это IAR
,ассемблер thumb2 вроде. Cortex M4F, с АВР давно не работаю, но думаю, тоже самое и там )
Тем более товарищ написал что проблемы именно с кириллицей

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

Добавлено: Пт мар 28, 2014 20:42:24
ИС-пытатель
То-то я смотрю, команды другие... Желательно бы проверить все-таки для АВР... Арм -уровень другой.