powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 5.8 Массивы указателей
25 сообщений из 54, страница 2 из 3
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
25 сообщений из 54, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 5.8 Массивы указателей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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