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

Переход от статического к динамическому массиву - 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. Симметричные криптосистемы. Алгоритм DES. Необходимо зашифровать первые восемь букв фамилии, имени и отчества студента в латинской транслитерации с помощью алгоритма DES. В качестве пароля взять слово...
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 (по абсолютной величине) Помогите плиз) Вместо лекции по деревьям в лицей ездили, а еще и задачи дают) подробнее

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

Цитата Сообщение от Байт Посмотреть сообщение
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;
}
 
Текущее время: 05:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru