Работа с массивами в C++

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение IfoR »

Symbiosis писал(а):А вот как заменить выражение для цикла for, чтобы не до 999, а до бесконечности ?
Ну так:

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

for(int i=0;; i++) 
{

}
Либо так:

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

int i=0;
while(1)
{
i++;

}
А зачем? :)

Ну, а для конвертирования должны быть хедеры с этими функциями в комплекте с компилятором. Ну а там уж какие есть. :) Ну itoa() например.
Реклама
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

А вот я делал так

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

int i=0; 
while(1) 
{ 
i++; 

} 
но у меня ничо неработало.
Ну собственно я думал что лепить кучу девяток как-то через чур по профански )
где то я уже слышал/видел itoa() и iloa() кажется, буду разбираться )
Реклама
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение 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 не исполняет. :)))
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение 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 обнулять где-то ну и вообще следить за ней :)
Оптимизм х (Опыт + Знания) = const
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение 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. :)))
Реклама
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Ох, ребят! Вы тут написали, так сложно все, можно сказать перевернули все мои представления ))) Завтра думаю разберусь, а седня к экзамену готовиться надо (. Пока вот вопросик про что )
Так что надо i обнулять где-то ну и вообще следить за ней
Вот что значит следить ? что она натворить то может ? Я конечно могу пофантозировать, но думаю это не совсем уместно будет )))

А код мой смотреть то и нечего собственно, все что прислал - это весь код, а выше только хрень, которую генератор СВАВР навоял + массивчик написал там и усе )
Я просто хочу сперва разобраться с массивом и выводом его, отладить... А уж потом пробывать выдергивать его из текстового файла на карте памяти, а то если сразу все мутить мбуду, думаю запутаюсь и погрязну )

По поводу места в озу мне собственно не очень важно, ведь цель не шибко ресурсоемка, а юзаю мегу32, на первых порах лиж бы сделать рабочий девайс, а то грант уже написал, через пол года отчитываться, надо хоть пару экспирементов поставить, пусть без сд карты, надо лишь столик нанопозиционера двигать )
Реклама
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Вот Aheir простенькие конструкции делает, мне понятненько все , спасибо вам!, попробую )

А Yellow Tiger , вы так пишете, что у меня аж глаза круглеют, через строчку врубаюсь ))) Можно коментариев, пожалуйста )))
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Я имел ввиду, что если Вы делаете цикл по i и все время ее увеличиваете, то рано или поздно переменная переполнится и станет 0. При этом переменная является еще и индексом для массива. Что случится при ее переполнении? Не нужен ли выход из цикла? Или может надо запустить цикл заново с начальными условиями? Или может изначально ограничить максимальное значение i? Здесь уж все от Вас зависит... :)
Оптимизм х (Опыт + Знания) = const
Ivan_83
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср июл 30, 2008 21:34:17

Сообщение 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);
}
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Ivan_83 писал(а):Вот тебе простейшее преобразование строки в число:...
Ему нужно число в строку... а в остальном,.. все верно. :)))
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение 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 - размер одного элемента
Но что это значит? что мне можно просто писать в ячейки памяти цыфры ?

Чуток еще подробней можно, а то голова не варит ( Третий день пытаюсь собраться с силами и поработать над этим, а чо то голова сразу болеть начинает, то ли грипп одолевает, то ли защитная реакция на этот проект )
Ivan_83
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср июл 30, 2008 21:34:17

Сообщение 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);
}

Именно в ячейки.
Те когда вы всё отдаёте компилятору, то в итоге он всё именно так и делает.
Если взять указатель на начало массива, привести его к строке и отпечатать получите одну большую строку со всеми элементами массива (если конечно в каждом элементе строка не оканчивается нулём).
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Я думаю это будет не оптимально, т.к. собираюсь использовать карту памяти, а на нее записывать текстовый файл, в котором будет массив...

Но с записью в ячейки массива поэкспирементирую...
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Symbiosis писал(а):По всей видимости не подключил каких-то библиотек. ... Сообщения след-го содержания
undefined symbol 'SER1CharsPresent'
undefined symbol 'SER1Puts'
not in switch (это так ругается на строку default:
Я же не готовый проект приводил, а лишь примерный код - вместо них нужно использовать доступные аналоги:
SER1CharsPresent - проверяет наличие/отсутствие символа в буфере приема,
SER1Puts - передает строку через USART.
Поскольку вопрос был задан только по способу формирования строки для вывода, я предположил, что функции вывода уже есть.
Ругательство на default - наведенная ошибка наверняка, исчезнет после указания действительных имен функций.
Symbiosis писал(а):собираюсь использовать карту памяти, а на нее записывать текстовый файл
Если будет текстовый файл с данными, то можно вообще ничего не преобразовывать, а прямо так и слать строки, прочитанные из файла, лишь снабдив их префиксами 'XV', 'YV' и 'ZV', и запятыми, согласно описанному формату.
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Yellow Tiger

Извините, можно подробнее про
Если будет текстовый файл с данными, то можно вообще ничего не преобразовывать, а прямо так и слать строки, прочитанные из файла, лишь снабдив их префиксами 'XV', 'YV' и 'ZV', и запятыми
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение 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.

Налицо сплошная экономия - средств, времени, железа, софта и всего прочего, что только поддается экономии. :)))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18556
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Yellow Tiger писал(а):Налицо сплошная экономия - средств, времени, железа, софта и всего прочего, что только поддается экономии. :)))
и вообще нафиг эти дурацкие занятия, лучше пиво квасить с друганами! :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Именно! Я понимаю, когда ищут средства для решения насущной задачи, но когда высасывают из пальца задачу под имеющиеся средства - уж лучше совсем ни хрена не делать.
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Уж вынужден напомнить, что вы абсолютно не знаете задачи целиком и требований предъявляемых к ней. А занимаетесь самодурством, считать себя гением приятно, не спорю ! )

А отдельный ПК стоит безусловно дешевле , соглашусь с вами! А самое главное легынький, маленький.

Когда подробности спрашивал, интересовало каким образом образом отделять, но что то сперва спросил потом подумал...

По поводу того чтобы текстовый файл снабдить префиксами ... Уже написал софт, который генерирует текстовый файл с циферами, а вот править нет возможности, файлы проекта утеряны, только приложение скомпилированное осталось.
Аватара пользователя
Shapa
Встал на лапы
Сообщения: 127
Зарегистрирован: Пт июн 20, 2008 09:38:05
Откуда: Харьков
Контактная информация:

Сообщение Shapa »

Symbiosis язык С++ обладает в изобилии функциями работы с фалами и потоками, так же, имеются функции форматированного ввода и вывода(которые, между прочим, являются функциями чистого С, а не объектного С++).
Вот к примеру:

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

int a=10;
printf("XX %d",a);
если мы выполним этот кусок кода, в cmd увидим:
XX 10
Имеется аналогичная функция вывода в файл:

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

FILE *f = fopen("myFile.txt","w+");
int a=10;
fprintf(f,"XX %d",a);
fclose(f);
после такого, открыв файл, мы увидим
XX 10
надеюсь я понял вас верно и смог чем-то помочь.
Закрыто

Вернуться в «Теория»