Jump to content
BulForum.com

Програма на C++


toneff

Recommended Posts

Също така не мога да разбера защо ползвате такова огромно количество указатели, поне за примитивните типове смятам, че е леко излишно :) Утре ще продължа и с другите функции от задачата и ще видим какво ще се получи в крайна сметка :S

 

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

 

 

 

Добре предполагам, че масива pari трябва да го инициализирам в getMinSal(), както съм го направил в setSal(), само че не мога да разбера с каква стойност да го инициализирам? Или трябва да го инициализирам на друго място и само да го извикам на това място? Честно да ти кажа вече ме е яд, че се захванах с тая задача, направо се измъчих. :)

 

Ами не, просто трябва да викаш setSal() преди да викаш другото. Нали все отнякъде трябва да дойдат данните? Какво се предполага да върне getMinSal() ако няма данни?

 

qR обекта го бях създал съвсем в началото, когато имах друга идея да направя нещата и в последствие се промени плана и просто остана така. ;)

 

Ми като се е променила разкарай го де!

Link to comment
Share on other sites

  • Replies 113
  • Created
  • Last Reply
Rabotnik(char ccpos){

cpos = &ccpos;

cout<<"Vuvedi tekushta dlujnost: ";

cin>>ccpos;

}

 

тази променлива ccpos се предава по стойност. След изпълнение на конструктора, ccpos се унищожава и cpos сочи нищото.

И ако опиташ да правиш нещо след това, може да ти даде violation

Link to comment
Share on other sites

Ами не, просто трябва да викаш setSal() преди да викаш другото. Нали все отнякъде трябва да дойдат данните? Какво се предполага да върне getMinSal() ако няма данни?

 

Ясно, тръгна. Благодаря ти много за огромната помощ. B)

 

Ми като се е променила разкарай го де!

 

Махнах го още първия пък като каза. ;)

 

тази променлива ccpos се предава по стойност. След изпълнение на конструктора, ccpos се унищожава и cpos сочи нищото.

И ако опиташ да правиш нещо след това, може да ти даде violation

 

Ами за сега няма да се опитвам да правя нищо, но ще го имам предвид в бъдеще, ако реша.

Link to comment
Share on other sites

Ами за сега няма да се опитвам да правя нищо, но ще го имам предвид в бъдеще, ако реша.

Ами то е добре от сега да свикнеш, да внимаваш с такова използване на променливи и да го имаш в предвид.

Аз сега покрай един приятел, взех и аз да бъзикам С++, че му трябва помощ, но поне имам ясна задача - да ползвам COM порта.

И за целта на правих един прост клас за писане и четене.

Аз примерно не бях съобразил, че за низ подаден като параметър - примерно "AIN" sizeof() и strlen са две различни неща. Добре, че има дебъгери, та да се усетя от време :)

Link to comment
Share on other sites

Ами за сега няма да се опитвам да правя нищо, но ще го имам предвид в бъдеще, ако реша.

 

Въпроса е какво изобщо искаш да постигнеш и ако то е "нищо" защо тогава го има този излишен параметър с повече от мъгляво име. Другия добър въпрос е защо е char* a не string... дреболии един вид но съществени.

 

 

mIRCata, как така да са еднакви - нали едното ти връща броя символи в низа а другото е заетата памет от него - ако е уникод 2 байта на символ + още 2 за край - \0-та

Link to comment
Share on other sites

mIRCata, как така да са еднакви - нали едното ти връща броя символи в низа а другото е заетата памет от него - ако е уникод 2 байта на символ + още 2 за край - \0-та

Тъй де. Oт това Делфи, просто изключих, че в С "AIN" e "AIN\0". Ама като не съм писал отдавна. Сефте го подхващам от няколко години и това беше на прима виста, без да си припомням нищо, в след работно време късно вечер ;) И за мен късно вечер е края на фазата ми на будуване, а не началото на такава :) Но се оправи работата.

Link to comment
Share on other sites

Мина се не мина време изникна проблем, само че тоя път не с програма, а с компилатора. При опит за стартиране на програма ми изкарва конзолата и след това в дебъгъра следното:

 

'Time.exe': Loaded 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\Time\Debug\Time.exe', Symbols loaded.
'Time.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll'
'Time.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll'
'Time.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcp90d.dll', Symbols loaded.
'Time.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll', Symbols loaded.
The program '[3756] Time.exe: Native' has exited with code 0 (0x0).

 

Значи в случая стартираната програма се казва Time.exe, но това става с всички програми, които се опитвам да стартирам. Давам на приятели да пробват и няма проблем при тях. Явно е от компилатора нещо, с Visual Studio 2008 съм. Най-лесното е да го преинсталирам, но просто исках да видя, ако случайно някой знае откъде произлиза проблема, да си го оправя, защото ще ми е третият път тая седмица, в който ще го преинсталирам. :)

Link to comment
Share on other sites

А програмата, трябва ли да пита,прави нещо?

Да не е разписано нещо, което се изпълнява и без да има въвеждане на данни от потребителя. И просто програмата да минава и свършва нормално?

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

Link to comment
Share on other sites

А програмата, трябва ли да пита,прави нещо?

Да не е разписано нещо, което се изпълнява и без да има въвеждане на данни от потребителя. И просто програмата да минава и свършва нормално?

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

 

Добавих system("PAUSE"); в main-a и се оправи. Нямах навика да го правя, но явно трябва. :blink:

Link to comment
Share on other sites

Тъй де. Oт това Делфи, просто изключих, че в С "AIN" e "AIN\0". Ама като не съм писал отдавна. Сефте го подхващам от няколко години и това беше на прима виста, без да си припомням нищо, в след работно време късно вечер ;) И за мен късно вечер е края на фазата ми на будуване, а не началото на такава :) Но се оправи работата.

 

Всъщност в Delphi е 03 00 00 00 41 49 4E 00 (т.е. първите 4 байта са дължината на стринга и след това идват данните - за моя изненада не бяха в уникод ами като ASCII)

 

Ако го дефинираш като WideString вече е друга работа: 06 00 00 00 41 00 49 00 4E 00 00 00

 

Нулите си ги има тъй или иначе за съвместимост с Windows API-тата и самото Delphi си ги слага вътрешно при обработка със стрингове (т.е. освен дължината в началото в духа на паскал, то го прави и null-terminated) a размера е в брой байтове пък после вътрешно си ги дели ако е widestring типа.

 

Проверих го одеве и си припомних малко асемблера даже... отдавна не бях човъркал на ниско ниво нищо :)

 

Между другото знаеш че стринговете всъщност са указатели нали? Т.е. ако имаш

 

var mystr: string; mypointer: pointer;

....

mypointer = @mystr;

 

всъщност mypointer ще сочи не към данните а към указателя къде са въпросните данни. Т.е. за да се докопаш до самите данни ти трябва @mystr[1] - и после се връщаш назад 4 байта за да се докопаш до размера. А pchar(mystr) е същото като @mystr[1]

 

 

___________________

 

 

WriteR4e, това обикновено се постига с изчакване да се въведе нещо от потребителя. getch(), std::cin.get(); или просто char x; cin >> x; нещо от сорта (последното го пиша наизуст може да не е синтактично правилно но ти ще се оправиш предполагам) Това system("PAUSE") мисля, че викашe командата на DOS което е повече от грубо.

Link to comment
Share on other sites

самото Delphi си ги слага вътрешно при обработка със стрингове

Е те точно това. Понеже там са скрити и като не ги виждаш, спираш и да ги мислиш. В С примерно си се грижиш да си ги слагаш тези 0-и и е по-трудно да спреш да се съобразяваш с тях и да не ги отчиташ.

Предполагам по подобен начин доста хора пишещи на С# не се сщат да си гледат указателите и заделените памети. Нали той си имаше garbage collection и ги обираше разни забравени.

Link to comment
Share on other sites

WriteR4e, това обикновено се постига с изчакване да се въведе нещо от потребителя. getch(), std::cin.get(); или просто char x; cin >> x; нещо от сорта (последното го пиша наизуст може да не е синтактично правилно но ти ще се оправиш предполагам) Това system("PAUSE") мисля, че викашe командата на DOS което е повече от грубо.

Всъщност "Pause" си е уиндоус команда също, така че не е по-грешно. Даже според мен това е правилното решение, защото "pause" е създаден точно с тази цел - да спира изпълнението при .bat файлове. Другите решения са по-скоро "work araund" (основно защото нямат смисъла на "press any key"), на така или иначе недописания край на програмата. Иначе аз лично добавях и условна компилацийка според OS-а, за да ми е преносим кода и на линукс.

 

ПП. Естествено, горните разсъждения важат само за конкретния "проблем" - когато спирането става след края на програмата. Във вътрешността на кода не го препоръчвам.

Link to comment
Share on other sites

Е те точно това. Понеже там са скрити и като не ги виждаш, спираш и да ги мислиш. В С примерно си се грижиш да си ги слагаш тези 0-и и е по-трудно да спреш да се съобразяваш с тях и да не ги отчиташ.

Предполагам по подобен начин доста хора пишещи на С# не се сщат да си гледат указателите и заделените памети. Нали той си имаше garbage collection и ги обираше разни забравени.

 

А чакай чакай... на С# трудно може да заделяш памети просто защото повечето подобни неща стават автоматично и имаш много малко контрол над това какво става с тази памет. Това е и предимството на С# и Java - нямаш много грижи с подобни неща и по-лесно се програмира. Недостатъка както се сещаш е че понеже нямаш контрол трудно може да го убедиш да разкара нещо а извикването на GC.collect() e повече от грубо. Unmanaged кода е друга бира но ако ще се правят подобни неща по-добре на С++ че поне там имаш пълен контрол и можеш да правиш повече неща отделно че и езика е по-мощен.

 

 

 

Всъщност "Pause" си е уиндоус команда също, така че не е по-грешно. Даже според мен това е правилното решение, защото "pause" е създаден точно с тази цел - да спира изпълнението при .bat файлове. Другите решения са по-скоро "work araund" (основно защото нямат смисъла на "press any key"), на така или иначе недописания край на програмата. Иначе аз лично добавях и условна компилацийка според OS-а, за да ми е преносим кода и на линукс.

 

ПП. Естествено, горните разсъждения важат само за конкретния "проблем" - когато спирането става след края на програмата. Във вътрешността на кода не го препоръчвам.

 

И каква е разликата дали ще извикаш system("PAUSE"); или ще направиш

 

cout << "Press enter to continue...";

cin.get();

 

1 ред повече или това че трябва да натиснеш Enter а не само интервал?

 

Ето тук изглежда добре обяснена моята гледна точка: http://www.gidnetwork.com/b-61.html

 

На мен не ми харесва момента че се извиква външна програма ама както казах за студенти става :)

Link to comment
Share on other sites

И каква е разликата дали ще извикаш system("PAUSE"); или ще направиш

 

cout << "Press enter to continue...";

cin.get();

 

1 ред повече или това че трябва да натиснеш Enter а не само интервал?

 

Ето тук изглежда добре обяснена моята гледна точка: http://www.gidnetwork.com/b-61.html

 

На мен не ми харесва момента че се извиква външна програма ама както казах за студенти става :)

Ех, ама и ти си един "писател" (а не читател :rolleyes: )

 

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

 

Освен това изрично казах че става въпрос за накрая на програмата, т.е. точно преди return-а, а не във вътрешността...за там аргументите от линка важат.

 

Както и да е, и без това много време отделихме на толкова незначително нещо :)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.


×
×
  • Create New...