Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2009, 16:50   #21
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Goblin
люди у кого Windows напишите мне вывод этой программы:
Код:
22ff74
22ff68
22ff64
MinGW (wxDev-C++ 7.0)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 25.04.2009 в 17:01.
Sazary вне форума Ответить с цитированием
Старый 25.04.2009, 16:57   #22
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

MS VC++ 2008:
Код:
12ff5c
12ff4c
12ff40
Из первого поста код в Debug вылетает с runtime error'ом. Говорит, что переменная name используется без инициализации. В Release версии выводит на экран семь единиц.

MS VC++ 2005:
Код:
12ff70
12ff74
12ff6c
По первому коду действует как и VC++ 2008, но выводит не 1, а 34

Последний раз редактировалось pu4koff; 25.04.2009 в 17:04.
pu4koff вне форума Ответить с цитированием
Старый 25.04.2009, 17:01   #23
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

VStudio 2005
Цитата:
12ff70
12ff74
12ff6c
Intel
Цитата:
12ff68
12ff60
12ff6c
Dev C++ Показал тоже самое что и у Sazary
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 25.04.2009, 17:13   #24
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Goblin, открывайте тайну задачи.
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 25.04.2009, 17:38   #25
Goblin
Форумчанин
 
Регистрация: 24.11.2007
Сообщений: 196
По умолчанию

Я щас все раскажу только откомпильте плз. вот эти две проги. Если они не сработают как надо тогда я глубоко заблуждаюсь если заработают правильно, есть смысл расказывать дальше.

Код:
#include <stdio.h>

int main()
{
	char i;
	char name[8] = "strange";
	
	for(i = 0; i<7; i++)
		printf("%x\n", name[8]);
	printf("\n");
	return 0;
}
Код:
#include <stdio.h>

int main()
{
	
	char name[8] = "strange";
	char i;
	for(i = 0; i<7; i++)
		printf("%x ", name[8]);
	printf("\n");
	return 0;
}
Goblin вне форума Ответить с цитированием
Старый 25.04.2009, 17:42   #26
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Первая:
Код:
70
70
70
70
70
70
70
Вторая:
Код:
ffffffb0 ffffffb0 ffffffb0 ffffffb0 ffffffb0 ffffffb0 ffffffb0
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.04.2009, 18:20   #27
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

MS VC++ 2005:
Первая:
Код:
34
34
34
34
34
34
34
Вторая:
Код:
34 34 34 34 34 34 34
MS VC++ 2008:
Первая:
Код:
1
1
1
1
1
1
1
Вторая:
Код:
1 1 1 1 1 1 1
pu4koff вне форума Ответить с цитированием
Старый 25.04.2009, 18:22   #28
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Goblin
Ты заблуждаешься, если думаешь, что программа обязана выводить числа от 0 до 6.
still_alive вне форума Ответить с цитированием
Старый 25.04.2009, 18:25   #29
Goblin
Форумчанин
 
Регистрация: 24.11.2007
Сообщений: 196
По умолчанию

Цитата:
Ты заблуждаешься, если думаешь, что программа обязана выводить числа от 0 до 6.
Я с тобой польностю согласен. Первая программа не выводит. А вторая выводит, но только в Linux. Здесь я не много затупил.

Объясняю что я имел ввиду задавая задачу.

Так как объявление i следует за объявлением name(с учетом того, конечо, что name занимает 8 байт), то по логике вещей в памяти они распалагаются также, друг за другом(как выясниться позже: они расположены друг за другом но в обратном порядке), по этому
в первом варианте программы выводиться содержимое переменное i на протижении всего цикла. Но это работает только под Linux компилятор gcc .

А в Windows не работает, судя по предыдущим постам. Я предположил что в Windows порядок зополнения стека(или просто расположение переменных в памяти) обратен порядку в Linux, поэтому поменял объявления местами. Но как выяснилось из тех же предыдущих постов это не так.

Вывод DevC++ и Visual2008 показал что в мамяти между переменными есть промежутки(это подтверждает последний пост Sazary), которых нет при компиляции с помощью Visual2005, Intel, GCC
Код:
#include <stdio.h>

int main()
{
	char i;
	char name[8] = "strange";
	
	for(i = 0; i<7; i++)
		printf("%x\n", name[8]);
	printf("\n");
	return 0;
}
Код:
#include <stdio.h>

int main()
{
	
	char name[8] = "strange";
	char i;
	for(i = 0; i<7; i++)
		printf("%x ", name[8]);
	printf("\n");
	return 0;
}
В первой программе адресация такова:
Цитата:
bf8edc7b - name[0]
bf8edc7c - name[1]
bf8edc7d - name[2]
bf8edc7e - name[3]
bf8edc7f - name[4]
bf8edc80 - name[5]
bf8edc81 - name[6]
bf8edc82 - name[7]
bf8edc83 - i
Следовательно name[8] указывает на i;

Во втором случае:
Цитата:
bfb9772b - i
bfb9772c - name[0]
bfb9772d - name[1]
bfb9772e - name[2]
bfb9772f - name[3]
bfb97730 - name[4]
bfb97731 - name[5]
bfb97732 - name[6]
bfb97733 - name[7]
здесь name[8] имеет адрес bfb97734.

Эти две программы отличаються от первой только тем что i - char а не int. Так меньше проблем связанных с тем что int занимает от 32 до 64 бит.

Моей главной ошибкой было то что я не учел то что в разный компиляторах и разных ОС разный способ расположения переменных в памяти. Поэтому эту задачу нужно адаптировать отдельно для каждого случая.

Последний раз редактировалось Goblin; 25.04.2009 в 18:29.
Goblin вне форума Ответить с цитированием
Старый 25.04.2009, 18:36   #30
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

Вы будете удивлены, но в MS VC++ 2008 вот этот код:
Код:
char name[8] = "strange";
char i;
for(i = 0; i<7; i++)
	printf("%x ", &name[i]);
printf("%x ", &i);
printf("\n");
и вот этот:
Код:
char i;
char name[8] = "strange";
for(i = 0; i<7; i++)
	printf("%x ", &name[i]);
printf("%x ", &i);
printf("\n");
Выводят на экран совершенно одинаковые адреса (i всегда по адресу name[-1]). Вероятно оптимизатор что-то мутит. Так что не стоит расчитывать на порядок объявления переменных
Или Вы это и имели ввиду?
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц