Vorteil ist natürlich, dass nicht kopiert und kein neuer Speicher angefordert werden muss. Nachteil ist, dass das schnell nervig und unübersichtlich wird.
Kannst du nicht auf den std::vector<unsigned char> verzichten und direkt nur den struct vector nutzen? Ich denke, dass das die beste Möglichkeit wäre.
Oder musst du unbedingt kopieren, weil du beide vectors seperat benötigst?
Mit freundlichen Grüßen
Jeoni
Les dich bitte in das Thema Vectoren ein.
Du könntest als erstes mal den Vector der die Struct enthãlt zu einen Vector machen der einfach nur Pointer beinhaltet. Das was du da vorhast ist schwachsinnig einen Vector eine Grundgröße zu geben, da Vectoren Dynamische Arrays sind.
Code:
struct PakBody
{
unsigned char fileIndex;
char filePath[132];
int fileSize;
int fileOffset;
};
std::vector<unsigned char> m_pakContent;
std::vector<PakBody*> m_pakBodys;
void AddShiat()
{
PakBody* pPakBody = new PakBody;
unsigned char pChar;
//hier beliebigen shiat in pPakBody setzen
//hier den char setzen
m_pakBodys.push_back(pPakBody);
m_pakContent.push_back(pChar);
}
Wundert euch net, gerade alles am Handy geschrieben.
Ich brauch aber die Bytes beieinander, weil ich diese verschlüssle/entschlüssle. (mit DES)
Mit pointern wäre das ziemlich umständlich bis garnicht möglich, weil ich immer 8byte Blöcke brauche.
Den wechsel von char -> struct habe ich deswegen gemacht, weil ich ja in 8byte blöcken entschlüssle und nach jedem durchlauf eine struct noch nicht voll ist.
Was ist ver/entschlüssle ist eine liste von dateien.
Mit Pointern geht das eigentlich sehr gut. Ich würde von Anfang an die Daten in einen vector mit Structs einlesen und dann so zum Verschlüsseln vorgehen:
Genau so eine Schweinerei wird dadurch verhindert. Du hast eine Liste von PakBodys und willst sie mit einer Liste von chars initialisieren. Dafür wird nun jedes Element von m_pakContent durchgegangen und in m_pakBodys gesteckt, was natürlich nicht klappt, da char nun mal nicht in PakBody konvertiert werden kann. Dein Workaround nutzt genau dieselbe Schweinerei, die mein Beispiel auch nutzt: durch Verwenden von Pointern und eines Casts umgeht man die Typprüfung und interpretiert die Daten, auf die gezeigt wird, neu. Du machst es halt per memcpy und erzeugst damit eine Kopie und ich würde es eher in-place machen.
Mit Pointern geht das eigentlich sehr gut. Ich würde von Anfang an die Daten in einen vector mit Structs einlesen und dann so zum Verschlüsseln vorgehen:
Genau so eine Schweinerei wird dadurch verhindert. Du hast eine Liste von PakBodys und willst sie mit einer Liste von chars initialisieren. Dafür wird nun jedes Element von m_pakContent durchgegangen und in m_pakBodys gesteckt, was natürlich nicht klappt, da char nun mal nicht in PakBody konvertiert werden kann. Dein Workaround nutzt genau dieselbe Schweinerei, die mein Beispiel auch nutzt: durch Verwenden von Pointern und eines Casts umgeht man die Typprüfung und interpretiert die Daten, auf die gezeigt wird, neu. Du machst es halt per memcpy und erzeugst damit eine Kopie und ich würde es eher in-place machen.
Aber wie soll ich byteweise auf den structvector schreiben?
Das geht doch nicht oO
Oder bin ich zu doof dafür?
Kann ja nicht einfach ein Byte zu der struct casten.
Na klar kannst du das - Vektoren sind genau deswegen so nützlich, weil ihr Inhalt byteweise ~in einem Block~ im Speicher liegt.
Oder verwirrt dich &vec[0]?
Damit bekommst du einen Pointer auf das erste Byte aus genau diesem Speicherblock und kannst damit tun und lassen was du willst - wie bei einem normalen C-Array
Ich versuch aber mal was anderes.
Ich resize direkt meinen Structvector und loope per index durch &vec[i].
Ist zwar unsauber, aber wenns klappt o:
Mein Problem ist, wenn ich einen Vector mit dem typ "structxy" deklariere.
Dann kann ich ihm nicht sagen: "Schreibe folgendes BYTE."
Er würde ja nicht den index um 1 hochsetzen, sondern um die größe der struct.
union Name {
char chrArr[141]; //SizeOf(Record)
YourRecord Rec; // Deine Struct
}
Der Vektorindex für die Chars ist dann ByteIndex Div SizeOf(Union) und der Char Array index ist dann ByteIndex Modulo SizeOf(Union). Und wenn du die Structs Brauchst ist es einfach Union.Rec.
Wenn es das ist was du meinst
PS: Warum nutzen so viele C Entwickler Chars statt Bytes? Ich versteh das einfach nicht
Warum nicht einfach ein einziges mal .resize(), so wie in deinem Workaround?
Außerdem kannst du die Bytes einfach in ein ganz normales char Array einlesen, den Pointer zu einem PakBody-Pointer casten und mit diesem dann den vector initialisieren (Konstruktor mit first und last als Parameter).
Ich versuch aber mal was anderes.
Ich resize direkt meinen Structvector und loope per index durch &vec[i].
Ist zwar unsauber, aber wenns klappt o:
Und dann?
Quote:
Mein Problem ist, wenn ich einen Vector mit dem typ "structxy" deklariere.
Dann kann ich ihm nicht sagen: "Schreibe folgendes BYTE."
Er würde ja nicht den index um 1 hochsetzen, sondern um die größe der struct.
Doch, kannst du. Mit Pointer-Schweinerei. Genau für sowas ist die gut.
Quote:
Originally Posted by warfley
Wie wäre es mit einer Union?
Code:
union Name {
char chrArr[141]; //SizeOf(Record)
YourRecord Rec; // Deine Struct
}
Der Vektorindex für die Chars ist dann ByteIndex Div SizeOf(Union) und der Char Array index ist dann ByteIndex Modulo SizeOf(Union). Und wenn du die Structs Brauchst ist es einfach Union.Rec.
Wenn es das ist was du meinst
PS: Warum nutzen so viele C Entwickler Chars statt Bytes? Ich versteh das einfach nicht
Dann doch lieber chrArr[sizeof(YourRecord)] und wozu noch händisch die Byte-Offsets der einzelnen Records berechnen, wenn man schon die union hat? vec[RecordIndex].Rec bzw. vec[RecordIndex].chrArr[ByteIndex] tut es doch.
Vector ? 10/17/2014 - C/C++ - 6 Replies Hey,
wollte mal etwas Fragen (2 sachen).
Ich verende Vectoren(möchte sie verwenden) in einen TCP Server den ich im Moment schreibe.
Ich habe 2 Threads die die Vectors erstmal bearbeiten.
Code:
DWORD TCP_Server::Client_Accept_Thread()
{
sockaddr_in Clientinfo;
int Clientinfolen = sizeof(Clientinfo);
[c++] help with sub-vector 05/22/2014 - C/C++ - 8 Replies Well, i have a vector that stores objects of my class named 'Tools':
vercotr<Tools>myvect
that has lets say 5 objects saved in it... But now i want to make a method that makes a subvector from lets say 2nd (start) to 4th (end/finish) element in myvect and returns that newly created subvector.
returnSubvect(2,4); that is returning: subvect
Can anyone explain me how to do this? -Was strugling with this for some time now, but i cant get it to work.
Struct/MAP in struct speichern? 09/19/2013 - C/C++ - 26 Replies Ich versuche momentan in einer Struct den datentyp map zu speichern, aber sobald ich es in der struct in der headerdatei mit reinpacke stirbt das Programm beim start.
sieht ca so aus
struct EventGift
{
DWORD dwID;
int nCount;
int nPercentage;
};
Mw2 Vector 05/12/2011 - Call of Duty - 9 Replies Stimmt das wenn man Schaldämpfer raufschrauft dass sich die Vector nicht mehr so verzieht