Страница 2 из 3
Добавлено: Ср дек 24, 2008 16:27:24
IfoR
Symbiosis писал(а):А вот как заменить выражение для цикла for, чтобы не до 999, а до бесконечности ?
Ну так:
Либо так:
А зачем?
Ну, а для конвертирования должны быть хедеры с этими функциями в комплекте с компилятором. Ну а там уж какие есть.

Ну itoa() например.
Добавлено: Ср дек 24, 2008 16:38:50
Symbiosis
А вот я делал так
но у меня ничо неработало.
Ну собственно я думал что лепить кучу девяток как-то через чур по профански )
где то я уже слышал/видел itoa() и iloa() кажется, буду разбираться )
Добавлено: Ср дек 24, 2008 20:01:49
Yellow Tiger
Symbiosis писал(а):на int arr[ARRAY_LEN][3]; cavr ругается, что мол the programm has no 'main' function . и need array size . (((
Это не на массив компилятор ругается, а именно на отсутствие функции main - или её действительно нет, или из-за предыдущих ошибок он её "не видит". И need array size тоже следует понимать буквально - я же многоточие поставил лишь чтобы место для длины массива обозначить, а не как языковую конструкцию.
Symbiosis писал(а):надо уже конвертировать число в строку и выводить по частям. Только как это делается ума не приложу (((
В твоем случае, я думаю, нужно возложить эту задачу на библиотечную функцию sprintf, хоть она и потребует места в памяти программ, но тебе сейчас так проще будет.
А вообще - было бы проще отвечать, если бы было видно, что ты там такое наваял, что компилятор главной функции не видит и цикла while не исполняет.

Добавлено: Ср дек 24, 2008 22:19:58
Aheir
Ну тут можно по-разному извращаться. Например, что-то вроде:
Код: Выделить всё
if (massiv[i][0] > 9)
{
putchar (massiv[i][0]/10+0x30); putchar (massiv[i][0]%10+0x30);
}
else putchar (massiv[i][0]+0x30);
Ну и для трехзначных можно по аналогии.
Кстати, циклы выше ограничены по числу исполнений разрядностью переменной i, т.е. 65535, если оно инт беззнаковый.
Истинно бесконечные циклы while(1) и for ( ;; ).
Так что надо i обнулять где-то ну и вообще следить за ней

Добавлено: Ср дек 24, 2008 23:02:29
Yellow Tiger
Такой пример:
Код: Выделить всё
//+++ test USART + sprintf
#define NUMPOINTS 5
int i;
unsigned char buf[20];
unsigned char arr[NUMPOINTS][3] =
{
{1,3,5},
{7,11,13},
{17,19,23},
{27,29,31},
{37,41,43}
};
//---
int main( void )
{
...
while (1)
{
if (SER1CharsPresent())
{
switch (c = SER1Getc())
{
case 't':
for (i=0; i<NUMPOINTS;++i){
sprintf(buf,"XV%d,YV%d,YZ%d\n",arr[i][0],arr[i][1],arr[i][2]);
SER1Puts(buf);
}
break;
default:
if (isprint(c))
{
SER1Putc(c);
} else {
sprintf(s,"Charachter: %02Xh\n",(int)c);
SER1Puts(s);
}
break;
}
}
}
}
Выведет такие строки в ответ на посылку символа 't':
Код: Выделить всё
XV1,YV3,YZ5
XV7,YV11,YZ13
XV17,YV19,YZ23
XV27,YV29,YZ31
XV37,YV41,YZ43
Кстати - очепятка в строке формата (в последней группе вместо ZV получилось в спешке YZ) так и вылезла в выходной поток - YZ5; YZ13; YZ23; YZ31; YZ43.

Добавлено: Чт дек 25, 2008 12:10:41
Symbiosis
Ох, ребят! Вы тут написали, так сложно все, можно сказать перевернули все мои представления ))) Завтра думаю разберусь, а седня к экзамену готовиться надо (. Пока вот вопросик про что )
Так что надо i обнулять где-то ну и вообще следить за ней
Вот что значит следить ? что она натворить то может ? Я конечно могу пофантозировать, но думаю это не совсем уместно будет )))
А код мой смотреть то и нечего собственно, все что прислал - это весь код, а выше только хрень, которую генератор СВАВР навоял + массивчик написал там и усе )
Я просто хочу сперва разобраться с массивом и выводом его, отладить... А уж потом пробывать выдергивать его из текстового файла на карте памяти, а то если сразу все мутить мбуду, думаю запутаюсь и погрязну )
По поводу места в озу мне собственно не очень важно, ведь цель не шибко ресурсоемка, а юзаю мегу32, на первых порах лиж бы сделать рабочий девайс, а то грант уже написал, через пол года отчитываться, надо хоть пару экспирементов поставить, пусть без сд карты, надо лишь столик нанопозиционера двигать )
Добавлено: Чт дек 25, 2008 12:23:40
Symbiosis
Вот Aheir простенькие конструкции делает, мне понятненько все , спасибо вам!, попробую )
А Yellow Tiger , вы так пишете, что у меня аж глаза круглеют, через строчку врубаюсь ))) Можно коментариев, пожалуйста )))
Добавлено: Сб дек 27, 2008 17:04:59
Aheir
Я имел ввиду, что если Вы делаете цикл по i и все время ее увеличиваете, то рано или поздно переменная переполнится и станет 0. При этом переменная является еще и индексом для массива. Что случится при ее переполнении? Не нужен ли выход из цикла? Или может надо запустить цикл заново с начальными условиями? Или может изначально ограничить максимальное значение i? Здесь уж все от Вас зависит...

Добавлено: Вт янв 06, 2009 20:26:22
Ivan_83
Капец полный

Забуть про массивы.
Я тоже всё мучался в си когда с бейсика пересел, что массивы как тоне массивились
Короче у тебя есть память, вот с неё и читай/пиши.
Массив представляет собой кусок памяти размером n*m
n - колличество элементов
m - размер одного элемента
Доступ к элементу массива осуществляется просто: (lpMass*i*m)
lpMass - указатель на начало массива/адрес блока памяти
i - порядковый номер элемента массива
m - размер одного элемента
Вот тебе простейшее преобразование строки в число:
Код: Выделить всё
__inline SIZE_T StrToUNum(LPCSTR lpcszString,SIZE_T dwStringLen)
{
SIZE_T dwNum=0;
BYTE bCurentFigure;
while(dwStringLen)
{
if ((bCurentFigure=((*lpcszString)-48))<10)
{
dwNum*=10;// сдвигаем предыдущее число на один разряд чтоб добавить в младший разряд новую цифру
dwNum+=bCurentFigure;// добавляем цифру в младший разряд
}
lpcszString++;// перемещаем указатель на следующую позицию
dwStringLen--;// уменьшаем длинну
}
return(dwNum);
}
Добавлено: Вт янв 06, 2009 20:53:17
Yellow Tiger
Ivan_83 писал(а):Вот тебе простейшее преобразование строки в число:...
Ему нужно число в строку... а в остальном,.. все верно.

Добавлено: Ср янв 07, 2009 12:02:27
Symbiosis
Yellow Tiger
По вашей конструкции вылезли ошибки. По всей видимости не подключил каких-то библиотек. А вот какие подключить то надо ?
Сообщения след-го содержания
undefined symbol 'SER1CharsPresent'
undefined symbol 'SER1Puts'
not in switch (это так ругается на строку default:)
Ivan_83
Чо то я не въехал потихой (((
Точнее я понял про что вы говорите:
Короче у тебя есть память, вот с неё и читай/пиши.
Массив представляет собой кусок памяти размером n*m
n - колличество элементов
m - размер одного элемента
Доступ к элементу массива осуществляется просто: (lpMass*i*m)
lpMass - указатель на начало массива/адрес блока памяти
i - порядковый номер элемента массива
m - размер одного элемента
Но что это значит? что мне можно просто писать в ячейки памяти цыфры ?
Чуток еще подробней можно, а то голова не варит ( Третий день пытаюсь собраться с силами и поработать над этим, а чо то голова сразу болеть начинает, то ли грипп одолевает, то ли защитная реакция на этот проект )
Добавлено: Пн янв 12, 2009 03:54:18
Ivan_83
С преобразованием числа в строку тоже просто:
Код: Выделить всё
__inline DWORD UNumToStr(SIZE_T dwNum,LPSTR lpszString,SIZE_T dwStringLen)
{
DWORD dwRet=0;
SIZE_T dwNumtm=1;
do
{
lpszString++;// перемещаем указатель на следующую позицию
dwStringLen--;// уменьшаем длинну
dwNumtm*=10;
}while(dwNum>dwNumtm && dwStringLen);
(*lpszString--)=0;
do
{
dwNumtm=dwNum;
dwNum/=10;
(*lpszString)=(CHAR)(48+(dwNumtm-(dwNum*10)));
lpszString--;// перемещаем указатель на следующую позицию
}while(dwNum);
return(dwRet);
}
Именно в ячейки.
Те когда вы всё отдаёте компилятору, то в итоге он всё именно так и делает.
Если взять указатель на начало массива, привести его к строке и отпечатать получите одну большую строку со всеми элементами массива (если конечно в каждом элементе строка не оканчивается нулём).
Добавлено: Пт янв 16, 2009 13:52:40
Symbiosis
Я думаю это будет не оптимально, т.к. собираюсь использовать карту памяти, а на нее записывать текстовый файл, в котором будет массив...
Но с записью в ячейки массива поэкспирементирую...
Добавлено: Пт янв 16, 2009 15:03:12
Yellow Tiger
Symbiosis писал(а):По всей видимости не подключил каких-то библиотек. ... Сообщения след-го содержания
undefined symbol 'SER1CharsPresent'
undefined symbol 'SER1Puts'
not in switch (это так ругается на строку default:
Я же не готовый проект приводил, а лишь примерный код - вместо них нужно использовать доступные аналоги:
SER1CharsPresent - проверяет наличие/отсутствие символа в буфере приема,
SER1Puts - передает строку через USART.
Поскольку вопрос был задан только по способу формирования строки для вывода, я предположил, что функции вывода уже есть.
Ругательство на
default - наведенная ошибка наверняка, исчезнет после указания действительных имен функций.
Symbiosis писал(а):собираюсь использовать карту памяти, а на нее записывать текстовый файл
Если будет текстовый файл с данными, то можно вообще ничего не преобразовывать, а прямо так и слать строки, прочитанные из файла, лишь снабдив их префиксами 'XV', 'YV' и 'ZV', и запятыми, согласно описанному формату.
Добавлено: Вт фев 03, 2009 09:51:28
Symbiosis
Yellow Tiger
Извините, можно подробнее про
Если будет текстовый файл с данными, то можно вообще ничего не преобразовывать, а прямо так и слать строки, прочитанные из файла, лишь снабдив их префиксами 'XV', 'YV' и 'ZV', и запятыми
Добавлено: Вт фев 03, 2009 20:06:50
Yellow Tiger
Symbiosis писал(а):подробнее про
прямо так и слать строки, ... снабдив их префиксами 'XV', 'YV' и 'ZV', и запятыми
Да нечего тут "подробнее" - если данные хранятся не в памяти, а в файле на флешке, то экономить незачем и можно хранить тройки чисел прямо в текстовом виде; тогда число не придется преобразовывать на лету из двоичного вида в текстовый и останется лишь снабдить каждое из трех чисел заголовком (префиксами 'XV', 'YV' и 'ZV') и проставить между ними запятые. Логически продолжая эту мысль (помним, что интерфейс с прибором - RS232, и команды подаются в текстовом виде - "
Если на него подать команду по интерфейсу RS232 к примеру 'XV50'") можно упростить так:
- написать сами команды прямо в файле, то есть, уже с префиксами:
Код: Выделить всё
XV50,YV14,ZV22<CRLF>
XV21,YV18,ZV8<CRLF>
XV0,YV4,ZV0<CRLF>
чтобы мелкоконтроллеру
вообще ничего делать не нужно было - что прочитал из файла, то в прибор и послал!
И, наконец, уж совсем доведя все до логического завершения, упростить еще и так - выбросить нафик микроконтроллер с обвеской и флешку; программу для м/к не писать, файл с командами слать на 'прибор' прямо с компьютера, на котором готовились команды, по тому же самому RS232.
Налицо сплошная экономия - средств, времени, железа, софта и всего прочего, что только поддается экономии.

Добавлено: Вт фев 03, 2009 20:26:32
ARV
Yellow Tiger писал(а):Налицо сплошная экономия - средств, времени, железа, софта и всего прочего, что только поддается экономии.

и вообще нафиг эти дурацкие занятия, лучше пиво квасить с друганами!

Добавлено: Вт фев 03, 2009 20:41:09
Yellow Tiger
Именно! Я понимаю, когда ищут средства для решения насущной задачи, но когда высасывают из пальца задачу под имеющиеся средства - уж лучше совсем ни хрена не делать.
Добавлено: Ср фев 04, 2009 10:23:58
Symbiosis
Уж вынужден напомнить, что вы абсолютно не знаете задачи целиком и требований предъявляемых к ней. А занимаетесь самодурством, считать себя гением приятно, не спорю ! )
А отдельный ПК стоит безусловно дешевле , соглашусь с вами! А самое главное легынький, маленький.
Когда подробности спрашивал, интересовало каким образом образом отделять, но что то сперва спросил потом подумал...
По поводу того чтобы текстовый файл снабдить префиксами ... Уже написал софт, который генерирует текстовый файл с циферами, а вот править нет возможности, файлы проекта утеряны, только приложение скомпилированное осталось.
Добавлено: Ср фев 04, 2009 13:16:03
Shapa
Symbiosis язык С++ обладает в изобилии функциями работы с фалами и потоками, так же, имеются функции форматированного ввода и вывода(которые, между прочим, являются функциями чистого С, а не объектного С++).
Вот к примеру:
если мы выполним этот кусок кода, в cmd увидим:
XX 10
Имеется аналогичная функция вывода в файл:
Код: Выделить всё
FILE *f = fopen("myFile.txt","w+");
int a=10;
fprintf(f,"XX %d",a);
fclose(f);
после такого, открыв файл, мы увидим
XX 10
надеюсь я понял вас верно и смог чем-то помочь.