Struct und doppelte Zeiger



  • Hallo an alle, ich habe folgendes Problem, kann mir jemanden einen Typ geben?

    typedef struct eva_structblobinfo
     {
      long lDataSize;
      void *pData;
     } eva_STRUCTBLOBINFO;
    
    // global
    char **cTestTxt;
    void uno(void)
    {
           char cTemp[200]="";
    	SYSTEMTIME time;		 
    	FILE *fp;
           GetLocalTime (&time);
    
            cTestTxt=(char**) malloc(1*sizeof(char*)); 
    
    	sprintf(cTemp,"\nTime:           %d:%d:%d",time.wHour, time.wMinute,time.wSecond);   
    	cTestTxt[0]=(char *) malloc(strlen(cTemp)+1);  
    	strcpy(cTestTxt[0],cTemp);
    
    	sprintf(cTemp,"\nAqui van otros datos:           %s","otros datos");   
    	cTestTxt[1]=(char *) malloc(strlen(cTemp)+1);  
    	strcpy(cTestTxt[1],cTemp);
    }
    
    void dos(void)
    {
    eva_STRUCTBLOBINFO tBlobInfo;
    
                            tBlobInfo.pData = (char *) malloc(sizeof(cTestTxt)); 
    			 memcpy ((char *)tBlobInfo.pData, cTestTxt,sizeof(cTestTxt));    
    			  tBlobInfo.lDataSize = sizeof(cTestTxt);  
    
    			   free(cTestTxt);
    }
    

    In der Funktion void dos(void):
    Meine Frage: wie ermittle ich die Größe von cTestTxt und weise auf tBlobInfo.lDataSize zu?
    Zweite Frage: wie kopiere ich die Daten von cTestTxt auf tBlobInfo.pData?
    Der struct eva_structblobinfo ist fest definiert (in einem anderen Program), und **cTestTxt muss ich in diesem Form definieren.
    Für jeden Typ bedanke ich mich.



  • Schlimmstes Gefrickel und obendrein falsch.
    Globale Variablen sind scheiße.
    void funktion(void) ist ebenso scheiße.
    Verzichte auf deine angeblich "unbedingt notwendige" globale Variable und arbeite ausschließlich mit lokalen Variablen vom Typ eva_STRUCTBLOBINFO, die du als Parameter/Rückgabewerte mit Funktionen aufrufst.
    Und benutze hier C-Codetags und NICHT Code-Codetags.



  • Hallo Wutz,
    danke für die Antwort, aber es hat mir nicht weiter geholfen.
    Ich arbeite in einem Projekt wo diese globale Variable schon definiert ist. Ich muss diese Variable in einer bestimmten Funktion dynamisch erzeugen und mit Werten ausfüllen, und in einer anderen befreien.
    Gruß.
    Abel



  • oabel5 schrieb:

    Meine Frage: wie ermittle ich die Größe von cTestTxt und weise auf tBlobInfo.lDataSize zu?

    z.b. mit

    int i;
    
    i=0;
    
    for(;;)
    {
         if(*(cTestTxt+i)==NULL)
         {
              break;
         }
    
         i++;
    }
    
    tBlobInfo.lDataSize = i;
    

    voraussetzung dafür ist natürlich, dass du auch speicher für den null-zeiger anforderst, was du eigentlich immer machen solltest, aber momentan nicht machst.

    Zweite Frage: wie kopiere ich die Daten von cTestTxt auf tBlobInfo.pData?

    z.b. so:

    int gewuenschte_zeile = 4711;
    
    tBlobInfo.pData = *(cTestText + gewuenschte_zeile);
    


  • Wade1234 schrieb:

    oabel5 schrieb:

    Meine Frage: wie ermittle ich die Größe von cTestTxt und weise auf tBlobInfo.lDataSize zu?

    z.b. mit

    int i;
    
    i=0;
    
    for(;;)
    {
         if(*(cTestTxt+i)==NULL)
         {
              break;
         }
    
         i++;
    }
    
    tBlobInfo.lDataSize = i;
    

    Homegrown strlen(), oder wie?



  • Wade5678 schrieb:

    Homegrown strlen(), oder wie?

    im prinzip ja, nur dass da eben zeiger verarbeitet werden. oder kann man strlen auch char** übergeben?



  • Wade1234 schrieb:

    oder kann man strlen auch char** übergeben?

    warum sollte man das tun?



  • Wade9abc schrieb:

    warum sollte man das tun?

    weil cTestText vom Typ char** ist. oder versteh ich hier grad was falsch?



  • Wade1234 schrieb:

    Wade9abc schrieb:

    warum sollte man das tun?

    weil cTestText vom Typ char** ist. oder versteh ich hier grad was falsch?

    er macht doch:
    cTestTxt[0]=malloc(strlen(cTemp)+1); strcpy(cTestTxt[0],cTemp);

    dann sollte also auch das gehen:
    len = strlen(cTestTxt[0]);
    bzw:
    len = strlen(*cTestTxt);



  • dann hab ich wohl tatsächlich was falsch verstanden. ich bin jedenfalls davon ausgegangen, dass er quasi die anzahl der zeilen wissen möchte.


Anmelden zum Antworten