Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
some777
3 / 3 / 10
Регистрация: 25.09.2009
Сообщений: 122
#1

Переход от статического к динамическому массиву - C++

07.12.2011, 14:02. Просмотров 537. Ответов 4
Метки нет (Все метки)

Есть некая структура some_struct.
Необходимо перейти от статического массива этих структур
http://www.cyberforum.ru/cpp-beginners/thread1397823.html
C++
1
some_struct *Table[MaxSize];
к динамическому
C++
1
some_struct *Table = (some_struct*)malloc(MaxSize*sizeof(some_struct);
Как корректно перевести следующие строки:
C++
1
2
3
4
some_struct *temp;
 
temp = Table[h]; //возможно temp = &Table[h]; или temp = Table + h;
Table[h] = temp; //вообще не знаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2011, 14:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Переход от статического к динамическому массиву (C++):

Поиск по динамическому массиву
Задан целочисленный двумерный массив a из n строк и m столбцов. Найти номер...

Добавление памяти динамическому массиву
пытаюсь доканать динамические массивы (vector не предлагать, с ним все ок)....

Зачем нужен динамическому массиву указатель?
1) Зачем когда обьявляем массив нужен указатель? 2) почему если массив...

Нужен урок по одномерном и двумерному динамическому массиву
Нужен урок по одномерном и двумерному динамическому массиву

Создать функцию, добавляющую столбец двухмерному динамическому массиву
Доброго времени суток, уважаемые форумчане! Помогите, пожалуйста, разобраться...

4
Байт
Эксперт C
17756 / 11779 / 2448
Регистрация: 24.12.2010
Сообщений: 23,679
07.12.2011, 14:30 #2
C
1
2
3
4
 temp = &Table[h];
// или 
temp = Table + h;
Table[h] = *temp;
1
Net_Wanderer
235 / 208 / 29
Регистрация: 08.06.2011
Сообщений: 467
07.12.2011, 14:40 #3
Цитата Сообщение от some777 Посмотреть сообщение
Есть некая структура some_struct.
Необходимо перейти от статического массива этих структур
C++
1
some_struct *Table[MaxSize];
это массив указателей на структуры

если вам нужен тот же массив указателей, но в куче, тогда сделайте так:
C
1
some_struct **Table = (some_struct **) malloc(MaxSize * sizeof(some_struct *));
и остальной код переделывать не придется
1
some777
3 / 3 / 10
Регистрация: 25.09.2009
Сообщений: 122
07.12.2011, 15:41  [ТС] #4
Спасибо ребята за ваши ответы, работает и так

Цитата Сообщение от Байт Посмотреть сообщение
C++
1
2
3
4
temp = &Table[h];
// или 
temp = Table + h;
Table[h] = *temp;
и так (правда тут я вообще ничего не понял):
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
C++
1
some_struct **Table = (some_struct **) malloc(MaxSize * sizeof(some_struct *));
Правда тут есть одно но:
когда Table был массивом указателей на структуры, неинициализированные указатели были NULL и правильно работал следующий цикл:
C++
1
2
3
4
rec *temp;
for(temp = Table[h]; temp!= NULL; temp = temp->Next)
{
}
сейчас ВСЕГДА temp!=NULL. Помогите пожалуйста.

Ниже до кучи мой исходник, конструктивно попинайте его плиз на предмет неграмотности
в качестве параметров передается 3 параметра
10000000 - размер хеш-таблицы
inFile - входной файл в виде %d\t%s\n
outFile - выходной файл - для проверки правильности построения поиска
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
#include <malloc.h>
 
unsigned int TableLength = 0;
const unsigned int DataLength = 20;
 
struct rec
{
   char Data[DataLength+1];
   unsigned int Key;
   rec *Next;
};
//rec *Table;
rec **Table;
 
//вычисление хэш функции строки
unsigned int Hash(char *str)
{
   unsigned int h = 0;
   unsigned char *p;
   for(p=(unsigned char*)str; *p!='\0'; p++)
      h = 31 * h + *p; //эмпирически установлено, что для ASCII-строк оптимальные коэффициенты 31-37
   return h % TableLength;
}
 
//поиск/добавление элемента в таблицу
rec * Lookup(char *data, unsigned int key, bool create)
{
   unsigned int h = Hash(data);
   rec *temp;
   for(temp = Table[h]; temp!= NULL; temp = temp->Next)
   //for(temp = &Table[h]; temp!=NULL; temp = temp->Next)
   {
      if(strcmp(data, temp->Data) == 0)
         return temp;
   }
   if(create)
   {
      temp = new rec;
      strcpy(temp->Data, data);
      temp->Key = key;
      temp->Next =  Table[h];
      Table[h] = temp;
      //temp->Next =  &Table[h];
      //Table[h] = *temp;
   }
   return temp;
 
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    if(argc!=4)
        return -3;
    TableLength = _wtoi(argv[1]);
    Table = (rec**)malloc(TableLength*sizeof(rec*));
    //Table = new rec[TableLength];
    //открываем файл
    FILE *inFile = _wfopen(argv[2], L"rt");
    //читаем данные из файла и распихиваем их в таблицу
    char *string = new char[4096];
    char *buffer = new char[DataLength+1];
 
    unsigned char fld_cnt;
    unsigned int key;
    while(fgets(string, 4096, inFile) != NULL)
    {
        fld_cnt = sscanf(string, "%d\t%s\n", &key, buffer);
        if(fld_cnt!=2)
        {
            printf("%s%s%s%s\n", "\'", string, "\'", " <- Bad line format!");
            continue;
        }
 
        if(strlen(buffer)>DataLength)
        {
            printf("%s%s%s%s\n", "\'", string, "\'", " <- Max length exceeded!");
            continue;
        }
        Lookup(buffer, key, true);
    }
    rewind(inFile);
    FILE *outFile = _wfopen(argv[3], L"wt");
    while(fgets(string, 4096, inFile) != NULL)
    {
        fld_cnt = sscanf(string, "%d\t%s\n", &key, buffer);
        if(fld_cnt!=2)
        {
            printf("%s%s%s%s\n", "\'", string, "\'", " <- Bad line format!");
            fprintf(outFile, "%s\t%s", "Bad line format -> ", string);
            continue;
        }
        if(strlen(buffer)>DataLength)
        {
            printf("%s%s%s%s\n", "\'", string, "\'", " <- Max length exceeded!");
            fprintf(outFile, "%s\t%s\n", "Max length exceeded -> ", string);
            continue;
        }
        rec *found = Lookup(buffer, 0, 0);
        fprintf(outFile, "%d\t%s\n", found->Key, found->Data);
    }
    fclose(inFile);
    fclose(outFile);
    delete []Table;
    return 0;
}
0
Net_Wanderer
235 / 208 / 29
Регистрация: 08.06.2011
Сообщений: 467
07.12.2011, 16:23 #5
Цитата Сообщение от some777 Посмотреть сообщение
неинициализированные указатели были NULL и правильно работал следующий цикл:
...
сейчас ВСЕГДА temp!=NULL. Помогите пожалуйста.
перед использованием, заполните вручную массив нулевыми указателями:
C
1
2
3
int i;
for (i = 0; i < TableLength; i++)
        Table[i] = NULL;
1
07.12.2011, 16:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2011, 16:23
Привет! Вот еще темы с решениями:

Нахождение элементов, которые принадлежат и массиву a и массиву b (segmentation fault)
добрый день, стоит задача нахождения элементов, которые принадлежат и массиву а...

Вопрос по динамическому полиморфизму
Здравствуйте. Прочитал про статический и динамический полиморфизмы. Возник...

Подскажите книжку по динамическому программированию.
Доброго времени суток! Наткнулся на такое понятие, как динамическое...

Адаптировать задачу по динамическому программированию на рекурсию
Добрый день, написал код, решающий задачу динамическим программированием. Есть...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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