C/C++ Editování položky stromu ve Windows

C/C++ Editování položky stromu ve Windows
« kdy: 27. 06. 2015, 13:38:10 »
Snažím se porozumět jednomu zdrojovému kódu a přijít na to kde vzniká chyba a jak ji vyřešit. Je to takový editor na scénáře ve hře. Je tam strom ve kterém si vytváříte jakoby "složky" (triggery) ve kterých jsou efekty a podmínky. Položku ve stromě mohu přejmenovat nebo zkopírovat a vložit jako nový trigger. Chyba která tam vzniká je, že při vložení jsou na konci divné nečítelné znaky, ne moc ale jen několik, třeba dva, ale jak zkopíruju už zkopírovanou položku tak se to násobí. A tak potřebuju poradit na co bych se měl zaměřit když hledám tu chybu.

trigger.cpp
http://paste.ofcode.org/sin2HzidN6eagza3s4sAt
triggeredit.cpp
http://p.ahkscript.org/?p=ee985b
Procházel jsem to laděním a narazil jsem jen na to jak se tam otevírá nebo kopíruje schránka. Takže nemohu přijít na to jak tu chybu opravit.


Re:C/C++ Editování položky stromu ve Windows
« Odpověď #1 kdy: 27. 06. 2015, 14:06:04 »
Kód: [Vybrat]
void Trigger::tobuffer(Buffer& buffer) const
{
int i, num;

buffer.write(&state, 14);
buffer.fill(0, sizeof(long));
description.write(buffer, sizeof(long));
buffer.writes(name, sizeof(long));

//effects

num = effects.size();

buffer.write(&num, sizeof(long));
for (i = 0; i < num; i++)
effects[i].tobuffer(buffer);

for (i = 0; i < num; i++)
buffer.write(&i, sizeof(long));

//conditions

num = conds.size();

buffer.write(&num, sizeof(long));

for (i = 0; i < num; i++)
conds[i].tobuffer(buffer);

//condition order
for (i = 0; i < num; i++)
buffer.write(&i, sizeof(long));
}

Mohl by se na to někdo podívat a poradit jak to opravit?

Daniel Kozak

Re:C/C++ Editování položky stromu ve Windows
« Odpověď #2 kdy: 28. 06. 2015, 17:27:53 »
Snažím se porozumět jednomu zdrojovému kódu a přijít na to kde vzniká chyba a jak ji vyřešit. Je to takový editor na scénáře ve hře. Je tam strom ve kterém si vytváříte jakoby "složky" (triggery) ve kterých jsou efekty a podmínky. Položku ve stromě mohu přejmenovat nebo zkopírovat a vložit jako nový trigger. Chyba která tam vzniká je, že při vložení jsou na konci divné nečítelné znaky, ne moc ale jen několik, třeba dva, ale jak zkopíruju už zkopírovanou položku tak se to násobí. A tak potřebuju poradit na co bych se měl zaměřit když hledám tu chybu.

trigger.cpp
http://paste.ofcode.org/sin2HzidN6eagza3s4sAt
triggeredit.cpp
http://p.ahkscript.org/?p=ee985b
Procházel jsem to laděním a narazil jsem jen na to jak se tam otevírá nebo kopíruje schránka. Takže nemohu přijít na to jak tu chybu opravit.

No bez kompletniho zdrojaku ti moc nepomuzem, chyba muze byt kdekoliv a ne jen v te casti co jsi dal k dispozici, hodne se tam pracuje s objektem Buffer a bez jeho implementace se tezko soudi co dany kod dela atd.

Jan Šimek

Re:C/C++ Editování položky stromu ve Windows
« Odpověď #3 kdy: 28. 06. 2015, 23:53:26 »
Klasika: na konci chybí '\0'. Buď doplň do model\trigger.cpp:
Kód: [Vybrat]
Trigger::Trigger(Buffer& buffer)
{
memset(name, 0, sizeof(name));

nebo ještě lépe a obecněji do util\MemBuffer.cpp:
Kód: [Vybrat]
void MemBuffer::reads(char *dest, const size_t lensize)
{
size_t len = 0;

checkFits(lensize);

memcpy(&len, pos, lensize);
pos += lensize;

checkFits(len);
if (len)
memcpy(dest, pos, len);

dest[len] = '\0';
pos += len;
}

Re:C/C++ Editování položky stromu ve Windows
« Odpověď #4 kdy: 29. 06. 2015, 14:10:50 »
Dík za odpovědi. Já to už vyřešil a vyřešil jsem to jinak, protože jsem nechtěl měnit tu hodnotu kterou tam autor vyplnil pomocí setmem. Nebyl jsem si jistý jaké měl důvody k tomu že to udělal tak a ne onak a nechci aby v progamu vznikly další bugy. Takže jsem to udělal tak že jsem přiměl tu funkci na čtení dat aby vrátila počet načtených znaků a toho jsem pak využil k tomu abych mohl dosadit konec stringu v té funkci která volá .reads