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

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

07.12.2011, 15:41. Просмотров 538. Ответов 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2011, 15:41
Темы с ответами и решениями для C++ Переход от статического к динамическому массиву:

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

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

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

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

0
Переход от статического к динамическому массиву C++   Следующее сообщение темы 
Другие темы раздела
C++ Что лучше Visual studio 2010 C++ или Builder 6 C++ ? http://www.cyberforum.ru/cpp-beginners/thread401053.html
Только что начал программировать на C++, и не хотелось бы потом переучиваться на другую среду программирования, так что пожалуйста, подскажите где лучше программировать, выгодней и на какой среде...
C++ Найти столбец с максимальным произведением элемента Найти столбец с максимальным произведением элемента Только сам цикл,благодарю Язык Си http://www.cyberforum.ru/cpp-beginners/thread401045.html
Программа вычисления стоимости покупки с учетом скидки C++
Программа вычисления стоимости покупки с учетом скидки.Скидка предоставляется, если сумма>1000(5%), более 5000(?%), а так же дополнит скидка 3%- в выходные дни. Информация о том является ли день...
Шифрования фамилии C++
Есть 3 задачи шифрования нужна безкорисная помощь в виде исходников или ссилок ну или просто програмки ( живу в " cеле " с вебманями проблемно) код можна в делфи или си Задача 1....
C++ ограничение размера массива на 0x7FFFFFFF байт http://www.cyberforum.ru/cpp-beginners/thread401016.html
Отладка идет на x64-конфигурацию под VS2008 есть некая структура: struct rec { char Data; unsigned int Key rec *Next; } И инициализируется массив этих структур rec *Table;
C++ Задача по деревьям 5. Для заданного бинарного дерева поиска проверить условие: • для каждой вершины высота левого поддерева отличается от высоты правого поддерева не более чем на 2 (по абсолютной величине) Помогите... подробнее
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru