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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2009, 22:42   #1
Alexcomeback
Пользователь
 
Регистрация: 03.04.2009
Сообщений: 59
По умолчанию Указатели и переменные в функциях.

Здравствуйте уважаемые программисты!
Хотел бы задать такой вопрос...
Во время исполнения программы управление передаётся функции main (WinMain и другим), как только в них присутствует вызов другой функции, управление передаётся ей (за исключением ф-ий с inline), и когда происходит выход из неё, все локальные переменные устанавливаются в начальное положение (либо обнуляются), если они не Static, а как дело обстоит с указателями? Что происходит с ними? Они также меняют свои значения при завершении работы?

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

Код:
#include <stdio.h>
#include <conio.h>
#include <time.h>

   int rnd(int m) {
	   int* r, p;
	   static k ;
	   p=*r ;
	   r+=m ;
	   p*=*r ;
	   p>0?p/=2:p=-p ;
	   while (p>m)
			  p/=10 ;
	   if (p==k) {
		   r++ ;
		   p=*r ;
		   while (p>m)
				 p/=10 ;
	   }
	   k=p ;
	   p+=1 ;
	   return p ;
   }

void main (void) {
	int *p, n, m ;
	printf("Vvedite razmer massiva: ") ;
	scanf("%d", &n) ;
	printf("Vvedite diapazon:" ) ;
	scanf("%d", &m) ;
	p=new int[n] ;

	for (int i = 0; i < n; ++i) {
		 p[i]=rnd(m) ;
	}

	  for (int i = 0; i < n; ++i) {
		  printf(" %d ", p[i]) ;
	}

	delete[] p;

	getch() ;
}
ваши комментарии, замечания, советы, пинки)

Спасибо
Alexcomeback вне форума Ответить с цитированием
Старый 24.09.2009, 23:22   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

У меня программа вылетает И не странно, нельзя использовать неинициализированные указатели, они указывают обычно на область памяти, использовать которую нельзя, за счёт чего будут вылетать всякие AV и т.д.
netrino вне форума Ответить с цитированием
Старый 24.09.2009, 23:52   #3
Alexcomeback
Пользователь
 
Регистрация: 03.04.2009
Сообщений: 59
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
У меня программа вылетает И не странно, нельзя использовать неинициализированные указатели, они указывают обычно на область памяти, использовать которую нельзя, за счёт чего будут вылетать всякие AV и т.д.
Ключевое слово - использовать, то есть другими словами, изменять или перемещать, ни того ни другого я не делаю=) Я лишь считываю мусор из памяти, пытаясь из этого сделать а-ля рандом
Alexcomeback вне форума Ответить с цитированием
Старый 25.09.2009, 00:07   #4
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Я лишь считываю мусор из памяти, пытаясь из этого сделать а-ля рандом
А зачем изобретать такой непонятный велосипед? Вам мало rand() и srand() ?
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 25.09.2009, 00:08   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Читать тоже нельзя ) В ДОС такое прокатит, но не на современных ОС
netrino вне форума Ответить с цитированием
Старый 25.09.2009, 08:45   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
когда происходит выход из неё, все локальные переменные устанавливаются в начальное положение (либо обнуляются)
Более того - все локальные переменные при выходе из своей области видимости (например, при выходе из функции) уничтожаются, а при следующем вызове той же функции создаются заново, и заново же инициализируются, если в этой функции явно проводится инициализация. Это верно в том числе и для указателей.
У вас, кстати, указатели неинициализированы, так что рандом начинается уже с этого места!

З.Ы. Вы, однако, наворотили...
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же

Последний раз редактировалось Гром; 25.09.2009 в 08:59.
Гром вне форума Ответить с цитированием
Старый 28.09.2009, 20:11   #7
Alexcomeback
Пользователь
 
Регистрация: 03.04.2009
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
У вас, кстати, указатели неинициализированы, так что рандом начинается уже с этого места!
Ну так моя идея рандома на этом и строится))
Alexcomeback вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
Форматирование текста в функциях. shadrikoff Microsoft Office Excel 5 26.02.2009 08:13
Логические подстановки в формулах/функциях vprima Microsoft Office Excel 5 16.02.2009 16:42
Код в поцедурах и функциях! Jondeer Общие вопросы C/C++ 1 10.06.2008 18:16
Изменяемый диапазон массива в функциях slba Microsoft Office Excel 4 29.06.2007 19:10