Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Големичка База данни
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=636
Страница 1 от 2

Автор:  HCL [ Сря Май 04, 2005 11:35 pm ]
Заглавие:  Големичка База данни

Едно въпросче. Как се пише база данни за 100000 студента.
Трябва да използвам

struct student {
char name[40];
char vorname[20];
char fach[40];
int matrikelnummer;
float noten[20];
student * pNext;
};

Мислех да го правя с масив, ама няма да стане явно 8O тази структура изглежда да гълта по 182кБ на елемент. Умножено по 100000 - няма да стигне РАМ-а. Какво се прави в такива случаи? Не мога да използвам и данимачна памет или поне не се сещам как...

Автор:  HCL [ Сря Май 04, 2005 11:58 pm ]
Заглавие: 

[/quote]student * pNext;
[quote]
е той отговорът на въпроса ми бил в поста :roll: . С поинтер ще става явно, сега чета за някакви навързани листи, които се използват именно в такива случаи. Абе то и с масив ще стане, ама ще трябва да поръчам повечко РАМ за РС-то, че няма да стигне :D

Автор:  forest_gump [ Чет Май 05, 2005 12:00 am ]
Заглавие: 

Едно вероятно решение , правиш структура само на един от редовете в базата както си направил за студента , създаваш файл от типа на структората /знам за паскал че става/, създаваш промелива от типа на структурата и когато записваш в базата попълваш променливите в структурата и добавяш запис във файла със стандартният оп. writefile, при четене е същото само че обратно, при търсене вече е гърч ... ограничението е само във макс. размер на файла в зависимост от фат-таблицата на диска!

Автор:  HCL [ Чет Май 05, 2005 12:21 am ]
Заглавие: 

Звучи подходящо решение ще опитам.
Благодаря

Автор:  Nikola Kirov [ Чет Май 05, 2005 12:44 am ]
Заглавие: 

А аз имам някакви спомени че веднъж направих една програмка дето правеще структура по голяма от 100Мб а Pcto na koeto работеше беше с 64Мб или нещо такова. Никакви мерки не бях вземал за работа с паметта. Visual studioto или чичко windows са се справяли явно с това.Така и не се замислих защо работи. Това беше преди 2 години и го правих с visual studio 6 na C++. Така че що не пробваш да си компилираш програмката така и да видиш какво ше стане. Аз така и тогава не успях да я тествам щото не успях да си подкарам хардуера и, но се компилираше и тръгваше и на тая машина с 64Мб рам.

Автор:  HCL [ Чет Май 05, 2005 12:47 am ]
Заглавие: 

е точно това го нямам под ръка в момента, но ще пробвам как ще се компилира на gcc-то. Последния път като опитах да го гърча с aloc-a нещо не стана ама я да видим сега колко ми е стабилна системата. 8)

Автор:  forest_gump [ Чет Май 05, 2005 12:55 am ]
Заглавие: 

HCL написа:
е точно това го нямам под ръка в момента, но ще пробвам как ще се компилира на gcc-то.

Ако имаш Linux предвид , мисля че ще трябва да му кажеш че смяташ да се шириш из рама, пингвина много се мръщи на процеси различни от кърнела дето искат да си играят с паметта, не забравяй че линукса е преди виндовса по стаж в многозадачноста и protected mode-то на паметта!

Автор:  [ Чет Май 05, 2005 1:11 am ]
Заглавие:  Re: Големичка База данни

...

Автор:  HCL [ Чет Май 05, 2005 1:38 am ]
Заглавие: 

хм... пропуснал съм една 0, за втори път ми се случва тази седмица :x . За курсова работа е, ама аз сам седнах да си тровя живота. Тя задачата съвсем не е сложна, искат само да видим дали сме разбрали как се работи с масиви и пойнтери, ама аз сам седнах да си тровя живота с тази база данни. Но нищо, интересно ми е, а и не вреди да поопитам туй онуй. Сега нацепих базата на 4 файла (по един за всеки параметър) не защото е някакво сложно решение за оптимизация, ами просто не се сещам как при четене да разпозная кои стойности на кои елемент от базата отговарят.
Опааа сега ми хрумна (то хубаво нещо било форума, понякога ти идват идеи докато задаваш въпроси :D ). Така, новият хак е да пиша само в един файл, а като завъртя цикъла да чета през 4 стойности, така ще знам, че на едно завъртане отговаря стойност на един елемнт. 8)

Автор:  [ Чет Май 05, 2005 2:16 am ]
Заглавие: 

...

Автор:  HCL [ Чет Май 05, 2005 3:09 am ]
Заглавие: 

pirev, закова ме. Това което си ми дал тръгна :D
Аз тук се мъча да разбера защо не мога да отворя файла с
ofstream file ("base")
дава ми
Цитат:
undefined reference to `std::basic_fstream<char, std::char_traits<char> >::~basic_fstream [in-charge]()'

Не разбирам, включил съм fstream в начлото, опитах и с fstream.h, нали там трябва да ги има дефинирани тези функции. Ще се поровя още малко, ама вече е 2 часа посреднощ, а такива идиотски грешки да ми спъват работата. :evil: :x :evil:

Автор:  HCL [ Чет Май 05, 2005 3:27 am ]
Заглавие: 

Аааааа, това е като му се спи на човек не става хубава работата. Компилирам си сорса на gcc, а не на g++. Ама глупавата грешка трудно се открива, щото си мислех, че като му пусна една опция -x c++ ще ползва препроцесора на с++ ама не става явно точно така. Защо ли? :?

Автор:  HCL [ Чет Май 05, 2005 3:55 am ]
Заглавие: 

Друга чудесия изникна. В тази част:
Код:
if (nfile.is_open()) //|| ! vnfile.is_open() || ! ffile.is_open())
   {      cout << "\n\n\nNew student:\n\n";
         cout << "Name: ";
         cin.getline (stud.name, 40);      //what is this?
         cin.getline (stud.name, 40);
         cout << "\nVorname: ";
         cin.getline (stud.vorname, 20);
         cout << "\nFach: ";
         cin.getline (stud.fach, 40);
         cout << "\nMatrikelnummer: ";      
         cin >> stud.mn;

Там където е дублиран реда. Ако не му поискам два пъти вход, на първия сам си решава че е въведене табулация и преминава направо към stud.vorname без да иска въобще вход от потребителя за stud.name Така както е в монета си работи, но ми е интересно откъде може да идва грешката.

Автор:  0x00 [ Чет Май 05, 2005 4:33 am ]
Заглавие: 

Останал ти е непрочетен /n някъде в буфера. Чел си нещо директно от там с get(), или input-а е повече от maxN-а на някой предишен getline() и съответно /n остава вътре, или нямам представа защо. Както и да е, преди да го четеш наново го накарай да игнорира всичко преди този /n със:
Код:
cin.ignore(cin.rdbuf()->in_avail(),'\n');


Особено ако някой ще ти проверява кода, никак не е разумно това "измъкване" с двойното викане на getline(); представи си, че байтовете преди /n в буфера отново са повече от maxN-a :D

Автор:  HCL [ Чет Май 05, 2005 4:48 am ]
Заглавие: 

Нов проблем, този е по интересен:
Код:
begin1:
      system("clear");
      cout << "Main Menu:\n\n";      //print the main menu
      cout << "1. Enter new student\n";
      cout << "2. Search the data base\n";
      cout << "3. Change student's information\n";
      cout << "4. Exmatrikuliere student\n";
      cout << "5. Exit\n\n";
      cin >> i;

      if(cin.fail() || (i!=1 && i!=2 && i!=3 && i!=4 && i!=5))
      {   cout << "Please enter a correct value (1-5): ";
         goto begin1;
      

Ако потребителя въведе некоректна стойност, но integer, програмата се държи нормално и го пита отново за вход, а ако въведе нещо различно от integer, goto го връща на позиция begin1 ... и от там рограмата вллиза в цикъл 8O . Защо???
Нали съм сложил cin >> i; би трябвало на това място всеки път да спира и да чака вход от конзолата. Къде греша?

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/