Массив строк -- как правильно реализовать ?

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Post Reply
abigsam
Posts: 11
Joined: 29 Oct 2013, 22:36
Location: Сумы

Массив строк -- как правильно реализовать ?

Post by abigsam »

Прошу у сообщества оказать посильную помощь :)
Есть некоторая функция comparestr (), которая в качестве аргументов принимает два указателя на строки. Если входные строки одинаковы -- возвращает ноль. Для наглядности:

Code: Select all

error = comparestr (&COMMANDS, &buffer);
Хочу вместо COMMANDS скармливать функции массив строк, вот так:

Code: Select all

 while (i <= 6)
		{
			error = comparestr (COMMANDS[i], &buffer);
			if (error == 0) break;
			i++;
		} 
Вопрос: как правильно описать такой массив ? Как правильно прописать аргумент функции ?
Сейчас описываю массив так:

Code: Select all

/*Constants-------------------------------------- */
//-------------- Команды ---------------
const uint8_t SET_TIME[]            = "settime\r";
const uint8_t SET_TELEPHONE[]  = "settelephone\r";
const uint8_t SET_NUMBER[]       = "setnum\r";
const uint8_t SET_SCHEDULE[]    = "setschedule\r";
const uint8_t SHOW_SETTINGS[] = "showsettings\r";
const uint8_t SAVE_SETTINGS[]   = "save\r";

const uint8_t *COMMANDS[6] = {SET_TIME,
						 SET_TELEPHONE,
						 SET_NUMBER,
						 SET_SCHEDULE,
						 SHOW_SETTINGS,
						 SAVE_SETTINGS};
Выражением *COMMANDS[6] я делаю массив указателей, каждой ячейке массива присваиваю значение указателей на строки. Но компилятор пишет, что "несовместимый тип аргумента" для функции comparestr ().
Заранее благодарю :)

P.S. Использую STVD + Cosmic
Last edited by abigsam on 06 Jan 2014, 00:05, edited 3 times in total.
User avatar
N1X
Posts: 321
Joined: 20 Sep 2011, 20:11
Location: Беларусь, Гомель

Re: Массив строк -- как правильно реализовать ?

Post by N1X »

Это вытянуто из исходника? Ибо у вас в вызове COMMAND, а объявлен и определен массив COMMANDS[6]... Других проблем беглым взглядом не увидел ) При таком объявлении действительно массив указателей, должен работать...
abigsam
Posts: 11
Joined: 29 Oct 2013, 22:36
Location: Сумы

Re: Массив строк -- как правильно реализовать ?

Post by abigsam »

N1X wrote:объявлен и определен массив COMMANDS[6]
Исправил :) В исходниках правильно прописано.
Подозреваю есть какая-то тонкость с этими указателями, я пока с ними не очень дружен :(
User avatar
N1X
Posts: 321
Joined: 20 Sep 2011, 20:11
Location: Беларусь, Гомель

Re: Массив строк -- как правильно реализовать ?

Post by N1X »

А прототип функции как выглядит?
User avatar
BSVi
Адепт
Posts: 3577
Joined: 15 Mar 2011, 12:32
Location: Киев

Re: Массив строк -- как правильно реализовать ?

Post by BSVi »

Возможно из-за const, к примеру, comparestr принимает void*, а вы ему const void* подсовываете.
abigsam
Posts: 11
Joined: 29 Oct 2013, 22:36
Location: Сумы

Re: Массив строк -- как правильно реализовать ?

Post by abigsam »

N1X wrote:прототип функции
Вот он:

Code: Select all

//--- Функция сравнения двух строк ---
uint8_t comparestr (uint8_t (*Base)[],		//Строка, с которой сравнивают
                     uint8_t (*Compare)[]);	//Строка, которая сравнивается
BSVi wrote:принимает void*, а вы ему const void*
Не совсем понял, void -- это же "пустой" идентификатор ?
User avatar
BSVi
Адепт
Posts: 3577
Joined: 15 Mar 2011, 12:32
Location: Киев

Re: Массив строк -- как правильно реализовать ?

Post by BSVi »

void - это любой :) В том числе в void * можно передать и char *. В вашем чае при вызове функции нужно написать comparestr ((uint8_t*)COMMANDS, &buffer); чтобы снять константность.
abigsam
Posts: 11
Joined: 29 Oct 2013, 22:36
Location: Сумы

Re: Массив строк -- как правильно реализовать ?

Post by abigsam »

В общем, заработало. В функции comparestr() в качестве аргумента я использовал указатели на массив. После того как я переделал её (функцию) для работы с арифметикой указателей, все встало работать.

Code: Select all

//--- Функция сравнения двух строк ---
uint8_t comparestr (uint8_t *Base,                  //Указатель на строку, с которой сравнивают
                    uint8_t *Compare)               //Указатель на строку, которая сравнивается
{
	uint8_t i     = 0;
	uint8_t error = 0;
	//
	while (*((uint8_t*)Base + i) != NULL)   /* while ((*Base)[i] != NULL) -- так было раньше */
	{
		if (*((uint8_t*)Base + i) != *((uint8_t*)Compare + i) )   /* if ((*Base)[i] != (*Compare)[i]) -- так было раньше*/
		{
			error++;
		}
	}
	return error;	
}
Теперь такой вызов функции работает:

Code: Select all

error = comparestr (COMMANDS[i], buffer);
Прояснение в голове произошло после прочтения вот этого: http://www.c-cpp.ru/books/indeksaciya-s ... ukazateley.
Хотя я все ещё не до конца понял, что же я делал не так :)
Post Reply