2017-06-09 1 views
0

Ich habe einen Speicherchip, der Daten von einem eingebetteten System seriell gelesen hat. Das Speichergerät verfügt über 10 Speicherorte, wobei jeder Speicherort die folgenden Informationen aufweist: customerID, NumOfParts, MFGName. Hier ist meine Version von C-Code, den ich dafür geschrieben habe.In c-Sprache, Embedded Application, wie man Mitglieder aus einem Array der Struktur

IN C FILE "PartName.h"

//"PartName.h" 
    #ifndef PartName_H 
    #define PartName_H 

    typedef UINT8 MFGName_Struct_t [10]; 

    typedef struct 
    { 
     UINT8 customerID; 
     UINT8 NumOfParts; 
     MFGName_Struct_t MFGName; 
    }IDENT_Struct_t; 

    typedef struct MFG_Struct_t 
    { 
     UINT8 <some other variable>;   
     UINT8 <some other variable>; 
     IDENT_Struct_t Ident1; 
     IDENT_Struct_t Ident2; 
     IDENT_Struct_t Ident3; 
     IDENT_Struct_t Ident4; 
     IDENT_Struct_t Ident5; 
     IDENT_Struct_t Ident6; 
     IDENT_Struct_t Ident7; 
     IDENT_Struct_t Ident8; 
     IDENT_Struct_t Ident9; 
     IDENT_Struct_t Ident10; 
    } MFG_Struct_t; 

    #endif 

IN C FILE "HighNum.c"

//"HighNum.c" 
    #include "PartName.h" 
    static MFG_Struct_t MFG; 
    UINT8 HighNum(void) 
    { 
    //UINT8 i; 
     UINT8 highestNum = 0; 
    //for (i = 0;(i < 10);i++) 

     if (MFG.Ident1.NumOfParts > MFG.Ident2.NumOfParts) 
     { 
      highestNum = MFG.Ident1.NumOfParts; 
     } 
     if (MFG.Ident2.NumOfParts > MFG.Ident3.NumOfParts) 
     { 
      highestNum = MFG.Ident2.NumOfParts; 
     } 
     if (MFG.Ident3.NumOfParts > MFG.Ident4.NumOfParts) 
     { 
      highestNum = MFG.Ident3.NumOfParts; 
     } 
     if (MFG.Ident4.NumOfParts > MFG.Ident5.NumOfParts) 
     { 
      highestNum = MFG.Ident4.NumOfParts; 
     } 
     <and so on>  
    return highestNum; 
    } 

Wie kann dies in C effizienter gemacht werden? Verwenden für Anweisungen oder While-Anweisungen? Ich dachte über die Anzahl Teil verketten und Radtouren durch die Variablen ...

Antwort

1

Wenn Sie Ihre Struktur dieses ändern:

#define IDENT_SIZE   10 
typedef struct MFG_Struct_t 
{ 
    UINT8 <some other variable>;   
    UINT8 <some other variable>; 
    IDENT_Struct_t Ident[IDENT_SIZE]; 
} MFG_Struct_t; 

Dann können Sie dies tun:

size_t i = 0; 
for (i = 0; i < IDENT_SIZE; i++) { 
    if (MFG.Ident[i].NumOfParts > highestNum) { 
      highestNum = MFG.Ident[i].NumOfParts; 
    } 
} 
+0

size_t ist ein Typ? Ich fange die Drift ... die Idee ist, ein Array zu der Variablen zu machen, die du vergleichen willst. Aus irgendeinem Grund fühlt sich die Idee der Verkettung irgendwie nicht richtig für die Art des Problems an. – newb7777

+0

size_t ist C-Standardtyp. Wie von meinem Verständnis, wollen Sie variable Länge der Array? Wenn ja, verwenden Sie stattdessen 'dynamic memory allocation'. Ich kann die Antwort aktualisieren, wenn Sie eine dynamische Länge von 'Ident'-Feldern in der 'MFG'-Struktur wünschen. – tilz0R

+0

Es wäre gut, wenn Sie zusätzlich zu dieser Antwort die dynamische Speicherzuweisungslösung auch zur Vollständigkeit dieses Threads zeigen könnten. – newb7777

1

Ich hoffe, die folgender Code kann Ihnen helfen:

typedef struct MFG_Struct_t 
{ 
    UINT8 <some other variable>;   
    UINT8 <some other variable>; 
    IDENT_Struct_t Idents[10]; 
} MFG_Struct_t; 

typedef enum _Idents 
{ 
    Ident1 = 0, 
    Ident2, 
    Ident3, 
    Ident4, 
    Ident5, 
    Ident6, 
    Ident7, 
    Ident8, 
    Ident9, 
    Ident10, 
} IdentType; 


    if (MFG.Idents[Ident1].NumOfParts > MFG.Idents[Ident2].NumOfParts) 
    { 
     highestNum = MFG.Idents[Ident1].NumOfParts; 
    } 


// or 
for (index = Ident1; index < Ident10; index ++) 
{ 
    if (MFG.Idents[index].NumOfParts > MFG.Idents[index +1].NumOfParts) 
    { 
     //...... 
    } 
} 
1

Sie könnten die Struktur neu definieren, um die 10 zu setzen "Ident" Werte in einem Array, verwenden Sie dann eine for-Schleife Ihre Werte zu testen:

typedef struct MFG_Struct_t 
{ 
    UINT8 <some other variable>;   
    UINT8 <some other variable>; 
    IDENT_Struct_t Ident[10]; 
} MFG_Struct_t; 
    : 
    : 
UINT8 HighNum(void) { 
    UINT8 i, highestNum = 0; 

    for (i = 0; i < 9; i++) { 
     if (MFG.Ident[i].NumOfParts > MFG.Ident[i+1].NumOfParts) { 
      highestNum = MFG.Ident[i].NumOfParts; 
     } 
    } 
    return highestNum; 
} 

oder noch besser ... die HighNum Funktion ändern, effizienter zu sein, wie folgt:

UINT8 HighNum(void) { 
    UINT8 i, highestNum = MFG.Ident[0].NumOfParts; 

    for (i = 1; i < 10; i++) { 
     if (MFG.Ident[i].NumOfParts > highestNum) { 
      highestNum = MFG.Ident[i].NumOfParts; 
     } 
    } 
    return highestNum; 
} 
+0

Ich mag den effizienten Teil, und das ist die Absicht hier. – newb7777

Verwandte Themen