Hirdetés

Keresés

Új hozzászólás Aktív témák

  • G.A.

    aktív tag

    válasz buherton #5850 üzenetére

    Köszönöm a gyors választ.

    dns_answer local_answer -> ez nincs használva.
    dns_response -> nincs deklarálva.
    local_dns_resp -> nincs deklarálva.
    ...
    dns_answer** answer -> ezt nem használod semmire.

    A problémás kódrészt próbáltam leegyszerűsítve a hozzászólásba beírni, közben sikerült nekem is belezavarodnom és elírnom.
    dns_answer local_answer = local_dns_resp
    dns_answer** answer = *dns_response

    u8b data[] -> ez nagyon csúnya.
    Mitől csúnya? Inkább u8b* data legyen? Még előnybe részesítem a tömböket a pointerekkel szemben, mivel azokat könnyebben kezelem. 8bites uC-n is könnyebben nyomon tudom követni, hogy mennyi RAM-ot is használok...

    A struct-hoz erősen javaslok egy packed attribute-omot.
    Hobbi programozóként nem tudom mit jelent... mire használható.

    Minek union?
    Megint uC-re hivatkozok. Anno #define-t használtam egy tömb változóinak az azonosításához. Ezt cseréltem le unionba ágyazott struktúrákkal. Így értem:
    typedef union udpv4_header
    {
    struct
    {
    my_16b src_port;
    my_16b dst_port;
    my_16b length;
    my_16b checksum;
    };
    u8b b[8];
    }udpv4_header;

    A struktúrát használom egy konkrét változó módosításához, majd ha másolom/küldöm az adatcsomagot akkor a b[]-t használom.

    miért is nem memcpy-k?
    Szintén egy hiányosságom. Még nem tanultam meg a használatát...

    Közben szerintem meglett a megoldás(működik). Ez lett a function() módosított kódja:

    void get_data_from_dns_reply(u8b* data, dns_header* dns_resp_header, dns_answer*& dns_response)
    {
    u8b i = 0;
    for (; i < 12; i++)
    {
    dns_resp_header->b[i] = data[i];
    }

    dns_response = (dns_answer*)malloc(htons(dns_resp_header->answer_rrs.i) * sizeof(dns_answer));

    for(; data[i] != 0; i++)
    {
    i += data[i];
    }
    i += 5;

    for(u16b j = 0; j < htons(dns_resp_header->answer_rrs.i); j++)
    {
    i += 12;
    for (u8b x = 0; x < 4; x++, i++)
    {
    dns_response[j].data.b[x] = data[i];
    }
    }
    }

  • G.A.

    aktív tag

    Üdv!

    8Bites mikróvezérlőhöz írogatok kódot, amit VS 2015-ben (C++) tesztelek.
    A vezérlőre írt kódot C-ben írom, de a teszthez használt segédfunkciókhoz C++-t is használok.

    A probléma:
    globális struktúra (pontosabban union) tömböt(pointert?) szeretnék funkcióval manipulálni (méret megadása, adatokkal feltöltés)

    Kódban kifejezve:

    typedef union dns_answer
    {
    struct
    {
    my_16b name;
    my_16b type;
    my_16b rrs_class;
    my_32b ttl;
    my_16b rd_length;
    my_32b data;
    };
    u8b b[16];
    }dns_answer;

    void function(u8b data[], dns_answer** answer)
    {
    dns_answer local_answer;
    *dns_response = (dns_answer*)malloc(data[7] * sizeof(dns_answer));

    for(u8b i = 0; i < data[7]; i++)
    {
    for (u8b x = 0; x < 4; x++)
    {
    local_answer.data.b[x] = data[x];
    //*dns_response[i].data.b[x] = data[x];
    }
    *dns_response[i] = local_dns_resp; // HIBA ITT
    }
    }

    dns_answer* answer_array = NULL;
    u8b data[512] = {};

    int main(void)
    {
    ...
    function(data, &answer_array);
    ...
    }

    Ezzel a kóddal jelenleg az a problémám, hogy:
    Ha érkezik egy adatcsomag(DNS üzenet), ahol több válasz van (data[7] > 1), akkor a jelölt helyen (HIBA ITT)
    áll meg a kód... Hibaüzenet: Access violation writing location 0x00000000

    Ha jól értem olyan címre akar írni, ami nem létezik. A hiba eredetét a malloc()-ra tippelem. Következtetésem az, hogy ha kihagyom a function()-ban a malloc()-ot és az inicializáláskor az int main() előtt megadom a tömb méretet, akkor nincs ez a hiba.
    Hogyan méretezhetném újra a struktúra tömbömet (dns_answer* answer_array) a funkción belül, úgy hogy az globálisan is megvalósuljon?

    illetve., hogy kerülhetném ki a function()-ban az átmeneti lokális struktúra használatát?

  • G.A.

    aktív tag

    válasz dabadab #5302 üzenetére

    Utánanéztem, hogy eddig melyiket is használtam a C vagy a C++ és ez elsővel szoktam a mikróvezérlőkre(AVR) kódot írni, WinAVR-el.

    A C# most hirtelen azért kellett, mert egy USB átalakító chip-hez akartam egy parancssorban lefutható kódot írni, aminek a példa kódja C#-ben volt leírva.

    GA

  • G.A.

    aktív tag

    válasz dabadab #5298 üzenetére

    Elnézést, lehetséges.
    Csak hobby szinten foglalkozom program írással és akkor is 8bites mikrokontrollerekre-re. Nekem a C, C++ és a C# egy kalap alatt van. (még nem látom az eltéréseket)

    GA

  • G.A.

    aktív tag

    válasz bucsupeti #5296 üzenetére

    Üdv!

    Akkor nincs egyszerűbb megoldás, végig kell zongorázni a karaktereken?

    Erre jutottam:

    int line_count = 0, byte_count = 0;
    byte[] TXBuffer = new byte[262144];
    byte[] hex_data = new byte[262144];

    string text = System.IO.File.ReadAllText(@"L:\stk500.hex");
    string[] textSplit = text.Split(':');

    foreach (string line in textSplit)
    {
    line_count++;
    foreach (byte character in line)
    {
    TXBuffer[byte_count++] = character;
    }
    }

    for (int i = 0, x = 0, temp; i < byte_count; )
    {
    if(TXBuffer[i] <= 0x39)
    {
    temp = (TXBuffer[i] - 0x30)*16;
    hex_data[x] += (byte)temp;
    }
    else if (TXBuffer[i] >= 0x41)
    {
    temp = (TXBuffer[i] - 0x37) * 16;
    hex_data[x] += (byte)temp;
    }
    i++;

    if (TXBuffer[i] <= 0x39)
    {
    temp = (TXBuffer[i] - 0x30);
    hex_data[x] += (byte)temp;
    }
    else if (TXBuffer[i] >= 0x41)
    {
    temp = (TXBuffer[i] - 0x37);
    hex_data[x] += (byte)temp;
    }
    i++; x++;
    }

    Este még nem működött, mert ezek hex_data[x] += (byte)temp; helyett ezt hex_data[x] = (byte)temp; írtam... Jól éreztem, hogy rá kellett aludni egyet.

    bucsupeti: köszönöm a segítséget!

    GA

  • G.A.

    aktív tag

    Üdv!

    A következőhöz szeretnék egy kis segítséget kérni.

    Van egy ASCII karaktereket tároló stringem (19C020C01F) amit át szeretném vinni array-be, de úgy hogy a kapott array így nézzen ki: array = {0x19, 0xC0, 0x20, 0xC0, 0x1F}.

    Ezt hogy lehet kivitelezni?

    GA

Új hozzászólás Aktív témák