CharArrays - Verständnissproblem ?



  • hallo zusammen,

    ich hab hier was mit 2 char arrays was mich bekloppt macht.

    also beide sind public member einer klasse:

    ...
    char   input[BUFFER_SIZE];
    char   message[BUFFER_SIZE];
    ...
    

    das input array wird so befüllt:

    this->in_bytes = recv( this->socket_id, this->input, sizeof( this->input ) - 1 , 0 );
    

    das message array fülle ich in einer schleife mit ein par bedingungen dann so:

    this->message[b+lastInt] = this->input[b];
    

    wenn ich nun danach beide ausgeben will, klappt das nur mit dem input array, beim message array bekomme ich keine ausgabe:

    printf("\n\n Input 2: %s  \n" , this->input );
    printf("\n Message 2: %s  " , this->message );
    

    wenn ich aber :

    printf("\n Message test: %c  " , this->message[4] );
    

    schreibe , oder nen forloop drüber mache steht da alles drin ... auch ein strcpy() klappt nur beim input und nicht beim massage ....
    kann mir das bitte einer erklähren ?

    vilen dank schonmal

    uwi



  • Vielleicht nicht nullterminiert?

    <💡>



  • hi,

    doch das ist bei beiden der fall,

    aber ich habe gerade festgestellt das message wohl nur auf den speicher von input verweisst...
    wenn:

    eins[3] = 'a';
    zewi[3] = 'b';
    
    eins[3] = zewi[3];
    

    was steht dann in eins[3] .. doch b oder nicht ...
    hab ich denn heute so nen brett vorm kopf ?

    uwi



  • uwi2k2 schrieb:

    aber ich habe gerade festgestellt das message wohl nur auf den speicher von input verweisst...

    Das kann nicht sein; denn message ist weder ein Zeiger noch eine Referenz.

    Aus dem, was du hier gezeigt hast, geht nicht wirklich vor, was du genau machst. Da geht noch was. Ansonnsten ist es ein Ratespiel und auf Raten hat hier kaum einer Lust.



  • Hi,
    ich weiß nicht wie deine Schleife genau aussieht und was lastInt ist, aber du weist dem message die Werte von input - versetzt um lastInt - zu. Von da her gibt es da keinen Verweis. Warum du keine Ausgabe bekommst, kann ich ohne weiteren Code nicht sagen. Aber es könnte schon mal problematisch sein, wenn du anfängst, die Werte von message erst an der lastInt-ten Stelle zu füllen, dann aber bei der Ausgabe gleich mit dem ersten Array-Element anfängst, dieses aber nicht definiert sind.

    uwi2k2 schrieb:

    wenn:

    eins[3] = 'a';
    zewi[3] = 'b';
    
    eins[3] = zewi[3];
    

    was steht dann in eins[3] .. doch b oder nicht ...

    Natürlich b.

    uwi2k2 schrieb:

    hab ich denn heute so nen brett vorm kopf ?

    Anscheinend 🙂



  • hi ok,

    hier mal die 2 funktionen um die es geht:

    int Socket_Client::read( )
    {           	
        this->cleanInput();
        this->in_bytes = recv( this->socket_id, this->input, sizeof( this->input ) - 1 , 0 );
    
        if( this->in_bytes == -1)
            return -1;
    
        this->input[this->in_bytes] = '\0';
    
        this->SplitData();
    
        return 0;      
    };
    

    ...

    void Socket_Client::SplitData()
    {
    	this->process = false;
    	memset( &this->message[0], 0, sizeof( this->message ) );
    	bool umschalter = false;
    	int  umschaltInt = 0;
    	int  lastInt = 0;
    
            printf("\n\n Input 1: %s  \n" , this->input );
    
    	printf("\n Holder 1: %s  \n" , this->holder );
    
        for( int a = 0; a < sizeof( this->holder); a++ )  
    	   {
              if( this->holder[a] != NULL )
    		    {    
    				if( this->holder[a] == this->trennzeichen )
    				  {
                        umschalter = true;
                        umschaltInt = a;
    					printf("\n Trennzeichen: ++%c++ " , this->holder[a] );
    				  }
    				else
    				 {
    					lastInt = a;
                        if( umschalter )
    					  {
    						  this->holder[a-umschaltInt] = this->holder[a];
    						  this->holder[a] = 0;
    					  }
    					else
                           this->message[a] = this->holder[a];
    				 }
    		    }
        	}
    
    	printf("\n Message:%s-- " , this->message );
    	printf("\n Holder 2:%s-- " , this->holder );
    
        lastInt++;
    
    	printf("\n\n Input 2: %s  \n" , this->input );
    
        // neuen input verarbeiten
        for( int b = 0; b < sizeof( this->input)-2; b++ )  
    	   {
    
              if( this->input[b] != NULL )
    		    {
                 //printf(" *%c* " , this->input[b] );
    
                 if( !umschalter )
    			   {
    				if( this->input[b] == this->trennzeichen )
    				  {
                        umschalter = true;
    					this->message[b+lastInt]   = ';';
    					this->message[b+lastInt+1] = '\0';
    					printf(" trennzeichen " );
    				  }
    				else
    				 {
    					 cout << endl;
    					 cout << endl;
    					 cout << "i:" << this->input[b] << endl;
    					 cout << "r:" << &this->input[b] << endl;
                         //this->message[b+lastInt] = this->input[b] ;
    					 memcpy ( &this->message[b+lastInt] , &this->input[b] , 1 );
    					 cout << "m:" << this->message[b+lastInt] << endl;
    					//printf(" - setze: %i : %c " , ( b+lastInt ) , this->input[b] );
    					//printf(" %c " ,  this->message[( b+lastInt )] );
    				 }
    			   }
    			 else
    			   {
    			      this->holder[b+lastInt-umschaltInt] = this->input[b];
    			   }
    
    		    } 
        	}
    
    	printf("\n Message 2: %s -- " , this->message );
    	printf("\n Holder 3: %s -- \n" , this->holder );  
    
        this->cleanInput();
    
    	string tester(this->message);
    
    	printf("\n Message 3: %s -- " , tester );
    
    }
    

    ich hoffe das hilft weiter

    danke !
    uwi



  • aahh ,

    danke @[Rewind]

    das wars ... da ich in massage immer mit 1 angefangen habe war das 0te element immer nicht gesetzt ... DANKE !!!
    das hat mich wieder 2 stunden meines lebens gekostet so ein 😡 Fehler ..

    Danke !!
    uwi


Anmelden zum Antworten