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

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

Восстановить пароль Регистрация
 
some777
3 / 3 / 0
Регистрация: 25.09.2009
Сообщений: 114
07.12.2011, 14:02     Переход от статического к динамическому массиву #1
Есть некая структура some_struct.
Необходимо перейти от статического массива этих структур
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; //вообще не знаю
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
14004 / 8835 / 1234
Регистрация: 24.12.2010
Сообщений: 16,014
07.12.2011, 14:30     Переход от статического к динамическому массиву #2
C
1
2
3
4
 temp = &Table[h];
// или 
temp = Table + h;
Table[h] = *temp;
Net_Wanderer
235 / 208 / 19
Регистрация: 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 *));
и остальной код переделывать не придется
some777
3 / 3 / 0
Регистрация: 25.09.2009
Сообщений: 114
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;
}
Net_Wanderer
235 / 208 / 19
Регистрация: 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;
Yandex
Объявления
07.12.2011, 16:23     Переход от статического к динамическому массиву
Ответ Создать тему
Опции темы

Текущее время: 05:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru