Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

всичко за един лев

Featured Replies

тука предлагам да чоплим всичко свързано със С++ алгоритми образование счупен код и квото се сетите само да е С++

Почваме тогава:

ами много са ама такова чудо не бях чел за стринговете и файловете

например магдалина тодорова. абсолютно С++ с++ за всеки и други

Я сега кажи какво си чел, че и ние да се образоваме. И после ще се допълва.
  • Автор

Почваме тогава:

Я сега кажи какво си чел, че и ние да се образоваме. И после ще се допълва.

http://sharebookfree.com/page/2/

Е айде по същество де. Аз откъде да знам коя точно от тези си чел и какво си разбрал? Пиши тука твоето разбиране за проблема т.е. какво представлява string, пример който си чел в книга как се запива във файл, такива неща. Аз нямам за цел да се пиша по-умен от тия дет са писали книгите и да ги оборвам. Идеята ми е да опитам да ти помогна да научиш нещо, ако искаш. А ти примерно да ми покажеш, какво очакваш от някой който ти обяснява нещо, така че да ти е интересно.

Редактирано от flare (преглед на промените)

  • Автор

значи заа стрингове съм чел въведение в С++ на магдалина тодорова и пишеше че били клас както ви е казахте разглееждаха се кат масиви динамични не пишеше нищо за файлове .....


пример как се записва във файл съм дал в другата тема това го научих от абсол1тно с++


динамичните масиви нямат строго определен размер техня размер се определя по време на работа

...

Добро начало.

Значи знаем, че е клас и, че е реализиран с динамичен масив. Да оставим за сега класа настрана.

Какво е динамичен масив? Каква е ползата от динамичен масив - защо не си ползваме "обикновените"?

  • Автор

ами обикновените са с фикссирана големи и не може да се променя докато динамичните могат и за полезни когато не знаем  размера на данните

ами обикновените са с фикссирана големи и не може да се променя докато динамичните могат и за полезни когато не знаем  размера на данните

Идеално. Ама много бавно. За да стане по-бързо, аз ще изложа основните проблеми при ползването на динамичните масив в нашия случай, ти ще кажеш ако нещо не е ясно да допълня.

1. Както ти каза при динамичните масиви, можем да задаваме различен размер, което е голямо предимство.

2. Независимо как са реализирани отгоре, примерно string, динамичните масиви се ползват през указател, т.е. паметта се заделя и се достъпва през адреса на който се намира.

3. Обаче в C++ указателите към масив не носят информация за размера на масива към който сочат.

4. Ако динамичният масив си е самостоятелен - няма проблем да го копираме, доколкото а) елементите му са последователни в адресното пространство и b) знаем колко са и колко са големи.

5. Сега си представи следната структура:

struct Person {
    unsigned int age;
    char *name;
};
Тя се състои от две полета: цялото положително число и указателят name;

ако имаме следния код

Person someone;
std:ofstream fileOfPeople;
someone.age = 15;
someone.name = new char[50];a
// Пропускам попълването на name, отварянето на файла, t.n.
fileOfPeople.write(&a, sizeof(a));
Така, какво ще се запише във файла? Както казахме структурата се състои от две променливи. Точно те ще се запишат. Възрастта и указателя. Указателят представлява адрес, тоест число.

Сега какво ще стане ако затворим програмата и при следващото отваряне като видим че има файл, направо я прочетем?

Ами в структурата ще се запишат възрастта и адреса който сме записали. Възрастта ще е вярна. Но адресът? Да той ще е точно същият като число което сме записали, само че какво ще има там? Паметта отдавна е освободена, може да сме изключвали компютъра, може операционната система да е задала съвсем различно адресно пространство на нашия процес, т.н.

Неясни неща дотук?

  • Автор

не но страшно много съм разчорован от себе си :(:cant believe: :cant believe:

Може би .......


нямам думи какъв срам изпитвам в момента ....

не но страшно много съм разчорован от себе си :(cant%20believe.gifcant%20believe.gif

Може би .......

Що разочарован?

Предполагам разбра, защо не може да записваш директно във файл класове, съдържащи динамични данни?

Но все пак такъв е възможен и аз вече казах как - чрез сериализация. Всъщност ако си правиш клас, който се очаква да записваш и четеш в оригиналния му вид, винаги е хубаво да помислиш за за сериализация и десериализация.

  • Автор

всички тези неща да съм  ги чел и пак да се орезиля.....


да разбирам ви


заради адреси на паметтта нали

имаш адреса на клетката но нямаш стойността й

Редактирано от petie1 (преглед на промените)

заради адреси на паметтта нали

имаш адреса на клетката но нямаш стойността й

Към момента на запис я имаш. Но функцията write записва блок от паметта във файл. Не ѝ пука, че този блок съдържа някъде вътре си указател, който няма смисъл сам по себе си, а са важни данните към които сочи.

На теб трябва да ти пука за това. Ти трябва да измислиш как да си запишеш нещата, така че после да ги възстановиш в използваем вид.

  • Автор

но при четене се губи

чете файла но стойноста е загубена макар че адреса е същия нали така

но при четене се губи

чете файла но стойноста е загубена макар че адреса е същия нали така

Обясних по-горе. Каквото си записал точно това прочиташ. Загубени са неща които не си записал. Би трябвало вече да ти е ясно как да оправиш работата.
  • Автор

прочитам адрес записан въцв файла този адрес сочи стойност на клетка която е различна нали

 

прочитам адрес записан въцв файла този адрес сочи стойност на клетка която е различна нали

Адреса, който е записан във файла е бил валиден в момента, в който е извършен записа. Оттам насетне, никой не гарантира при четене на този адрес какво съществува.

Нека само видим сигнатурата на метода за запис:

 

ostream& write (const char* s, streamsize n);

Write block of data
Inserts the first n characters of the array pointed by s into the stream.

This function simply copies a block of data, without checking its contents: The array may contain null characters, which are also copied without stopping the copying process.

Източник

 

Т.е. "Запиши ми еди-си-какви данни, като големината на данните ми е N". Това N при четене също трябва да е известно - 

 

 

istream& read (char* s, streamsize n);

Read block of data
Extracts n characters from the stream and stores them in the array pointed by by s.

This function simply copies a block of data, without checking its contents nor appending a null character at the end.

 Източник

 

Бих искал да уточня още нещо. @flare много добре сподели във въпросната тема, че може да се ползва и char[MAX_SIZE], защото размера на масива ще се задели статично и ще окаже влияние върху размера на структурата.

Ето нагледно как стоят нещата:

# include <iostream>
# include <string.h>
using namespace std;

struct A {
    char name[20];
    char* sample;
};
int main () {
    A a;
    cout << "We have the following:\n" << "struct A {\n\tchar name[20];\n\tchar* sample;\n\n};" <<endl;
    cout << "Using the char[]: " << endl;
    strcpy(a.name, "HelloWorld");
    cout << "Size of a: " << sizeof(a) << endl;
    cout << "Size of a.name: " << sizeof(a.name) << endl;
    a.sample = new char[20];
    strcpy(a.sample, "HelloWorld");
    cout << "Size of a: " << sizeof(a) << endl;
    cout << "Size of a.sample: " << sizeof(a.sample) << endl;
    cout << "But a.sample contains \"" << a.sample << "\" and it is not 4B " <<endl;
}

и съответно изпълнението:

We have the following:
struct A {
        char name[20];
        char* sample;

};
Using the char[]:
Size of a: 24
Size of a.name: 20
Size of a: 24
Size of a.sample: 4
But a.sample contains "HelloWorld" and it is not 4B 

Идеята на примера е именно илюстрация на пролема с указателите. Както се вижда и при изпълнение, sizeof правилно ще определи размера на структурата като 24B - 20 байта за масива name и 4 байта за указателя sample. Той не знае, а и не се интересува от това, този указател към какво е вързан - и тъй като данните към sample са динамични, размера им трябва да се следи при изпълнение. Поради това и в примера от въпросната тема, размера на структурата си беше валиден, но спрямо типовете, а не спрямо данните (тъй и там работихме със sizeof()).

 

Тъй като споменахте, че имате познания и по Java, там също има какво да се разглежда. С умисъл евентуално да се направи аналогия между подходите за сериализация (ако Java Ви е по - ясна от С++), то ObjectOutputStream-а също изисква наличие на имплементация на определени методи, които да са налични в съответния клас, с цел да знае как да записва и чете данните. В противен случай, проблеми са си ясни - данните се губят. Като цяло serialization-а си е относително тежичка храна за смилане, тъй като си изисква доволно количество внимание какви данни пишем/четем, къде и как ги записваме/достъпваме и т.н.

 

Редактирано от soundtracker (преглед на промените)

  • Автор

как може никъде да не пише за сериализацията в с++?? да пише за масиви указатели класове структури.... пък никъде а няма за тва дет фларе ми обясни? в джава си пише в сишарп също ама в с++ греда

как може никъде да не пише за сериализацията в с++?? да пише за масиви указатели класове структури.... пък никъде а няма за тва дет фларе ми обясни? в джава си пише в сишарп също ама в с++ греда

Не съм съгласен с това изказване. Пише си на достатъчно места - проблема е, че самата концепция не е за "Basic" или "Introduction"/"First Steps" обучение. Вярно е, че в повечето учебници, които се преподават в университета, училище и т.н. са доста окастрени, но и целта им е за въведение и запознаване с основните идеи, парадигми, техники и синтаксис на даден език. Няма как за един срок/семестър (дори и за два) да се преподаде всичко за конкретен език като ситанксис, възможности и прочие. Сериализацията си се води "advanced" тематика, която теоретично трябва да се подхване, след като вече сте поставили основата от знания в basic/introduction нивото. И тъй като университета основно дава въведения и базови знания, остава Вие (ако сте заинтересован и искате да продължавате да се развивате в това) да продължите с останалите неща в дадената област.

 

В Java и C# си пише

 

, но къде го пише ? В документацията на Оракъл/Сън, която сигурно на едно по-старичко HDD няма да се побере ( заедно с някой по - използвани библиотеки, говорим за сериозно число гигабайти).

Досега лично не съм попадал на книга за Java, която да е Introduction/Basic/Core и да говори за user serialization на обекти. Нека отбележа - не говорим за Serializable интерфейса, който може и да бъде захванат във въпросните книги, а за Object Stream-овете. Първата книга на която попаднах да ги споменава беше сертификационната "библия" от сумарно 1500-1600 страници (в 2 части - SCJP - Sun Certified Java Programmer). Оттам насетне бяха зачекнати в "Thinking in Java", "Advanced Java ..." и т.н. 

За C и C++ имам две introduction-а, които спокойно биха послужили да изпратят някого в кома, но дори и в тях не се споменава за serizlization-а. Просто защото има достатъчно по-важни и по - основни неща на езика, които човек трябва първо да научи. И отново въпросната тематика се захваща пак в книги като "Thinking in C/C++", "Advanced ... " и т.н. 

 

Като извод от всичко написано, мога да кажа следното:

Всеки елемент от знанието и разбирането за който и да е език си има категория и книга/място, където попада. Някои неща са по - важни да се знаят от други на дадено ниво от обучението на човек и затова именно те са засегнати в съответните книги/tutorial-и и примери. Не е резонно да смятаме, че понеже в първата книга, която сме прочели и не сме видели нещо, то тази книга не струва. Не е резонно и да смятаме, че документацията на дадена технология е добра методика за обучение, защото едно обучение не включва суровия вид на енциклопедичните данни от документацията, а обработена и структурирана информация, която възможно най-лесно би могла да се усвои от четящия. 

Това, до колко дадена документация е налична и до колко полезна и добре структурирана е тя, е съвсем отделен въпрос. Не споря, че и на Java и на C#, документацията е доста добре огранизирана (MS също си има някаква документация за "техния" C++, където са си засегнали темата), но тя няма как да се събере в една книга (под книга разбирайте онези тухли от по 1000 страници), тъй като количество е огромно. Така, че теми, книги, статии и примери за seriаlization-а в  С++ има - трябва само да ги потърсите и намерите.

 

Поздрави !

 

Edit: Смислови, пунктуационни и правописни редакции на мнението, поради забавено действие на сутрешното кафе ...

Редактирано от soundtracker (преглед на промените)

  • Автор

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

Естевенно че искам да се развивам затова толкова се ядосвам.....

Хващай да четеш като искаш, не се оправдавай! Веднъж вече каза как това,за което питаш никъде го нямало и после какво се оказа?

всички тези неща да съм ги чел и пак да се орезиля.....

И имай предвид че цитираните от теб два езика са едно изцяло обектни и две много по-нови от C++. Концепциите са били къде-къде по-изчистени тогава, като са видяли проблемите на другите езици. Сериализацията е малко или много е заложена направо в тях. Съдържанието на книгите е съответно. Обратно много от книгите на C++ страдат от наследственост - приличат на това, което е писано преди 20 години... Но изключения винаги има и някои са много добри.

Редактирано от flare (преглед на промените)

И имай предвид че цитираните от теб два езика са едно изцяло обектни и две много по-нови от C++. Концепциите са били къде-къде по-изчистени тогава, като са видяли проблемите на другите езици. Сериализацията е малко или много е заложена направо в тях. Съдържанието на книгите е съответно. Обратно много от книгите на C++ страдат от наследственост - приличат на това, което е писано преди 20 години... Но изключения винаги има и някои са много добри.

Абсолютно точно, с тази уговорка, че дори и за Java, темата за User serialization отново си се води малко advanced тематика - т.е. тя приема, че човека, който ще чете това, има солидно понятие по Basic Java Programming.

 

 

 във всяка една книга за джава и си шарп се споменава за сериализацията къде малко къде много и ето така горе долу мога да си потърся в гугъл да почета ако ми схващате мисълта

 

Поради тази причина, както споменах и в предния си пост, в книгите за "Introduction" не се отделя специална секция за ObjectStream-овете, тъй като те имат достатъчно неща да представят - Основи на OOP, синтаксис, типове данни, организация на програмата и сорсови файлове, основен вход/изход (символен - конзола и файлове), Exception Handling, нишки и т.н. В този случай е видно, че твърдението "във всяка книга за джава и шарп се споменава ..." не е много състоятелно.

 

В една друга тема, имам спомени, че @petie1 беше изявил желание да преподава по Android/Java. Последната поддискусия в темата доста добре отразява и засяга именно една структура и модел на преподаване въпреки, че се опитах да се абстрахирам от това. И всъщност, явно този модел на обучение се е наложил именно заради йерархичната подредба на знанията - трябва основа, за да строим нагоре, трябва да запълваме дупките, преди да минаваме напред. Няма как да се преподаде Serialization, преди да се научат основите на I/O системата на Java. А ако в Introduction-а се включи и сериализацията, трябва да се включат и детайли от другите направления (голяма част от които са и по - важни) - патърни, основните API-та (за всяко от които може да се разпише отделна книга), регулярни изрази, Data Containers, REST, WebServices, HTTP APIs, Security и т.н. и т.н. И книгата от 1000 страници ще 20000+.

Поради това е прието дадена книга или да дава основите на един език до толкова, че основни задачи да могат да бъдат решени с помощта на съответната технология, или са специализирани в дадено направление на технологията (Примерно само за REST, Java Security и Enterprise архитектури има стотици книги, които обясняват в детайли какво става и как се правят нещата). 

 

В тази мисъл на мнението ми, не се ядосвайте, че някъде не е поместено нещо за сериализация в С++. Това, че "някой си фларе" във форума Ви е показал нещо ново, е бонус, който Ви е спестил време и Ви е дал познание, че такова животно съществува и в интернет има информация за него. Според вас, колегата как е стигнал до него ? Отново с опит - или е прочел нещо някъде, или докато е търсил информация за други проблеми се е натъкнал на това, или на работа се е сблъскал с подобен казус или просто докато си е писал програмка му е потрябвало подобна функционалност и е направил търсене/справка.

 

Всичко си идва с време, опит и любопитство :)

 

Поздрави !

  • Автор

прави сте и двамата


опит и човъркане му е майката

 

наистина ми е интересно много и много ви благодаря и на двамата ама за записа на стрингове във файлове научих от фларе иначе чарове знам как се пишат даже в една тема съм го и разписал и обяснил (е не са чарове де ама в книгите пише че и чарове таака се пишели)....

 

вижте сега аз наистина желая да се развивам вие ако искате помагайте така и дискусия ще водим и може на други да помогне нащата дисскусия

Редактирано от petie1 (преглед на промените)

  • Автор

не желая да споря с никой но наистина в книгите за джава и си шарп се спомнава за сериализация но не се отделя внимание в отделна секци но за мен това е достатъчно да си почета в гугъл какво е това животно

вижте сега аз наистина желая да се развивам вие ако искате помагайте така и дискусия ще водим и може на други да помогне нащата дисскусия

Като стана въпрос за качеството на преподаване ей тази тема е много добър пример. (забележете че имаше подобна)

  • Като почнем от заданието: сортиране на стек или списък с метод на Шел. Незнам гавра ли е или преподавателя си мисли че няма начин да затрудни студентите си със смислена задача... Или пък е решил че като им даде огромна глупост за задание, няма никой да я е писал в интернет. Все тая нищо от тия не го извинява...
  • C срещу C++ естествено че е достатъчно да подмениш printf и scanf със cout и cin и това автоматично ти прави програмата на C++.
  • Употреба на функции: Всичко в кода трябва да се разбива на функциийки, Яко. Ама непременно да ползват глобални променливи. Може да сложим тук-там параметърче за цвят. Указател към псевдоним например.
  • Като става въпрос за псевдоними, тия работи кучета ги яли... давайте с чисти указатели, да е сигурна работата.
  • Проверки за грешка и край на списък? Стига бе, за какво са. Ние само код пишем, не бъгове.
  • Цикли знаем, но менюто непременно трябва да е с рекурсия към главната функция. На soundtracker явно му е писнало да оправя грешките към тоя момент :D
  • още...

А като става въпрос за неща извън конкретния случай, които повсеместно са малко застъпени, не мога да не посоча дебъгването. Баси дори елементарното слагане на принт през ред да видиш докъде ти забива програмата не го преподават. Какво остава за точки на прекъсване, пък недай си Боже хардуерни watchpoints, или други неща. А пък съвсем недай си Боже да стигнем да гоним проблем в система в реално време, който се получава веднъж на 400 опита, всеки от които трае 1 час.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    26%
    Дарени 256.00 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.