Member 12089997 Ответов: 3

Почему выход имеет x+48 (x - каждый элемент в строке) в данной программе C для замены страницы FIFO?


Почему выход имеет x+48 (x - каждый элемент в строке) в данной программе C для замены страницы FIFO?

Что я уже пробовал:

#include<stdio.h>
int n;
char pg[]="70120304230321201701";

void main()
{

	int i,len,f,r,s,count,flag,num,psize;
	int fr[10];

	f=0;
	r=0;
	s=0;
	flag=0;
	count=0;
    for(len=0;pg[len]!='\0';len++)
    n++;
    printf("The length of the string is %d",n);

	printf("\nEnter size of page frame:");
	scanf("%d",&psize);

	for(i=0;i<psize;i++)
	{
		fr[i]=0;
	}
	while(s<n)
	{
		flag=0;
		num=pg[s];
		for(i=0;i<psize;i++)
		{
			if(num==fr[i])
			{
				s++;
				flag=1;
				break;
			}
		}
		if(flag==0)
		{
			if(r<psize)
			{
				fr[r]=pg[s];
				r++;
				s++;
				count++;
			}
			else
			{
				if(f<psize)
				{
					fr[f]=pg[s];
					s++;
					f++;
					count++;
				}
				else
					f=0;
			}
		}
		printf("\n");
		for(i=0;i<psize;i++)
		{
			printf("%d\t",fr[i]);
		}
	}
printf("\nPage Faults=%d",count);
getchar();
}

[no name]

Пора научиться пользоваться отладчиком.

Rick York

Я не собираюсь отлаживать ваш код для вас, потому что это не поможет вам ничему научиться. Я удивлен, что ваш компилятор не выдал предупреждающего сообщения. Вы должны установить его на очень низком уровне. Я всегда ставлю свой на 4, самый высокий, для кода,который я написал или принимаю. Несмотря на это, на первой странице списка кода я вижу одну проблему, которая несколько маскируется неправильным уровнем отступа: переменная n используется и не инициализируется.

Это поднимает одну из моих любимых обид. Во-первых, я стараюсь избегать использования глобальных переменных, потому что они могут вызвать всевозможные головные боли, особенно в многопоточных приложениях. Когда я действительно использую их, я, как минимум, всегда пишу заглавную букву переменной. Часто я оборачиваю их в пространство имен, обычно называемое глобальным. Конечно, пространства имен недоступны в языке Си, но вы можете приблизить их к структуре, называемой глобальной. В любом случае, " n " - это самое худшее имя, которое можно выбрать для глобальной переменной.

3 Ответов

Рейтинг:
1

OriginalGriff

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

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

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

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, Google ищет отладчик в среде разработки, которую вы используете, и запускает ваше приложение через отладчик. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!

И сделай себе пару одолжений:
1) прекратите использовать односимвольные имена переменных - они подвержены ошибкам и затрудняют понимание и модификацию кода, особенно если он раскомментирован, как ваш. Используйте имена, которые описывают, для чего существует переменная!
2) Сделайте правильный отступ в своем коде и - конечно, пока вы начинаете - используйте набор фигурных скобок везде, где только можете. Это означает, что если вы пишете if, или for, или while, вы добавляете фигурные скобки, даже если вы помещаете только одну строку внутри ветви. С первого взгляда не очевидно, какую часть этого кода Вы намеревались поместить в цикл:
for(len=0;pg[len]!='\0';len++)
n++;
printf("The length of the string is %d",n);

printf("\nEnter size of page frame:");
scanf("%d",&psize);

for(i=0;i<psize;i++)
{
    fr[i]=0;
}
Но на практике это всего лишь одна строчка:
n++;
Сделайте правильный отступ и используйте скобки, и это очевидно:
for(len=0;pg[len]!='\0';len++)
    {
    n++;
    }
printf("The length of the string is %d",n);
printf("\nEnter size of page frame:");
scanf("%d",&psize);
for(i=0;i<psize;i++)
    {
    fr[i]=0;
    }

3) Как предложил Рик Йорк, всегда устанавливайте уровень предупреждений как можно выше - я использую 4 - а также установите "рассматривать предупреждения как ошибки", чтобы компиляция не удалась даже с "тривиальным" предупреждением. Когда вы начинаете, предупреждения, как правило, указывают на то, что вы действительно совершили большую ошибку и должны ее исправить!


Рейтинг:
1

bling

В дополнение к замечательным предложениям выше, вам нужно понять ASCII и разницу между ASCII zero '0' и ASCII nul '\0'.

Значение ASCII для нуля равно 48. Там два утверждения являются двоичными эквивалентами.

char pg[]="70120304230321201701";

char pg[]={55,48,49,50,48,51,48,52,50,51,48,51,50,49,50,48,49,55,48,49,0};


Чтобы подкрепить комментарии Рика Йорка о глобальных переменных - по крайней мере, ограничьте их областью действия файла, объявив их статическими.

Последний совет-узнайте, как использовать оператор sizeof.


Рейтинг:
0

Patrice T

for(len=0;pg[len]!='\0';len++)
    n++;

Здесь вы используете n находить pg длина, проблема в том, что вы забыли инициализировать его. Хорошая привычка-всегда инициализировать переменные.


Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.