2016-04-23 7 views
3

Ich möchte eine struct erstellen und enthält Int-und Char-Variablen. Hier ist mein Code:Definieren und verwenden Sie eine Zeichenkette in der Struktur

typedef struct { 
     uint16_t type;  
     uint16_t sn; 
     int data1; 
     int data2; 
     char crc[1024]; 
    }packet_t; 

Dann benutze ich eine Methode ein struct zu erstellen:

packet_t packetCreate(uint16_t type,uint16_t sn, uint16_t data1, 
uint16_t data2, char crc[1024]) 
{ 
    packet_t packet; 
    packet.type = type; 
    packet.sn = sn; 
    packet.data1 = data1; 
    packet.data2 = data2; 
    packet.crc = crcr; 
    return packet; 
} 

auch ich die entsprechenden Variablen im Code definiert haben. Aber wenn ich den Code kompiliere, funktioniert es nicht und zeigt:

inkompatible Typen beim Zuweisen zum Typ 'char [1024]' vom Typ 'char *' in der Zeile: packet.crc = crcr; Wie soll ich die Struktur definieren und verwenden? Ich möchte die Struktur erstellen enthält eine Zeichenkette, so dass ich die CRC-Datenfolgen speichern können.

+3

sollte die Linie 'packet.crc = crc;' statt 'packet.crc = CRCR;' – tom

+0

See: http://stackoverflow.com/ a/16645642/817132 Oder K & R's C, Seite 97: http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf – wally

+0

Hinweis: C unterstützt _methods_ nicht. Nur _Funktionen_. – Olaf

Antwort

3

Verwenden Sie memcpy. d.h.

memcpy(packet.crc, crc, sizeof(packet.crc)); 

Um den Inhalt in das Array zu kopieren.

Sie benötigen

#include <string.h> 

diese Funktion zu nutzen

+0

NB fehlende Komma - sollte 'memcpy (packet.crc, crc, sizeof (Paket.crc)); '- Ich kann nicht versuchen, dies zu bearbeiten, weil ich dafür mindestens 6 Zeichen eingeben muss – tom

+0

Hoppla - danke tom –

3

Sie kann nicht nur String an einen anderen string.Like zuordnen

packet.crc = crc; 

Das obige Verfahren ist falsch. Sie müssen den Befehl strcpy hier aus der Bibliothek string verwenden.

strcpy(packet.crc,crc); 

Vergessen Sie nicht, Bibliothek string.h zu nennen.

+1

Hinweis: C hat keinen String-Typ. Es ist alles Konvention. Und sie sind sowieso nicht die gleichen Typen. Das Mitglied ist ein Array, der Parameter ist ein Zeiger. – Olaf

2

Sie können Arrays nicht direkt einander zuweisen. Sie können Bibliotheksfunktionen wie memcpy() (oder strcpy() im Falle einer nullterminierten Zeichenfolge) verwenden. Eine andere Möglichkeit besteht darin, die Elemente nacheinander in einer Schleife aus dem Quell-Array zum Ziel zu kopieren.

1

Zusätzlich zu den anderen Kommentaren habe ich Bedenken, dass Sie Ihre packet_t Variable packet innerhalb der Funktion definieren und wenn die Funktion zurückgibt, wird der Speicher packet 'verschwinden'.

Es ist besser, packet in main zu erklären und dann mit der Adresse der packet die Routine aufrufen - oder den Zeiger auf packet.

Sie können dann Ihre Funktion ändern zu

void packetCreate(packet_t *p_packet, ruint16_t type,uint16_t sn, uint16_t data1, 
uint16_t data2, char crc[1024]) 
{ 
    // p_packetn = &packet - it is a pointer to the packet 
    p_packet->type = type; 
    p_packet->sn = sn; 
    p_packet->data1 = data1; 
    p_packet->data2 = data2; 
    p_packet->crc = crcr; // note other answers to correct this line 
    return ; 
} 
+0

@CoolGuy - vielen Dank für die Bearbeitung - große Verbesserung – tom

Verwandte Themen