powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 5.8 Массивы указателей
54 сообщений из 54, показаны все 3 страниц
K&R 5.8 Массивы указателей
    #38559284
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Решил начать новую тему. Предыдущая содержит много ошибок не по теме.

Вот собственно мой код.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
int strcmp_cur(const char* f, const char* s)//лексикографически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{
	while (*f == *s)
	{
		if (*f=='\0') return 0;
		f++; s++;
	}
	return (*f - *s);
}

void sort_cur(char* a_start[], int weight_array)/*2*/
{
	int i = 0, temp = 0;
	char* ptr_temp;//для хранения значения адреса массива во время его "замещения"
	while (temp != weight_array-1)//пока все элементы не упорядоченны 
	{
		temp = 0, i = 0;
		while (i < weight_array-1)//цикл по всем "соседям по парте" в массиве
		{
			if (strcmp_cur(*(a_start+i+1), *(a_start+i)) >= 0)
			{
				++temp;
			}
			else
			{
				ptr_temp = *(a_start + i + 1);
				*(a_start+i+1) = *(a_start+i);
				*(a_start+i) = ptr_temp;
			}
			++i;
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{

	char* m[12] =
	{ "jaunary", "february", "march", "april", "may", "june",
	"july", "august", "september", "october", "nobember", "december" 
	};
	int i = 0;
    //вывод на экран до
	while (i < 12) /*1.1*/
	{
		printf("%p  %p  %i \n", (m+i),  *(m+i), i);
		++i;
	}

	//сортировка и вывод на экран
	sort_cur(m, 11);
	i = 0;/*1.2*/
	while (i<12)
	{
		printf("%s  %i\n", *(m+i), i);
		++i;
	}
	return 0;
}
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559292
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.1-1.2 -это побочный эффект, верно ? как бы мне внутри while объявлять i чтобы он не изменял внешнюю переменную. Или как бы сделать так, чтобы при использовании переменной внутри while, на выходе её значение становилось прежним по умолчанию.
может f e существует идентификатор при объявлении
smth_ident int i=0;

2. Как бы правильно назвать размерность массива, подходит ли моё название ?
не совсем в тему, но кстати, используете ли вы венгерскую нотацию ?

2. Хочу передавать только адрес первого элемента массива и кол-во элементов, но пока не получилось написать функцию. Возможно ли это ? если да, то не подсказывайте как, хочу ещё сам подумать.

3. Алгоритм сортировки верный ?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559293
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот ещё
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559295
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая максимальная размерность массива указателей ? Мне нравятся, мощная штука. А ещё можно сделать массив указателей который замыкается на себе ? вроде можно, но для чего это будет использоваться ? (не одномерный, одномерный видимо для стэка fifo,lifo и тп )
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559300
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1.1-1.2 -это побочный эффект, верно ? как бы мне внутри while объявлять i чтобы он не изменял внешнюю переменную. Или как бы сделать так, чтобы при использовании переменной внутри while, на выходе её значение становилось прежним по умолчанию.
может f e существует идентификатор при объявлении
smth_ident int i=0;
используй цикл for()
Код: plaintext
1.
2.
int i;
for(i = 0; i < 12; i++) printf("%p  %p  %i \n", (m+i),  *(m+i), i);



SashaMercury2. Как бы правильно назвать размерность массива, подходит ли моё название ?
не совсем в тему, но кстати, используете ли вы венгерскую нотацию ?
Массив указателей
Венгерская нотация никому хуже код не сделала. Лучше использовать.

SashaMercury2. Хочу передавать только адрес первого элемента массива и кол-во элементов, но пока не получилось написать функцию. Возможно ли это ? если да, то не подсказывайте как, хочу ещё сам подумать.
Да

SashaMercury3. Алгоритм сортировки верный ?
Сам как думаешь? На скриншот свой посмотри.
SashaMercuryИ вот ещё
Не надо лезть за пределы массива, там неинициализированная память, там вообще может не оказаться реальной памяти.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559302
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
декабрь совсем не там !
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559304
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно
Код: plaintext
1.
while (i < weight_array)
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559309
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_TНе надо лезть за пределы массива, там неинициализированная память, там вообще может не оказаться реальной памяти.



Он мне всегда следующим элементов выводит CCCC CCCC что это ? а что он тогда выводит если там не реальной памяти ? откуда берёт значения?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559310
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая максимальная размерность массива указателей ?

любая. пока памяти хватит.


Мне нравятся, мощная штука. А ещё можно сделать массив указателей который замыкается на себе ? вроде можно, но для чего это будет использоваться ? (не одномерный, одномерный видимо для стэка fifo,lifo и тп )

как же тебя плющит...
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559318
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima_TНе надо лезть за пределы массива, там неинициализированная память, там вообще может не оказаться реальной памяти.



Он мне всегда следующим элементов выводит CCCC CCCC что это ? а что он тогда выводит если там не реальной памяти ? откуда берёт значения?
Там есть реальная память (иначе бы прога вылетела), а что там записано и какой программой неважно. Ты просил массив из 12 элементов - тебе его выделили, не надо лезть в 13-й.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559321
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

напиши подробные комментарии к каждой строчке кода.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559325
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего CCCC CCCC ставит компилятор.
Зачем точно не скажу, могу предположить скорее всего своеобразная защита от ошибок в коде, чтобы программа гарантированно вылетела при попытке обратится по этому адресу.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559334
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
int strcmp_cur(const char* f, const char* s)//лексикографически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{
	while (*f == *s)//пока значения символов равны
	{
		if (*f=='\0') return 0; //если обе строки закончились то строки равны
		f++; s++;//переходим к следующему элементу
	}
	return (*f - *s);//возвращаем разниу между символами по ASCII после первого различия в символах 
}


void sort_cur(char* a_start[], int weight_array)/*2*/
{
	int i = 0, temp = 0;
	char* ptr_temp;//ячейка для временного хранения одного адреса из массива
	while (temp != weight_array-1)//пока все пары не расположны в верном порядке
		//(фактически в скобках число пар где всё норм, таких пар должно быть на 1 меньше 
		//чем элементов в массиве)
	{
		temp = 0, i = 0;
		while (i < weight_array)//цикл по всем "соседям по парте" в массиве,
			//аналогичный цикл выше, только по другом написан
		{
			if (strcmp_cur(*(a_start+i+1), *(a_start+i)) >= 0) //сравниваю две строки, если их порядок верен
			{
				++temp; // то добавляю единицу к коэф по которому определяется что массив отсортирован
			}
			else //если два элемента не упорядочены
			{
				ptr_temp = *(a_start + i + 1);//пишу во временный указатель значение адреса хранящегося в элементе 
				//массива, то есть не сам адрес массива, а значение которое записано по этому адресу,\
				// и которое определяет начало строки
				*(a_start+i+1) = *(a_start+i);//меняю местами значения адресов
				*(a_start+i) = ptr_temp;//меняю местами значения адресов
			}
			++i;//проверяю все пары до конца
		}
	}
}
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559358
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта строчка правильно написана?
SashaMercury
Код: plaintext
1.
2.
	//сортировка и вывод на экран
	sort_cur(m, 11);
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559373
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нелогично что 11, согласен. Но правильно вроде-бы
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559375
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryнелогично что 11, согласен. Но правильно вроде-бы
почему правильно?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559384
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно. Должно быть 12
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559386
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНеправильно. Должно быть 12
почему?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559404
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
while (i < weight_array)



отработает до 11 элемента, а в теле индексация на единицу увеличит, то учту все элементы массива
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559423
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
while (i < weight_array)



отработает до 11 элемента, а в теле индексация на единицу увеличит, то учту все элементы массива
почти угадал :)

Надо четко понимать чего ты пишешь.
Ты при описании кода ни слова не написал про строку
Код: plaintext
1.
void sort_cur(char* a_start[], int weight_array)/*2*/


а она одна из не многих требующих обязательного описания
при описании функции обязательно надо описать что она получает в параметрах
В твоем случае
char* a_start[] - начало сортируемого массива
int weight_array - размер массива
У тебя размер изначально 12 (char* m[12]) вот и надо передавать 12.

И имена переменным надо давать соответствующие: weight переводится как "вес", по-русски ты же нигде не пишешь "вес массива", уместнее слово size - размер.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559431
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно конечно написать в описании weight_array - это индекс последнего элемента массива.
тогда вызов sort_cur(m, 11) будет правильным, только так обычно никто не пишет, принято передавать указатель на начало и размер.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559668
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
while (i < weight_array)



отработает до 11 элемента, а в теле индексация на единицу увеличит, то учту все элементы массива

Так не пишут. Не ошибка, конечно, но начинают с нуля и бегут до N-1. В цикле for .

Код: plaintext
1.
2.
3.
4.
5.
6.
#define N 256
int a[256];
for( int i = 0; i < N; ++i )
{
  printf( "a[%d] = %d", i, a[i] );
}
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559700
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
			else
			{
				ptr_temp = *(a_start + i + 1);
				*(a_start+i+1) = *(a_start+i);
				*(a_start+i) = ptr_temp;
			}





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

Код: plaintext
1.
2.
3.
4.
5.
6.
			else
			{
				ptr_temp = a_start[ i + 1 ];
				a_start[i+1] = a_start[i];
				a_start[i] = ptr_temp;
			}




Также давай переменным осмысленные имена.

Объявляй переменные в месте их первого использования, если обратное не требуется по семантике программы (если не нужно вынести переменную из блока). Это НЕ classic C style, но очень хорошая позитивная привычка нормального C++-ника. Ты же не собираешься наверное на голом С останавливаться ? Думаю, нет.

Используй правильно циклы. Если у тебя есть явная инициализация цикла, условие завершения и выражение смещения к следующей итерации, выполняемое безусловно, то нужно использовать FOR (если есть хотя бы два из этих трёх условий).
Для циклов с постусловием используй do ... while, в остальных случаях -- while.

Вместь
Код: plaintext
1.
*f=='\0' 

можно писать просто
Код: plaintext
1.
!*f

, вместо
Код: plaintext
1.
*f=='\0' 

можно писать
Код: plaintext
1.
*f

. Это тебе не Java.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559708
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
++temp; // то добавляю единицу к коэф по которому определяется что массив отсортирован



На сколько я помню, в пузырьке достаточным условием выхода из сортировки является просто то, что за проход не пришлось ничего переставлять.
Можешь справиться в википедии.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559994
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,Dima_T спасибо C:

а операция *(a+i) будет одинаково по скорости с a[i] вычисляться ? мне почему-то нравится писать *(a+i), я как-будто бы руками щупаю память, а не в перчатках. Хотя вы правы, читабельней ваш вариант.
Завтра ещё раз утром всё перечитаю

А вот сейчас функция принимает только один указатель? Но она понимает что указатель на начало массива ?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38560029
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

а операция *(a+i) будет одинаково по скорости с a[i] вычисляться ?

Ты должен уже знать, что a[i] по определению *(a+i). Значит вопрос не имеет смысла.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38560092
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа операция *(a+i) будет одинаково по скорости с a[i] вычисляться ?
Скоре всего да. От компилятора зависит, у меня одинаково откомпилировалось.

SashaMercuryмне почему-то нравится писать *(a+i), я как-будто бы руками щупаю память, а не в перчатках.
тогда уходи от этих суррогатов и пользуйся только указателями
тоже самое с указателями
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
void sort_ptrcur(char** ppszArray, int iArraySize)
{
	char** ppszArrayEnd = ppszArray + iArraySize - 1; // Указатель на последний элемент
	bool lSwap = true;
	while(lSwap) // пока есть перестановки
	{
		lSwap = false;
		char** ppszCur1 = ppszArray;
		char** ppszCur2 = ppszArray + 1;
		while(ppszCur2 <= ppszArrayEnd)
		{
			if(strcmp(*ppszCur2, *ppszCur1) < 0)
			{
				char* ptr_temp = *ppszCur1;
				*ppszCur1 = *ppszCur2;
				*ppszCur2 = ptr_temp;
				lSwap = true;
			}
			ppszCur1++;
			ppszCur2++;
		}
	}
}


int main(int argc, char* argv[])
{

	char* m[12] =
	{ "jaunary", "february", "march", "april", "may", "june",
	"july", "august", "september", "october", "nobember", "december" 
	};
	int i;
	printf("before:\n");
	//вывод на экран до
	for(i = 0; i < 12; i++) printf("%p  %p  %i %s\n", &m[i],  m[i], i, m[i]);

	//сортировка
	sort_ptrcur(m, 12);

	//вывод на экран после
	printf("after:\n");
	for(i = 0; i < 12; i++) printf("%p  %p  %i %s\n", &m[i],  m[i], i, m[i]);
	return 0;
}


PS Тут я слегка поправил твой алгоритм. нет смысла считать temp. У тебя получается temp != weight_array-1 только в случае если была хоть одна перестановка, т.к. всего сравнений weight_array-1 за один проход.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38560364
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZiv,Dima_T спасибо C:

а операция *(a+i) будет одинаково по скорости с a[i] вычисляться ?


Конечно, это же одно и то же.

SashaMercury мне почему-то нравится писать *(a+i), я как-будто бы руками щупаю память, а не в перчатках. Хотя вы правы, читабельней ваш вариант.


Щупать надо ... в общем, другое щупать надо.
И без перчаток. А "нотация массива" просто удобнее и понятнее. Ну я не знаю. как-то даже сложно представить, когда понятнее будет *(a+i). Наверное, елси отдельно сначала идёт a+i, а затем потом -- разименование в 10 местах, или просто в другом месте.

SashaMercuryА вот сейчас функция принимает только один указатель? Но она понимает что указатель на начало массива ?

Это я не понял, про какую фукнцию речь ?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38560597
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за мнения :)
Решил что так как знаю С/С++ слабо, буду писать две версии каждой функции что использует указатели, одна будет адресовать элементы через явный сдвиг *(a+i), а вторая будет обращаться a[i]. Через два-три месяца, если будет качественный сдвиг в моём понимание языка, я приму решение относительно своего синтаксиса.

SashaMercuryА вот сейчас функция принимает только один указатель? Но она понимает что указатель на начало массива ?


MasterZivЭто я не понял, про какую фукнцию речь ?


Это я про объявление функции сортировки, где принимаемые параметры (char* a[],int size).
Но это наверное дальше есть в K&R буду читать.

Dima_T,
что значит буква l в lSwap, то что она bool ? И sz после pp ? Что такое pp я понял
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38560605
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_T
Код: plaintext
1.
char** ppszArrayEnd = ppszArray + iArraySize - 1; // Указатель на последний элемент


сдвиг произойдёт на 12*4-4 ?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38560611
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думал сегодня. Ещё было бы хорошо если бы массивы можно было бы объявлять как f e:
Код: plaintext
1.
2.
3.
4.
5.
char*[100] array;

OR

char*[] smth_array;



Чтобы всю информацию по типу данных указывать слева. А справа чтобы было только имя элемента
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38560771
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДумал сегодня. Ещё было бы хорошо если бы массивы можно было бы объявлять как f e
Да вы еретик, батенька. Джава по вам плачет :)
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38560823
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima_T,
что значит буква l в lSwap, то что она bool ? И sz после pp ? Что такое pp я понял
Венгерская нотация, префикс означает тип переменной.
l от logical (не b потому что b использую для unsicned char т.е. byte)
sz от string zero, строка символов с нулем в конце. Хотя это формально массив char, но это не совсем массив, т.к. в отличии от классических массивов тут ожидается что последний элемент 0.
p от pointer (указатель)
pp соответственно указатель на указатель

ppszArrayEnd указатель на указатель на строку символов с нулем в конце.

SashaMercuryDima_T
Код: plaintext
1.
char** ppszArrayEnd = ppszArray + iArraySize - 1; // Указатель на последний элемент


сдвиг произойдёт на 12*4-4 попугаев ?
:) не забывай указывать единицы измерения.

Сдвиг произойдет на (iArraySize - 1) элементов массива, т.е. 11.
Тут 4 это сколько надо байт памяти для хранения одного элемента массива, т.к. это указатель (char *) то под него надо 4 байта.

В итоге сколько выделять байт под каждый тип данных решает компилятор, а ты можешь узнать с помощью sizeof()
Код: plaintext
1.
printf("%d %d\n", sizeof(*ppszArrayEnd), sizeof(char *));



Пока советую тебе не заморачиваться что сколько байт занимает в памяти. Тут тебе главное знать что в массиве все элементы идут один за другим без разрывов поэтому работать с ними можно как с указанием индекса элемента a[i];a[i+1]; так и указателями pa=a[i];pa++;

SashaMercuryА вот сейчас функция принимает только один указатель? Но она понимает что указатель на начало массива ?
...
Это я про объявление функции сортировки, где принимаемые параметры (char* a[],int size).
Она ожидает что это начало массива, а начало это или нет решается там где функция вызывается. Задача функции отсортировать size элементов начиная с char* a[]
Например можешь отсортировать только летние месяцы
Код: plaintext
1.
sort_cur(&m[5], 3);
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38561705
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДумал сегодня. Ещё было бы хорошо если бы массивы можно было бы объявлять как f e:
Код: plaintext
1.
2.
3.
4.
5.
char*[100] array;

OR

char*[] smth_array;



Чтобы всю информацию по типу данных указывать слева. А справа чтобы было только имя элемента

согласен про еритика..
С - язык, удобный для человека, а не для компилятора.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38561707
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Венгерская нотация, префикс означает тип переменной.
....

Венгерская нотация - это еще одна тупиковая ветвь развития человечества.

её применять не надо. знать тем не менее надо немного, поскольку эта хрень применяется в WinAPI.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38561724
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВенгерская нотация - это еще одна тупиковая ветвь развития человечества.
Может для C/C++ особой необходимости в ней нет, в силу специфики языка:
1. Жесткая типизация. Код просто не откомпилируется при попытке присвоить значение другого типа
2. Постоянное указывание типов в коде при передаче параметров. Они всегда на виду. В крайнем случае среда разработки быстро подскажет тип переменной (как минимум MS VC)
3. Огромное разнообразие типов, начиная с базовых, заканчивая своими - устанешь префиксы изобретать :)

Но на C/C++ программирование не заканчивается, есть много других языков где она полезна. В первую очередь при отсутствии жесткой типизации переменных. Например в Visual FoxPro (на котором я в основном пишу) вообще нет типов переменных, есть только типы данных. В итоге тип переменной определяется типом записанных в нее данных. И ошибка проявится не при компиляции, а при работе программы. По сути переменная фокспро это всегда void* в терминологии Си.

То же самое касается полей таблиц в СУБД. Сделал выборку и гадай потом где какой тип, когда можно сделать префикс и по имени поля сразу знать его тип.

Также в фоксе использую указание области видимости переменной (global/private/local)
Например в Си такой код выведет 15 звездочек
Код: plaintext
1.
2.
3.
4.
5.
6.
void f1()
{
	for(int i = 0; i < 3; i++) printf("*");
}

for(int i = 0; i < 5; i++) f1();


а в фоксе подобное зациклится
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for i = 1 to 5
	f1()
endfor

func f1
for i = 1 to 3
	?? '*'
endfor
return


Зациклится потому что будет использована одна и та же i. Чтобы такого не случилось надо самому позаботится и явно объявить переменную локальной.

В общем в фоксе без венгерской нотации грустно писать. Лично для меня разработка сильно упростилась когда начал ее использовать.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38561756
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНо на C/C++ программирование не заканчивается
Как это не заканчивается? В этом форуме точно заканчивается
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38561860
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шпольский пояснял, зачем нужна венгерская нотация . И это совсем не обозначение типов переменных.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562021
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Я честно говоря никогда нигде не видел венгерскую нотацию вне С/С++, в других языках программирования.
На фоксе писал много сам, но никогда не применял ни венгерскую нотацию, ни какие-то соглашения о кодировании вообще, и как-то обходились все. Может быть потому, что у меня было всё на SQL и по большому счёту там и переменных-то не было ?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562117
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDima T,

Я честно говоря никогда нигде не видел венгерскую нотацию вне С/С++, в других языках программирования.
На фоксе писал много сам, но никогда не применял ни венгерскую нотацию, ни какие-то соглашения о кодировании вообще, и как-то обходились все. Может быть потому, что у меня было всё на SQL и по большому счёту там и переменных-то не было ?Венгерская нотация (настоящая венгерская нотация) может быть полезна если у тебя много "одноименных переменных" относящихся к разным областям. Не помню дословно как было в оригинальной статье введшей эту нотацию в обиход, но она писалась по следам создания текстового редактора. А там есть разные виды строк, отсюда и нотация: wRow, dRow, bRow- строка в окне, строка в документе, строка в буфере. И в этом случае легко можно заметить что если кто-то написал wRow=bRow то это ошибка.
А если твой язык позволяет делать длинные имена и ты не ленишься писать RowInTheWindow, row_in_the_document или Row_Of_The_Buffer, то венгерская нотация уже не нужна.

Те кто придумал давать переменным префикс на основе их типа - придурки и должны быть расстреляны.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562158
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

winRow, docRow, bufRow было бы значительно лучше.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562164
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТе кто придумал давать переменным префикс на основе их типа - придурки и должны быть расстреляны.
На вкус и цвет все фломастеры разные (с)

Слава богу имена переменных никакие стандарты не регламентируют. И тут личное дело каждого разработчика как именовать переменные. Лично мне удобнее с венгерской нотацией в т.ч. и в С/С++. И очень удивляет когда идут гневные потоки сознания по таким философским вопросам. Делиться опытом и пытаться его навязывать - это разные вещи.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562185
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TWhite OwlТе кто придумал давать переменным префикс на основе их типа - придурки и должны быть расстреляны.
На вкус и цвет все фломастеры разные (с)

Слава богу имена переменных никакие стандарты не регламентируют. И тут личное дело каждого разработчика как именовать переменные. Лично мне удобнее с венгерской нотацией в т.ч. и в С/С++. И очень удивляет когда идут гневные потоки сознания по таким философским вопросам. Делиться опытом и пытаться его навязывать - это разные вещи.

Ну я тоже против венгерки. Просто чисто эстетически.
Какое-то время пользовался ею, но потом подумал -- а нафига мне кривить мозг, или набирать лишние символы, и перестал пользоваться ею совсем.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562210
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем :)

Мне кажется что в теории языков программирование наверняка есть обоснование существования венгерской нотации.

От себя:
f e:
1. Думается что имя любого указателя должно начинаться с "p"
2. Допустим у вас есть таблица monthes с атрибутами name, number, вы получаете в коде значения и номера месяца и имени месяца. Мне кажется лучше назвать их f e s_month i_month вместо name_month number_month
3. мне кажется что венгерская нотация по качеству не аналог go to
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562214
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

именовать параметры это искусство. вот, например, твой пример с таблицей. скажи, зачем мне иметь префиксы к полям:

birthdate, total, name, surname, id, deleted и так далее?

префиксы формируют "арабскую" вязь и превращают код в тайнопись. Или, к примеру, решит ты сменить в таблице домен (вместе с типом), что, поле будешь переименовывать?

вообщем, имя должно либо говорить о себе, либо не вызывать разночтений в силу устоявшейся традиции. например, переменные цикла или знаменитые foo..boo.

поэтому, в базах данных эта техника с префиксами не прижилась.

что касается кода, то здесь как тебе нравится, но мое замечание относительно имени, которое говорит само за себя тоже здесь действует.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562216
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неееет. я имел ввиду не именование полей с префиксами в бд! в бд name, namber.
Например вы в коде присваиваете значение переменной из запроса к бд !я про код
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562217
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
number*
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562237
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широковпрефиксы формируют "арабскую" вязь и превращают код в тайнопись.
Если до маразма не доводить - одна буква перед названием не усложнит читаемость кода.

Анатолий ШироковИли, к примеру, решит ты сменить в таблице домен (вместе с типом), что, поле будешь переименовывать?
Это серьезный косяк проектирования БД. Если уж ты меняешь тип поля, то замена названия мелочь по сравнению с перелопачиванием кода в поисках где это поле используется.
Оффтоп об особенностях разработки на фоксеЕсть два типа DATE и DATETIME, в большинстве случаев без разницы который используется, язык сам занимается неявным приведением типов, т.е. если перепутал - ошибок не будет, но при расчетах получается интересный эффект
DATE - DATE = количество дней
DATETIME - DATETIME = количество секунд

Например такой код
Код: plaintext
1.
2.
3.
select birthdate from People where id = 1 into Cur1
select birthdate from People where id = 2 into Cur2
delta = Cur1.birthdate - Cur2.birthdate

попробуй угадай чего мы получим в delta?
можно предположить что дату рождения не зачем хранить с точностью до секунд, т.е. она имеет тип DATE, но база может распологаться на MSSQL у которого тип DATE появился всего лет пять назад и было без вариантов DATETIME
да и зачем этот мозговой штурм каждый раз проводить, если можно просто назвать поле dBirthday или tBirthday
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562267
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

плохо говорить с верующими :-)

я не буду писать

Код: plaintext
1.
delta = Cur1.birthdate - Cur2.birthdate



я напишу

Код: plaintext
1.
deltaDays = GetDaysBetween(Cur1.birthdate, Cur2.birthdate)
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562269
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

А что касается смены доменов - сплошь и рядом. Это жизнь, а не косяк дизайна.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562297
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широковплохо говорить с верующими :-)
В моем случае это не вера, а опыт. Когда начинал писать на фоксе, параллельно про венгерскую нотацию вычитал, сначала решил что "бред заумных дядек", когда проекты стали побольше - пришел к выводу что не такой уж и бред. Опять же это опыт работы на фоксе меня в этому подвел. На С/С++ пишу немного, тут я вижу что мой алгоритм именования не совсем подходит, но и отказаться от него полностью пока не готов. Может если буду больше писать на С/С++ - пересмотрю свое отношение к этому вопросу.
В любом случае чужое мнение интересно как повод задуматься.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562306
SS_phone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я поддерживаю Дмитрия. Не ссорьтесь :( ушел спать, завтра буду учиться
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562414
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Для динамических языков, где тип переменной определяется выражением может этот способ чуть ли не единственный привнести порядок в анархию. А вот для строготипизированных языков префиксы уже является лишними, ИМХО. Но в любом случае, каждый выбирает для себя и здесь, если нет коорпоротивного стандарта кодирования, по большому счету вопрос предпочтения.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38562416
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SS_phone,

спи спокойно, дорогой товарищ. здесь никто не ссорится.
...
Рейтинг: 0 / 0
54 сообщений из 54, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 5.8 Массивы указателей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]