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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2013, 21:57   #1
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию c++ нарушение прав доступа при чтении по адресу 0x00000000

есть код
выдает эту ошибку при вводе CurrentYear
Код:
// ConsoleApplication51.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#include <Windows.h>
#include <locale.h>
typedef struct Worker
{
int YearOfEnter;
char post[30];
char NameOfWorker[30];
struct Worker *next;// ссылка на следующий элемент
}info;


info *f    = (info*)malloc(sizeof(info));// выделяем место под первый элемент
info *r    = (info*)malloc(sizeof(info));// -//-           под второй элемент 
info *last  =(info*)malloc(sizeof(info));// -//-        под последний элемент
// найти работника по заданному году

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_CTYPE,"rus");
	int CurrentYear(0);
	f->next = r;
	r->next = last;
	last->next = NULL;
     f->post == "валера";
	 f->NameOfWorker=="валера";
	 r->NameOfWorker == "лалка";
	 r->post == "лалка";
	 last->NameOfWorker == "траллина";
	 last->post == "траллина";

	
	f    ->YearOfEnter = 2010;
	r    ->YearOfEnter = 2009;
	last ->YearOfEnter = 2011;
	

	
	for (int i= 0;i<3;i++)
	{
	std::cout<<f->YearOfEnter;

	f  = f->next;
	}
	
	/* вводим нужный год*/
	
		std::cout<<"\n"<<"введите нужный год"<<"\n";
		scanf("%d",&CurrentYear);
	
	
	
	
	
	for (int i=0;i<3;i++)
	{
		if(CurrentYear == f ->YearOfEnter)
		{
		  std::cout<<f->YearOfEnter;
		  std::cout<<f->post;
		  std::cout<<f->NameOfWorker;
		  
		}
	 
	f = f->next;
	
	}



	free(f);
	free(r);
	free(last);
	getchar();
	return 0;
}
proef вне форума Ответить с цитированием
Старый 05.09.2013, 22:30   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
int CurrentYear(0);
Это инициализация или вызов конструктора?
Может лучше так:
Код:
int CurrentYear=0;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.09.2013, 22:43   #3
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

и так и так можно просто так привычнее
на всякий случай поменял - всё равно тоже самое
proef вне форума Ответить с цитированием
Старый 05.09.2013, 22:56   #4
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

может так немного понятней будет)
Изображения
Тип файла: png фото.png (23.5 Кб, 11 просмотров)
proef вне форума Ответить с цитированием
Старый 05.09.2013, 23:20   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Писал быстро (могут быть утечки памяти или можно написать проще и правильнее):
Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#include <Windows.h>
#include <locale.h>

using namespace std;

typedef struct Worker
{
    int YearOfEnter;
    char post[30];
    char NameOfWorker[30];
    struct Worker *next;
} info;

void
add(info* &f, info* &l, info *t)
{
    if (f) {
        l->next = t;
        l = t;
    } else {
        f = l = t;
    }
}

int
main(int argc, char* argv[])
{
    setlocale(LC_CTYPE,"rus");

    int CurrentYear = 0;
    info *first, *last, *tmp;
    first = last = NULL;

    tmp = new info;
    strcpy(tmp->post, "валера");
    strcpy(tmp->NameOfWorker, "валера");
    tmp->YearOfEnter = 2010;
    tmp->next = NULL;
    add(first, last, tmp);

    tmp = new info;
    strcpy(tmp->post, "лалка");
    strcpy(tmp->NameOfWorker, "лалка");
    tmp->YearOfEnter = 2009;
    tmp->next = NULL;
    add(first, last, tmp);

    tmp = first;
    while (tmp) {
        cout << tmp->YearOfEnter << endl;
        tmp = tmp->next;
    }

    cout << "Введите нужный год" << endl;
    cin >> CurrentYear;

    tmp = first;
    while (tmp && tmp->YearOfEnter != CurrentYear) {
        tmp = tmp->next;
    }
    if (tmp) {
        cout << tmp->YearOfEnter << endl << tmp->post << endl << tmp->NameOfWorker;
    } else {
        cout << "NULL" << endl;
    }

    while (first) {
        tmp = first;
        first = first->next;
        delete tmp;
    }

    getchar();
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 05.09.2013 в 23:23.
BDA на форуме Ответить с цитированием
Старый 05.09.2013, 23:30   #6
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

работает то-есть всё было в присваивании char элементов ? да и ещё :как сделать чтобы количество элементов можно было вводить с клавиатуры? заранее спасибо

Последний раз редактировалось proef; 05.09.2013 в 23:35.
proef вне форума Ответить с цитированием
Старый 05.09.2013, 23:46   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#include <Windows.h>
#include <locale.h>

using namespace std;

typedef struct Worker
{
    int YearOfEnter;
    char post[30];
    char NameOfWorker[30];
    struct Worker *next;
} info;

void
add(info* &f, info* &l, info *t)
{
    if (f) {
        l->next = t;
        l = t;
    } else {
        f = l = t;
    }
}

int
main(int argc, char* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    int CurrentYear = 0, n = 0;
    info *first, *last, *tmp;
    first = last = NULL;

    cout << "Введите количество" << endl;
    cin >> n;

    for (int i = 0; i < n; ++i) {
        tmp = new info;
        cin >> tmp->post >> tmp->NameOfWorker >> tmp->YearOfEnter;
        tmp->next = NULL;
        add(first, last, tmp);
    }

    tmp = first;
    while (tmp) {
        cout << tmp->YearOfEnter << endl;
        tmp = tmp->next;
    }

    cout << "Введите нужный год" << endl;
    cin >> CurrentYear;

    tmp = first;
    while (tmp && tmp->YearOfEnter != CurrentYear) {
        tmp = tmp->next;
    }
    if (tmp) {
        cout << tmp->YearOfEnter << endl << tmp->post << endl << tmp->NameOfWorker;
    } else {
        cout << "NULL" << endl;
    }

    while (first) {
        tmp = first;
        first = first->next;
        delete tmp;
    }

    getchar();
    return 0;
}
Теперь данные вводятся с клавиатуры.
Вообще-то дело было не в присваивании (которое в Вашем коде было сравнением). Вы "портили" указатель f, а потом пытались обратиться к полю.

UPD
Пожалуйста.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 05.09.2013 в 23:52.
BDA на форуме Ответить с цитированием
Старый 05.09.2013, 23:49   #8
proef
Форумчанин
 
Регистрация: 08.06.2013
Сообщений: 133
По умолчанию

Спасибо огромное ,
и спасибо за ссылку про динамические списки ,теперь я понял как они работают))

Последний раз редактировалось proef; 06.09.2013 в 00:00.
proef вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарушение прав доступа при чтении Павел Гайдаржи Помощь студентам 0 11.11.2012 19:45
Нарушение прав доступа Simito Общие вопросы C/C++ 1 03.06.2011 12:06
Нарушение прав доступа Hemul Qt и кроссплатформенное программирование С/С++ 1 08.04.2011 20:02
Нарушение прав доступа при чтении попытка вторая Farrel Общие вопросы C/C++ 5 24.02.2011 12:01
нарушение прав доступа при чтении Farrel Общие вопросы C/C++ 1 22.02.2011 00:32