Page 1 of 1

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

Posted: 05 Jan 2014, 22:28
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

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

Posted: 05 Jan 2014, 23:49
by N1X
Это вытянуто из исходника? Ибо у вас в вызове COMMAND, а объявлен и определен массив COMMANDS[6]... Других проблем беглым взглядом не увидел ) При таком объявлении действительно массив указателей, должен работать...

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

Posted: 06 Jan 2014, 00:03
by abigsam
N1X wrote:объявлен и определен массив COMMANDS[6]
Исправил :) В исходниках правильно прописано.
Подозреваю есть какая-то тонкость с этими указателями, я пока с ними не очень дружен :(

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

Posted: 06 Jan 2014, 11:17
by N1X
А прототип функции как выглядит?

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

Posted: 06 Jan 2014, 11:48
by BSVi
Возможно из-за const, к примеру, comparestr принимает void*, а вы ему const void* подсовываете.

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

Posted: 06 Jan 2014, 14:39
by abigsam
N1X wrote:прототип функции
Вот он:

Code: Select all

//--- Функция сравнения двух строк ---
uint8_t comparestr (uint8_t (*Base)[],		//Строка, с которой сравнивают
                     uint8_t (*Compare)[]);	//Строка, которая сравнивается
BSVi wrote:принимает void*, а вы ему const void*
Не совсем понял, void -- это же "пустой" идентификатор ?

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

Posted: 06 Jan 2014, 14:43
by BSVi
void - это любой :) В том числе в void * можно передать и char *. В вашем чае при вызове функции нужно написать comparestr ((uint8_t*)COMMANDS, &buffer); чтобы снять константность.

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

Posted: 06 Jan 2014, 16:57
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.
Хотя я все ещё не до конца понял, что же я делал не так :)