Frage

Wie soll ich meinen Code in einen bestimmten Array -Index eines Arrays schreiben, der zufällig Mitglied einer Struktur ist? Der folgende Code gibt mir Probleme.

// main.c

void clean_buffers(void); // prototype

struct DEV_STATUS {
    unsigned char ADDR;
    unsigned char DEV_HAS_DATA;
    unsigned char ETH_HAS_DATA;
    unsigned char DATA[20];
};

struct DEV_STATUS g_cmdQueue[60] = {0};

void main(void) {

    clean_buffers();

    while (1) {
        ;// MCU tasks        
    }
}

void clean_buffers(void) {
    unsigned char theCount = 0;
    byte queIdx;
    for (queIdx = 0; queIdx < 59; queIdx++) {
        struct DEV_STATUS *p_struct;
        unsigned char *p_data;
        p_struct = &g_cmdQueue[queIdx];
        p_data = &p_struct->DATA;
        p_struct->ADDR = 0;
        p_struct->DEV_HAS_DATA = 0;
        p_struct->ETH_HAS_DATA = 0;
        theCount = 0;
        while(*(p_data+theCount) != 0) {
            *(p_data+(theCount++)) = 0;
        }
    }    
} // EOF main.c

Ich bekomme einen Compiler -Fehler "Struktur/Gewerkschaftsmitglied erwartet" in der folgenden Zeile:

p_data = &p_struct->DATA;

Wie soll ich einen Zeiger schreiben, wenn ich auf den spezifischen Wert der Strukturmitgliederdaten [3] zugreifen sollte? Ich bin verwirrt, ich dachte, dass p_data = & p_struct-> Daten; ist definiert, ich sollte es in der Lage sein, es mit *(pdata+3) zu bekommen, aber ich denke, mir fehlt etwas.

War es hilfreich?

Lösung

Sind Sie sicher, dass Sie denselben Code zusammenstellen, den Sie hier gepostet haben?

Wenn sich Ihr Compiler über diese Zeile beschwert

p_data = &p_struct->DATA;

Mit einer "Struct/Union -Mitglied erwartete" Nachricht ist Ihr Compiler wahrscheinlich gebrochen.

Beachten Sie, dass &p_struct->DATA ist ein vollkommen gültiger Ausdruck in C. Es gibt absolut keine Probleme mit diesem Ausdruck.

Das Problem hier ist nur, dass dies nicht das ist, was Sie in Ihrem Fall brauchen. &p_struct->DATA Gibt einen Zeiger auf das gesamte Array -Daten zurück, dh einen Zeiger vom Typ unsigned char (*)[20]. Sie versuchen, diesen Wert einem Zeiger vom Typ zuzuweisen unsigned char *. Dies ist in C illegal, da die Typen völlig unterschiedlich sind, aber traditionell C -Compiler mit einem bloßen "Mismpatch" -Gentyp "WARNUNG" und eine implizit arbeiten immer noch wie beabsichtigt).

Auch wenn ein Compiler beschließt, diese Nichtübereinstimmung als Fehler zu kennzeichnen (was in Ordnung ist), sollte es sich immer noch nicht über Probleme der Art von "Struct/Union -Mitglied erwartet" beschweren. Hier gibt es keine solchen Probleme.

Ps wie andere bereits gesagt, was Sie wirklich brauchen, ist p_data = &p_struct->DATA[0], aber das erklärt immer noch nicht das seltsame Verhalten Ihres Compilers. Könnte es sein, dass 'Daten' ein Makro ist, das irgendwo vor der Definition von 'Clean_Buffer' definiert ist?

Hinzugefügt vom 19.19.2009: Nate, in Ihrem Code, zugreifen Sie mit einem Index auf Ihr Array theCount. Da Sie den Indexzugriff ohnehin verwenden, gibt es wirklich keinen Grund, den Zeiger zu erstellen, den Sie erstellen möchten. Der Code funktioniert ohne zusätzlichen Zeiger vollkommen in Ordnung. DATA Feld direkt

theCount = 0;
while (p_struct->DATA[theCount] != 0) {
  p_struct->DATA[theCount++] = 0;

(Ich würde wahrscheinlich eine verwenden for Fahrrad hier).

Wenn Sie wirklich darauf bestehen, diesen Zeiger zu erstellen und dennoch den Indexzugriff zu verwenden, sollte der Code ungefähr wie die folgenden Aussehen aussehen (die anderen haben dies bereits mehr als einmal vorgeschlagen)

p_data = p_struct->DATA; /* or &p_struct->DATA[0] */
...
theCount = 0;
while (p_data[theCount] != 0) {
  p_data[theCount++] = 0;

Darüber hinaus können Sie sich für eine "exotischere" Variante entscheiden :)

unsigned char (*p_data)[20]; /* <- note: declared differently */
...
p_data = &p_struct->DATA; /* <- note: your original version */
...
theCount = 0;
while ((*p_data)[theCount] != 0) {
  (*p_data)[theCount++] = 0;

Allerdings zur Rückkehr zu a unsigned char *p_data Durch die Version kann es sinnvoller sind, da Sie diesen Zeiger erstellen, möglicherweise sinnvoll ist, eine "Sliding Zeiger" -Technik zu verwenden, anstatt den Indexzugriff zu verwenden

unsigned char *p_data;
...
p_data = p_struct->DATA; /* or &p_struct->DATA[0] */
...
while (*p_data != 0) {
  *p_data++ = 0;

Wie immer ist alles eine Frage der persönlichen Präferenz. Natürlich wird nichts davon funktionieren, bis Sie diese Einmischung vom Makro loswerden.

Andere Tipps

Den & in verlieren p_data = &p_struct->DATA;

P_Struct ist bereits Zeiger. Verwenden Sie anschließend p_data [], um auf Ihr Array zuzugreifen.

Was Sie schreiben sollten, ist eines von zwei Dingen:

p_data = p_struct->DATA; // DATA is the address of the first element.

ODER

p_data = &p_struct->DATA[0]; // taking the address of the first element.

Entfernen Sie einfach das & am Anfang wie folgt:

p_data = p_struct->DATA;

Das ist eine spezielle Sintax für Arrays (denken Sie daran, dass sie immer als Referenz übergeben werden) und es entspricht:

p_data = &p_struct->DATA[0];

Und ja, jetzt können Sie *(pdata+3) verwenden

Ich hoffe es hilft.

Hoppla! Danke Andreyt

struct dev_status *p_struct; nicht signiertes Zeichen *p_data; p_struct = & g_cmdqueue [queidx]; p_data = & p_struct-> Daten;

p_struct ist ein Zeiger auf struct DEV_STATUS.
&p_struct ist die Adresse eines Zeigers auf struct DEV_STATUS (oder ein Zeiger auf einen Zeiger auf a struct DEV_STATUS).

Sie möchten wahrscheinlich diese Linie ändern

    p_data = p_struct->DATA;

Oh ... dein clean_buffers() Funktion "reinigt" das Element nicht g_cmdQueue[59].

Und weil es ein globales Objekt ist, das Array g_cmdQueue wird schon vor der ersten Aussage von allen Nullen initialisiert main() überzeugt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top