String basten aus mehreren Char-Arrays



  • Hallo zusammen, nach einer längeren Zeit der der C Abstinenz habe ich mich wieder der Sprache zugewandt und stehe auch schon vor einem Problem.

    Ich habe ein Struct der so ausschaut

    struct TypeA {
    	int isAktiv;
    	char varnr ;
    	int  value;
    	char name[20];
    };
    
    extern struct TypeA[32];
    
    Ints[0].Id=1;
    Ints[0].Varnr=0x61;
    strcpy(Ints[0].Name, "test0");
    Ints[0].Value = 100;
    
    Ints[1].Id=1;
    Ints[1].Varnr=0x62;
    strcpy(Ints[1].Name, "test1");
    Ints[1].Value = 101;
    ...
    

    Ich möchte nun über eine TCP Verbindung alle Namen raus senden die in dem Struct-Array Angelegt wurden. Wobei nicht immer alle 32 verwendet werden. Die Verwendung repräsentiert eine 32Bit wertiges int. Was aber an sich jetzt nicht zu meinem Problem gehört.
    Denn ich will in einer Schleife TypeA durchlaufen für jedes gesetzte Bit soll name[20] in an einen String angehängt und durch Semikolons getrennt werden. In der Form also ;test0;test1;test4;
    Mein Problem ist jetzt nur wie mach ich das denn am besten ich will nicht unbedingt mehr Speicher belegen als ich brauche.
    Gedacht hatte ich mir das in etwa so...

    int i = 0;
    char *ptr = NULL;
    ptr = calloc(LENGTH_OF_TYPEA,sizeof(TypeA->Name));
    //Anstelle der For wird eigentlich der Bitwert Überprüft
    for (i=0; i <LENGTH_OF_INTS;i++ )
    {
       /*
        * Wie bekomme ich jetzt die Namen in der TypeA durch ;
        * getrennt in ptr
        */
       //strncat(ptr,TypeA[i].Name, sizeof(TypeA[i].Name));
    }
    
    send_message(pcb, ptr, sizeof(ptr));
    

    Kann mir da jemand einen Tipp geben? Stehe irgendwie auf dem Schlauch.

    //Deklaration von send_message 
    send_message(struct tcp_pcb *pcb, void *msg, u16_t len);
    

    Gruß Loro



  • Hi,
    eine Möglichkeit wäre natürlich, die Namen einfach nacheinander, ohne zusätzliche Speicherallokation rauszuschicken.
    Okay, dann gingen ein paar Bytes mehr für die TCP Header über die Leitung.
    Wenns denn unbedingt in einem Stück sein muss ... calloc?!
    Brauchst du nicht, schätze ich mal grob.
    Deine maximale Datenmenge ist doch bekannt.
    641 Bytes müsste doch dein System für Stackspeicher hergeben, oder?

    char sendbuf[32*20+1] = {0};
    for ( i = 0; i < n; i++ )
    {
        strcat ( sendbuf, TypeA[i].Name );
        strcat ( sendbuf, ";" );
    }
    

Log in to reply