Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Простой вопрос по языку C / 25 сообщений из 31, страница 1 из 2
28.11.2014, 13:46
    #38819529
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
В справочнике Шилдта по языку 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
28.11.2014, 13:56
    #38819557
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.NET,
скорее всего опечатка
...
Рейтинг: 0 / 0
28.11.2014, 14:00
    #38819562
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
у нас есть
Код: plaintext
1.
2.
3.
4.
5.
do
{
   if(A) {...; break;}
   if(A) {break;}
}



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


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

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


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

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

тоже не понял зачем тут char***
...
Рейтинг: 0 / 0
28.11.2014, 15:33
    #38819715
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
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
28.11.2014, 15:46
    #38819742
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
Число 40 в этом алгоритме лишнее.
...
Рейтинг: 0 / 0
28.11.2014, 15:54
    #38819750
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.NETКоличество символов в программе примерно тоже. ) Но без явного приведения.
Возможно в его варианте меньше операций разадресации.
Тут при каждой проверке p на ноль приходится дважды переходить по адресу.

А, так dic можно просто объявить, как char *dic[40], а p как char **p.
И не надо будет два раза переходить по адресу при проверке p на ноль.
И приведение типов не нужно.
...
Рейтинг: 0 / 0
16.11.2015, 13:34
    #39104419
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
Вопрос не по 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
16.11.2015, 13:37
    #39104424
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.NETПричём тут sizeof(double) в последнем операторе?
Ну так num же double. Правильнее было бы, конечно, sizeof(num), но и так сойдёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.11.2015, 14:38
    #39104535
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
Anatoly MoskovskyЯ больше с этого поржал
Код: plaintext
1.
char *dic[][40] = {"atlas", "The book of the map.",...};


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

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

Да, у него дурная слава...
...
Рейтинг: 0 / 0
16.11.2015, 14:41
    #39104538
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.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
16.11.2015, 14:48
    #39104544
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку 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;
}




Типа ассоциативный массив (т.е. map).
Но на спичках.
...
Рейтинг: 0 / 0
16.11.2015, 17:38
    #39104801
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
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
16.11.2015, 18:06
    #39104838
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.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
16.11.2015, 18:53
    #39104908
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.NETОпределение функции как оно дано в той же книге.
write(buf, n) - записывает в поток n символов из массива buf.


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


Оно записывает не символы, а бинарные байты в поток .
В данном случае объявление первого параметра char* вводит в заблуждение немного -- но в С++ байты и символы -- это одно и то же.
Понял. Именно это меня и ввело в заблуждение.
Почему интересно используется указатель на char, а не на void?
...
Рейтинг: 0 / 0
16.11.2015, 23:50
    #39105066
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.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
19.11.2015, 15:50
    #39107893
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
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
19.11.2015, 15:55
    #39107898
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.NETвообще странно, что в C нет типа byte
Есть int8_t/uint8_t. Эстеты могут использовать typedef unsigned char byte.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.11.2015, 16:09
    #39107928
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.NETДа, а вообще странно, что в C нет типа byte. Казалось бы это тот самый элементарный кирпичик
не зависящий от реализации, из которого всё должно строится. Полагаю, "C" реализован не только на двоичных компьютерах, поэтому привязанность к байту (8bit) ограничит переносимость кода.
А так, char это всего лишь абстрактный (в смысле не привязанный к аппаратным особенностям) тип с диапазоном целых значений не меньше чем -128 .. 127. На ЭВМ с экзотической архитектурой может быть больше, но не меньше.
...
Рейтинг: 0 / 0
19.11.2015, 16:30
    #39107965
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
mcureenabтип с диапазоном целых значений не меньше чем -128 .. 127.
Это signed char. Несколько другой тип. Местами даже несовместимый с двумя остальными.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.11.2015, 19:27
    #39108207
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
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
19.11.2015, 19:32
    #39108213
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос по языку C
.NETMasterZivпропущено...


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

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


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