Zjednodušení kódu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zjednodušení kódu – C / C++ – Fórum – Programujte.comZjednodušení kódu – C / C++ – Fórum – Programujte.com

 

sXe
~ Anonymní uživatel
31 příspěvků
20. 2. 2010   #1
-
0
-

Dobrý den,
mám v programu psaném v C++ kus kodu který se z velké části opakuje a chtěl bych jej zjednodušit pomocí nějaké funkce pro práci s řetězcem, jestli taková funkce existuje. Měla by dělat toto:

switch (i)

{
case 1:
Label1->Text=X[1];
break;
case 2:
Label1->Text=X[1]+", "+X[2];
break;
case 3:
Label1->Text=X[1]+", "+X[2]+", "+X[3];
break;
.
.
.
}

Tzn. přidat do řetězce několikrát podle proměné n řetězec +", "+X[n]. Napadá vás něco? Díky moc za rady.

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
20. 2. 2010   #2
-
0
-

cyklus

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sXe
~ Anonymní uživatel
31 příspěvků
20. 2. 2010   #3
-
0
-

KIIV napsal:
cyklus


Tak jsem zkusil toto:
char text[100]=IntToStr(num[last]).c_str();


for(int i=1; i<10 && (last-i)>=0; i++)
{
strcat(text,", "+IntToStr(num[X-i]));
}
Label1->Caption="Poslední čísla: "+text;


Překlad mi ale vyhodí chyby. :-(
[C++ Error] Unit1.cpp(24): E2034 Cannot convert 'char *' to 'char[100]'

[C++ Error] Unit1.cpp(39): E2034 Cannot convert 'AnsiString' to 'const char *'
[C++ Error] Unit1.cpp(39): E2342 Type mismatch in parameter '__src' (wanted 'const char *', got 'AnsiString')
[C++ Error] Unit1.cpp(41): E2085 Invalid pointer addition

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
20. 2. 2010   #4
-
0
-

proc to prevadis na char? mnohem jednodussi je pouzit std::string text = ... zadny strcat a podobne funkce proste text += ", " + ....

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sXe
~ Anonymní uživatel
31 příspěvků
20. 2. 2010   #5
-
0
-

To KIIV :
To jsem nevěděl že to tak jde. :) Ale stejně při deklaraci

std::string text=IntToStr(num[last]);

mi překladač vyhodí toto:
[C++ Error] Unit1.cpp(24): E2316 'string' is not a member of 'std'

[C++ Error] Unit1.cpp(24): E2379 Statement missing ;

Nahlásit jako SPAM
IP: 217.197.36.–
string
~ Anonymní uživatel
1 příspěvek
20. 2. 2010   #6
-
0
-

#include <string>?

Nahlásit jako SPAM
IP: 78.102.40.–
KIIV
~ Moderátor
+43
God of flame
20. 2. 2010   #7
-
0
-

nebo zkusit ten AnsiString ..

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sXe
~ Anonymní uživatel
31 příspěvků
20. 2. 2010   #8
-
0
-

string napsal:
#include <string>?


Ano chybělo mi to tam, stejně další chyby vypluly na povrch, už mě to nebaví.
std::string text=IntToStr(num[last]);


for(int i=1; i<10 && (last-i)>=0; i++)
{
text+=", "+IntToStr(num[last-i]);
}
Label2->Caption="Poslední čísla: "+text;

[C++ Error] Unit1.cpp(1): E2285 Could not find a match for 'std::string::basic_string(const std::string&)'

[C++ Error] Unit1.cpp(3): E2094 'operator+=' not implemented in type 'std::string' for arguments of type 'AnsiString'
[C++ Error] Unit1.cpp(5): E2034 Cannot convert 'std::string' to 'AnsiString'
[C++ Warning] Unit1.cpp(6): W8004 'text' is assigned a value that is never used

Ještě více chyb. :-(

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
20. 2. 2010   #9
-
0
-

tak to zkus hodit na AnsiString nebo stringstream a pracovat s tim podobne jako s cout << (ostream)

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sXe
~ Anonymní uživatel
31 příspěvků
20. 2. 2010   #10
-
0
-

To KIIV :

AnsiString text=IntToStr(num[last]);

Funguje! Díky moc za pomoc, díky takovým lidem jako jsi ty je toto forum na úrovni!

Nahlásit jako SPAM
IP: 217.197.36.–
sXe
~ Anonymní uživatel
31 příspěvků
20. 2. 2010   #11
-
0
-

Ještě se chci zeptat zda jde použít jméno komponenty uloženou v Sender události někde v programu. Např nějak takto:

num[x]=Sender->Caption;

x++;

Tento kod ale skončí chybou:
[C++ Error] Unit1.cpp(88): E2316 'Caption' is not a member of 'TObject'

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
20. 2. 2010   #12
-
0
-

dynamic cast na objekt ze, ktereho to prichazi.. (pokud mozno stale stejnej, ale da se rozeznat i vice jen sloziteji)

neco jako: <type> *p_subclass = dynamic_cast<<type> *>( p_obj );
za <type> musis dat spravnou tridu.. treba TButton nebo podobne ...

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sXe
~ Anonymní uživatel
31 příspěvků
20. 2. 2010   #13
-
0
-

Nějak takto?

<TBitBtn> *c = dynamic_cast<<TBitBtn> *>( p_obj );

num[x]=c->Caption;
x++;

Hází mi to chybu
[C++ Error] Unit1.cpp(88): E2188 Expression syntax

[C++ Error] Unit1.cpp(90): E2451 Undefined symbol 'c'

A jaký je význam p_obj?

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
20. 2. 2010   #14
-
0
-

TBitBtn *c = dynamic_cast<TBitBtn *>( Sender );

num[x]=c->Caption;
x++;

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sXe
~ Anonymní uživatel
31 příspěvků
20. 2. 2010   #15
-
0
-

KIIV napsal:

TBitBtn *c = dynamic_cast<TBitBtn *>( Sender );
num[x]=c->Caption;
x++;


Jak ti to mám vrátit? :-D Prozatím díky moc, ještě určitě budu mít nějaký problém. :-))

Nahlásit jako SPAM
IP: 217.197.36.–
sXe
~ Anonymní uživatel
31 příspěvků
21. 2. 2010   #16
-
0
-

Až pomocí debuggeru jsem byl schopen napsat tuto událost.

void __fastcall TForm1::RemoveButton2Click(TObject *Sender)

{
if(last>1)
{
last-=2;

//Deklarace a uložení prvního čísla
AnsiString text=IntToStr(num[last]);

//Zapsání čísel do Label
for(int i=1; i<LAST_NUMBER && (last-i)>=0; i++)
{
text+=", "+IntToStr(num[last-i]);
}
Label2->Caption="Poslední čísla: "+text;

last++;
}
else if(last==1)
{
last--;
Label2->Caption="Poslední čísla: ";
}
else
Label2->Caption="Poslední čísla: ";

//Zobraz počet čísel v poli
Label3->Caption="Počet čísel: "+IntToStr(last);
}

Při odečtení pouze jedničky od last v první podmínce mi událost jakoby na první zavolání nefungovala, last se zmenšilo o jedničku ale text zůstal stejný a až při dalším zavolání události v textu zmizlo naposled přidané číslo, takže celé to bylo jakoby o jedno zavolání opožděné i přesto že last byl správný.. Tak jsem zjisti v debuggeru že při odečtení dvojky a následném přičtení jedničky vše funguje tak jak má. Jen pořád nechápu proč tomu tak je.

Nahlásit jako SPAM
IP: 217.197.36.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 81 hostů

Podobná vlákna

Zjednodušení kodu — založil marpit

Zjednoduseni kodu — založil Mutagen

Zjednodušení kodu — založil Empty

Zjednodušení kódu — založil Sergei

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý