Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.78
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
#1

Указатели на структуры - C++

06.11.2010, 18:20. Просмотров 7781. Ответов 104
Метки нет (Все метки)

Pascal
1
2
3
4
5
type  celltype = record 
elетеt: integer; 
next: ^celltype 
end; 
DICTIONARY = array[0..B-1]  of  ^celltype;
какой аналог этой записи будет на си?
C++
1
2
3
4
5
6
7
typedef struct spis
{
    char *s;
    spis *next;
};
 
typedef struct spis *dict[maxn];
такой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2010, 18:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели на структуры (C++):

Указатели на структуры - C++
Подскажите в чем ошибка...Дело в том когда я в вожу в каждое поле по 1 значению все нормально выводит,но если при в вводе в поле я пишу два...

Указатели и структуры - C++
Здравия желаю. Подскажите пожалуйста каким образом осуществляется доступ к полю структуры, если оно является указателем?

Структуры и указатели - C++
Задался парой вопросов. Возможно, уже где-то задавались, поэтому прошу прощения заранее. Ниже описана структура для однонаправленного...

Указатели и структуры - C++
Здравствуйте. Подскажите, пожалуйста, почему не меня среда ругается. error C2440: =: невозможно преобразовать "Book *" в...

Структуры и указатели - C++
Привет форумчане, столкнулся вот с такой вот задачкой на структуры: 1. Описать структуру с именем PRICE, содержащую следующие поля: -...

Структуры и указатели на структуры - C++
Так ли я сделал? #include <iostream> struct S { int i; }; void f1(S*s1,int k=0){ s1->i=k;};

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Artishok
13.11.2010, 02:43  [ТС]     Указатели на структуры
  #46

Не по теме:

значит мне труба во вторник.ну что ж...пора спать

accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 02:51 #47
Цитата Сообщение от Artishok
т.е строка удалится
как это она удалится, а ты расчитываешь туда константы записывать ?
а как ты будешь формировать строки, прямо в исходнике ?

Добавлено через 6 минут
тебе нужно данные вводить, ты константы не введёшь никак, они компилируются один раз
значит тебе нужно вводить в массив, а если ты будешь сохранять в узел указатель на массив, то у тебя во всех узлах будет одно и то же значение (самое последнее из введённых в массив)

из-за этого создаются копии строк, чтобы массив можно было дальше юзать, а строки в таблице не менялись из-за него, копии создают с выделением памяти, а выделенную память всегда нужно освобождать, когда она больше не используется (иначе память у программы растёт и не уменьшается)

у тебя было всё сделано, кроме ввода и массива соответствующего
ты не понимал, что по указателю, который ещё никуда не указывает, нельзя ничего писать
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
13.11.2010, 15:03  [ТС] #48
Цитата Сообщение от accept Посмотреть сообщение
она больше не используется (иначе память у программы растёт и не уменьшается)
сборщика мусора не хватает

Добавлено через 18 минут
Цитата Сообщение от accept Посмотреть сообщение
ты не понимал, что по указателю, который ещё никуда не указывает, нельзя ничего писат
то есть надо
C++
1
char s1[15];cin>>s1;
а указатель в функции использовать?
но если не изменять ничего кроме ввода то insert(s1,d) вылетает с ошибкой тоже.


я понял почему новый вариант неправильный.
у меня создавался список но при этом он не был связан с хеш-таблицей т.к. не имел кода
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 15:17 #49
C++
1
2
    char s1[15];
    cin >> s1;
можно и так

C++
1
2
3
4
    char s1[15], *p;
 
    p = s1;
    cin >> p;
и так

дальше функция insert, получая строку, делает её копию
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
14.11.2010, 16:35  [ТС] #50
и все равно с ошибкой вылетает

Добавлено через 5 часов 8 минут

Не по теме:

никогда не увижу рабочей программы...блин.из-за чего она вылетает!?



Добавлено через 19 часов 54 минуты

Не по теме:

accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.11.2010, 22:50 #51
ну что, продвинулся как-нибудь ?
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
15.11.2010, 00:21  [ТС] #52
добавил только функцию вывода значений.
но почему вылетает понять не могу.
вроде все нормально.
надо бы тип значений изменить и проверить но тогда хеш-функцию менять надо.

Добавлено через 8 минут
нет.даже на int типе вылетает.
что-то тут с функцией вставки

Добавлено через 51 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void show(dictionary k)//ïðîñìîòð ГІГ*áëèöû
{
    spis *cur;//äëÿ ñîõðГ*Г*ГҐГ*ГЁГї ãîëîâû
    for (int i=0;i<maxn;i++)
        {
         cur=k[i];
         cout<<i<<" ";
         while (cur->next!=0)//ïîêГ* Г*ГҐ äîéäåò äî ïîñëåäГ*ГҐГЈГ® ýëåìåГ*ГІГ*
         {
           cout<<cur->val<<" ";//ïîëå Г¤Г*Г*Г*ûõ âûâîäèòü
               cur=cur->next;
         }
          cout<<endl;//ïåõîä Г*Г* ñëåäóþùóþ ñòðîêó
        }
}
тут все-таки что-то с массивом.когда я создал функцию вывода и проверил её то получил "смайлики"...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.11.2010, 01:13 #53
здесь cur->val, в последнем коде elem->s
значит у тебя всё по-старому
действительно так трудно сконцентрироваться на одном коде ?
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
15.11.2010, 01:38  [ТС] #54
Цитата Сообщение от accept Посмотреть сообщение
действительно так трудно сконцентрироваться на одном коде
я новый удалил раз он был полностью неверен.а старый я и не удалял.

код должен теоретически работать.но не работает.
хм.
может быть я не выделяю память под массив указателей?
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.11.2010, 01:55 #55
не, ты не можешь написать функцию insert
а то, что ты выделяешь память под массив указателей - это тебе показалось
потому что ты ни в новом, ни в старом коде не выделял память под массив указателей
и естественно тебе никто не говорил выделять под него память
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
15.11.2010, 12:23  [ТС] #56
Цитата Сообщение от accept Посмотреть сообщение
а то, что ты выделяешь память под массив указателей - это тебе показалось
потому что ты ни в новом, ни в старом коде не выделял память под массив указателей
я не говорил что выделяю память под массив указателей.

Цитата Сообщение от accept Посмотреть сообщение
естественно тебе никто не говорил выделять под него память
так надо выделять память или не надо?
в insert выделяется память только для узла.но ведь узел это и есть элемент массива т.е. выделяется память для элемента массива.

Добавлено через 3 минуты
C++
1
2
3
 for(int i=0;i<maxn;i++)
   d[i]=new spis;
   insert(s1,d);
когда я сделал так то вылетать с ошибкой перестало.
решил проверить show и тогда "полетели" иероглифы

теперь надо думать что не так в show.происходит там зацикливание.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2010, 12:27 #57
Цитата Сообщение от accept Посмотреть сообщение
C
1
struct celltype *dictionary[B-1];
. На сях указывается не диапазаон индексов, а их количество, кроме того, struct предназначен для объявленяи типа структуры, а не переменных этого типа, поэтому
C
1
celltype *dictionary[B];
.
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
15.11.2010, 12:35  [ТС] #58
Цитата Сообщение от taras atavin Посмотреть сообщение
ипа структуры, а не переменных этого типа
так это и есть стуктура.структура массив указателей

Добавлено через 48 секунд
и потом создавать переменные типа

C++
1
dictionary d;
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.11.2010, 13:34 #59
Цитата Сообщение от Artishok
но ведь узел это и есть элемент массива
нет, элемент массива - это адрес, это может быть адрес узла, а может быть нулевой адрес, и любой из них является элементом массива

C
1
struct celltype *dictionary[B];
массив на B указателей, если B равно 5, то массив указателей 0, 1, 2, 3, 4 - пять штук

celltype можно использовать без ключевого слова struct только в C++

Добавлено через 3 минуты
Цитата Сообщение от Artishok
так это и есть стуктура.структура массив указателей
структура - это один узел, а d - это массив указателей на структуры, массив адресов
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
16.11.2010, 00:10  [ТС] #60
я так и не понял для чего нужна эта строчка
C
1
char *x1=new char[strlen(x)+1];
можно ведь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
void shoot(char *x)
{  
   char *x1=x;
   cout<<x1<<endl;
}
 
int main()
{
    char x[5];
    cin>>x;
    shoot(x);
}
Добавлено через 26 минут
гляньте заодно закрытое хеширование

C++
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
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#define maxn 1000
 
using namespace std;
 
const char *empty="          ";
      char *deleted="**********";
      
struct char dictionary[maxn];//массив символов.а как массив строк?
 
int
 
void makenull(dictionary *d)
{
    for(int i=0;i<maxn;i++)
    d[i]=empty;
}
 
int locate(char *x;dictionary *d)
{
    int i=0,initial=h(x);
    while(i<maxn)&&d[initial+i]%maxn!=x)&&(d[initial+i]%maxn!=empty)//пока не прйдет до конца и не равно x и не пустая строка
    i++;
    return (initial+i)%maxn;
}
 
int locatel(char *x,dictionary *d)
{
    int i=0,initial=h(x);
    while(i<maxn)&&(d[initial+i]%maxn!=x)&&(d[initial+i]%maxn!=empty)&&(d[initial+i]%maxn!=deleted)
    i++;
    return (initial+i)%maxn;
}
 
void insert(char *x,dictionary *d)
{
    int bucket;
    if d[locate(x)]!=x
    {
        bucket=locatel(x);
        if d[bucket]==empty || d[bucket]==deleted
            d[bucket]=x;
            else
            cout<<"It's full"<<endl;
    }
}
 
void del(char *x,dictionary *d)
{
    int bucket=locate(x);
    if d[locate(x)]==x
     d[bucket]=deleted;
}
Добавлено через 16 секунд

Не по теме:

осталось 17 часов..



Добавлено через 5 часов 0 минут
help

Не по теме:

12 часов.....



Добавлено через 2 часа 7 минут

Не по теме:

10 часов



КЭП: каждый элемент d[i] хранит в себе k[symb] но это не одно и тоже.как сделать так чтобы не выделять память под все указатели,а выделять только при необходимости?

Добавлено через 5 минут
что не так в show?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2010, 00:10
Привет! Вот еще темы с ответами:

Указатели и динамические структуры данных - C++
Задание 1. Дан указатель P1 на вершину стека (если стек пуст, то P1 = nil). Из- влечь из стека все элементы и вывести их...

Указатели и динамические структуры данных - C++
В данный момент занимаюсь изучением динамических структур данных и указателей, и вот вот возник вопрос, есть ли разница изучать эту тему в...

Структуры, содержащие указатели на самих себя - C++
Как вообще возможно существование структур, содержащих указатели на самих себя? struct mystruct{ int a; char ch; ...

список (в программе обнуляются указатели на структуры) - C++
здравствуйте помогите найти ошибку, при возврате указателя на структуру из функции в функцию майн он обнуляется, это меня сбивает с толку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.11.2010, 00:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru