powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Простой вопрос по языку C
31 сообщений из 31, показаны все 2 страниц
Простой вопрос по языку C
    #38819529
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В справочнике Шилдта по языку C есть такой пример:
Код: 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.
char *dic[][40] = {
"atlas", "The book of the map.",
"car", "Transport with gas engine.",
"phone", "Item for connection.",
"airplane", "Flying machine.",
"", ""
};

int dictionary()
{
	char word[80], ch;
	char **p;

	do
	{
		puts("\nInput word: ");
		scanf("%s", word);

		p = (char **)dic;

		do
		{
			if (!strcmp(*p, word))
			{
				puts("The sence of the word: ");
				puts(*(p+1));
				break;
			}
			//if (!strcmp(*p, word)) break;
			p += 2;
		} while (*p);

		if (!*p)
			puts("The word isn't found in the dictionary.");
		printf("Do you want to serch an another word? (y/n): ");
		scanf(" %c%*c", &ch);

	} while (toupper(ch) != 'N');

	return 0;
}


Зачем тут закоментированная строка? В книге она не закоментирована.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #38819557
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NET,
скорее всего опечатка
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #38819562
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у нас есть
Код: plaintext
1.
2.
3.
4.
5.
do
{
   if(A) {...; break;}
   if(A) {break;}
}



если первое условие выполнится произойдёт переход к проверке условия цикла,второе условие не выполнится. Если первое условие не выполнится, то и второе условие не выполнится, ибо А=А.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #38819565
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошу прощение, break вообще переводит выполнение программы из цикла.
Впрочем смысл рассуждений выше не сильно меняется.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #38819581
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я больше с этого поржал
Код: plaintext
1.
char *dic[][40] = {"atlas", "The book of the map.",...};


Зачем ему тут нужен двухмерный массив строк, если дальше в коде он все равно его использует как одномерный, для чего пришлось даже явное приведение типа делать ? :)

Думаю, что Шилдта - в топку. Ничему хорошему он не научит.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #38819596
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЯ больше с этого поржал
Код: plaintext
1.
char *dic[][40] = {"atlas", "The book of the map.",...};


Зачем ему тут нужен двухмерный массив строк, если дальше в коде он все равно его использует как одномерный, для чего пришлось даже явное приведение типа делать ? :)

Думаю, что Шилдта - в топку. Ничему хорошему он не научит.

тоже не понял зачем тут char***
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #38819715
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryAnatoly MoskovskyЯ больше с этого поржал
Код: plaintext
1.
char *dic[][40] = {"atlas", "The book of the map.",...};


Зачем ему тут нужен двухмерный массив строк, если дальше в коде он все равно его использует как одномерный, для чего пришлось даже явное приведение типа делать ? :)

Думаю, что Шилдта - в топку. Ничему хорошему он не научит.

тоже не понял зачем тут char***

Я тоже не понял. Можно было так:
Код: 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.
char dic1[][40] = {
	"atlas", "A book of the map.",
	"car", "A transport with a gas engine.",
	"phone", "An item for connection.",
	"airplane", "A flying machine.",
	"", ""
};

int dictionary1()
{
	char word[40], ch;
	char (*p)[40];

	do
	{
		puts("\nInput word: ");
		scanf("%s", word);

		p = dic1;

		do
		{
			if (!strcmp(*p, word))
			{
				puts("The sence of the word: ");
				puts(*(p + 1));
				break;
			}
			p += 2;
		} while (**p);

		if (!**p)
			puts("The word isn't found in the dictionary.");
		printf("Do you want to serch an another word? (y/n): ");
		scanf(" %c%*c", &ch);

	} while (toupper(ch) != 'N');

	return 0;
}



Количество символов в программе примерно тоже. ) Но без явного приведения.
Возможно в его варианте меньше операций разадресации.
Тут при каждой проверке p на ноль приходится дважды переходить по адресу.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #38819742
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Число 40 в этом алгоритме лишнее.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #38819750
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETКоличество символов в программе примерно тоже. ) Но без явного приведения.
Возможно в его варианте меньше операций разадресации.
Тут при каждой проверке p на ноль приходится дважды переходить по адресу.

А, так dic можно просто объявить, как char *dic[40], а p как char **p.
И не надо будет два раза переходить по адресу при проверке p на ноль.
И приведение типов не нужно.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39104419
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос не по C, а по C++, запощу сюда чтобы темы не плодить.
Встретил в книге вот такой код.
Код: plaintext
1.
2.
3.
ofstream out(test);
double num = 100.45;
out.write(reintertpret_cast<char*>(&num), sizeof(double));



Причём тут sizeof(double) в последнем операторе?
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39104424
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETПричём тут sizeof(double) в последнем операторе?
Ну так num же double. Правильнее было бы, конечно, sizeof(num), но и так сойдёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39104535
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЯ больше с этого поржал
Код: plaintext
1.
char *dic[][40] = {"atlas", "The book of the map.",...};


Зачем ему тут нужен двухмерный массив строк, если дальше в коде он все равно его использует как одномерный, для чего пришлось даже явное приведение типа делать ? :)

Думаю, что Шилдта - в топку. Ничему хорошему он не научит.

Да, у него дурная слава...
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39104538
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETВопрос не по C, а по C++, запощу сюда чтобы темы не плодить.
Встретил в книге вот такой код.
Код: plaintext
1.
2.
3.
ofstream out(test);
double num = 100.45;
out.write(reintertpret_cast<char*>(&num), sizeof(double));



Причём тут sizeof(double) в последнем операторе?

Это вывод байт, составляющих значение типа double.
Функция out.write имеет два параметра: адрес бинарного буфера, и его размер, в батах.
Вот этот размер в байтах sizeof и задаёт.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39104544
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странный код.

Код: 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.
char *dic[][40] = {
"atlas", "The book of the map.",
"car", "Transport with gas engine.",
"phone", "Item for connection.",
"airplane", "Flying machine.",
"", ""
};

int dictionary()
{
	char word[80], ch;
	char **p;

	do
	{
		puts("\nInput word: ");
		scanf("%s", word);

		p = (char **)dic;

		do
		{
			if (!strcmp(*p, word))
			{
				puts("The sence of the word: ");
				puts(*(p+1));
				break;
			}
			//if (!strcmp(*p, word)) break;
			p += 2;
		} while (*p);

		if (!*p)
			puts("The word isn't found in the dictionary.");
		printf("Do you want to serch an another word? (y/n): ");
		scanf(" %c%*c", &ch);

	} while (toupper(ch) != 'N');

	return 0;
}




Типа ассоциативный массив (т.е. map).
Но на спичках.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39104801
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv.NETВопрос не по C, а по C++, запощу сюда чтобы темы не плодить.
Встретил в книге вот такой код.
Код: plaintext
1.
2.
3.
ofstream out(test);
double num = 100.45;
out.write(reintertpret_cast<char*>(&num), sizeof(double));



Причём тут sizeof(double) в последнем операторе?

Это вывод байт, составляющих значение типа double.
Функция out.write имеет два параметра: адрес бинарного буфера, и его размер, в батах.
Вот этот размер в байтах sizeof и задаёт.
Определение функции как оно дано в той же книге.
write(buf, n) - записывает в поток n символов из массива buf.
Каким боком соотносятся число символов в строке "100.45" и sizeof(double), который вообще константа.
Или тут так и задумано выводить всегда одно и то же число символов вне зависимости от того чему равно
num 100.45 или 340000.67854?
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39104838
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETMasterZiv Это вывод байт, составляющих значение типа double.
Функция out.write имеет два параметра: адрес бинарного буфера, и его размер, в батах.
Вот этот размер в байтах sizeof и задаёт.
Определение функции как оно дано в той же книге.
write(buf, n) - записывает в поток n символов из массива buf.
Каким боком соотносятся число символов в строке "100.45" и sizeof(double), который вообще константа.
Или тут так и задумано выводить всегда одно и то же число символов вне зависимости от того чему равно
num 100.45 или 340000.67854?обрати внимание на выделенное в цитате MasterZiv.
вот это:
Код: plaintext
1.
out.write(reintertpret_cast<char*>(&num), sizeof(double));

не запишет в поток строку "100.45", оно запишет байты, из которых состоит число 100.45. Это - две большие разницы, от слова "вообще".
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39104908
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETОпределение функции как оно дано в той же книге.
write(buf, n) - записывает в поток n символов из массива buf.


Оно записывает не символы, а бинарные байты в поток .
В данном случае объявление первого параметра char* вводит в заблуждение немного -- но в С++ байты и символы -- это одно и то же.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39104945
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv.NETОпределение функции как оно дано в той же книге.
write(buf, n) - записывает в поток n символов из массива buf.


Оно записывает не символы, а бинарные байты в поток .
В данном случае объявление первого параметра char* вводит в заблуждение немного -- но в С++ байты и символы -- это одно и то же.
Понял. Именно это меня и ввело в заблуждение.
Почему интересно используется указатель на char, а не на void?
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39105066
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETMasterZivпропущено...


Оно записывает не символы, а бинарные байты в поток .
В данном случае объявление первого параметра char* вводит в заблуждение немного -- но в С++ байты и символы -- это одно и то же.
Понял. Именно это меня и ввело в заблуждение.
Почему интересно используется указатель на char, а не на void? char это как правило байт. если смотреть на write(char * b, int n) то можно догадаться и легко документировать, что функция запишет в файл массив char[n].

если взять гипотетическую функцию write___(void *b, int n), то как бы массив void[n] объявить невозможно - void не имеет размера. а итоге мы возвращается к (void*)char[n].
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39107893
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab.NETпропущено...

Понял. Именно это меня и ввело в заблуждение.
Почему интересно используется указатель на char, а не на void? char это как правило байт. если смотреть на write(char * b, int n) то можно догадаться и легко документировать, что функция запишет в файл массив char[n].

если взять гипотетическую функцию write___(void *b, int n), то как бы массив void[n] объявить невозможно - void не имеет размера. а итоге мы возвращается к (void*)char[n].
Да, а вообще странно, что в C нет типа byte. Казалось бы это тот самый элементарный кирпичик
не зависящий от реализации, из которого всё должно строится.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39107898
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETвообще странно, что в C нет типа byte
Есть int8_t/uint8_t. Эстеты могут использовать typedef unsigned char byte.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39107928
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETДа, а вообще странно, что в C нет типа byte. Казалось бы это тот самый элементарный кирпичик
не зависящий от реализации, из которого всё должно строится. Полагаю, "C" реализован не только на двоичных компьютерах, поэтому привязанность к байту (8bit) ограничит переносимость кода.
А так, char это всего лишь абстрактный (в смысле не привязанный к аппаратным особенностям) тип с диапазоном целых значений не меньше чем -128 .. 127. На ЭВМ с экзотической архитектурой может быть больше, но не меньше.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39107965
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabтип с диапазоном целых значений не меньше чем -128 .. 127.
Это signed char. Несколько другой тип. Местами даже несовместимый с двумя остальными.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39108207
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab.NETДа, а вообще странно, что в C нет типа byte. Казалось бы это тот самый элементарный кирпичик
не зависящий от реализации, из которого всё должно строится. Полагаю, "C" реализован не только на двоичных компьютерах, поэтому привязанность к байту (8bit) ограничит переносимость кода.
А так, char это всего лишь абстрактный (в смысле не привязанный к аппаратным особенностям) тип с диапазоном целых значений не меньше чем -128 .. 127. На ЭВМ с экзотической архитектурой может быть больше, но не меньше.Ты все перепутал.
На самом деле, байт это не 8 бит, а минимальный размер обрабатываемый процессором.
Char это не абстрактный тип.
K&R, 2.2 Data Types and Sizeschar a single byte, capable of holding one character in the local character setТак что char может быть и больше, и меньше восьми бит.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39108213
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETMasterZivпропущено...


Оно записывает не символы, а бинарные байты в поток .
В данном случае объявление первого параметра char* вводит в заблуждение немного -- но в С++ байты и символы -- это одно и то же.
Понял. Именно это меня и ввело в заблуждение.
Почему интересно используется указатель на char, а не на void?

Потому что такое понятие ИТ, как "байт" в языке С++ выражается в виде типа char .
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39108215
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETmcureenabпропущено...
char это как правило байт. если смотреть на write(char * b, int n) то можно догадаться и легко документировать, что функция запишет в файл массив char[n].

если взять гипотетическую функцию write___(void *b, int n), то как бы массив void[n] объявить невозможно - void не имеет размера. а итоге мы возвращается к (void*)char[n].
Да, а вообще странно, что в C нет типа byte. Казалось бы это тот самый элементарный кирпичик
не зависящий от реализации, из которого всё должно строится.

Так есть , только называется он -- char
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39108220
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivтолько называется он -- char
Есть три типа в С: char, signed char и unsigned char. Это три разных типа и к byte
относится только один из них.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39108227
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivтолько называется он -- char
Есть три типа в С: char, signed char и unsigned char. Это три разных типа и к byte
относится только один из них.


Неа.. Это два типа и один синоним к одному из вышеперечисленных.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39108233
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЕсть три типа в С: char, signed char и unsigned char. Это три разных типа и к byte
относится только один из них.
На самом деле типа byte не существует. Байт это размер, а не тип.
Существует разная интерпретация (или несколько) содержимого байта с точки зрения языков.
А то что в некоторых языках одна из этих интерпретаций называется byte - бог им судья )))
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39108346
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlK&R, 2.2 Data Types and Sizeschar a single byte, capable of holding one character in the local character setТак что char может быть и больше, и меньше восьми бит. Да. Точно. Спасибо. В коммуникациях 8бит называют октетом. А размер байта вообще говоря зависит от ЭВМ.
...
Рейтинг: 0 / 0
Простой вопрос по языку C
    #39108348
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyDimitry SibiryakovЕсть три типа в С: char, signed char и unsigned char. Это три разных типа и к byte
относится только один из них.
На самом деле типа byte не существует. Байт это размер, а не тип.
Существует разная интерпретация (или несколько) содержимого байта с точки зрения языков.
А то что в некоторых языках одна из этих интерпретаций называется byte - бог им судья )))
Но ведь от интерпретации, значение байта не меняется. char forever.

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


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