Hallo Xin.
Vielen dank für deine Anwort.
Ich bin ein Anfänger deswegen hacke ich nach (ich programmiere übrigens auf dem uController)
Ich habe folgedes for:
Ein große Struktur die viele Variablen speicher wird definiert
Mit Hilfe von diversen Funktionen wird die Struktur manipuliert.
Eine Funktion speicher einen Wert in der Struktur, die andere liest diesen Wert aus und eine anderer Funktion speichert einen neuen Wert usw.
Ist meine Lösung ok?
Wie mache ich das am besten?
Hier habe ich noch einige Fragen zum Verständnis:
1. Es wird ein Pointer auf die Struktur definiert.
struct mstp_port_struct *mstp_port;
Das heißt doch es gibt einen Zeiger von Typ (Datentyp) der Struktur, aber dieser weiß nicht wohin er zeigen soll, weil er nicht deklariert wurde?
2. Es wird eine Variablen definiert:
struct mstp_port_struct test;
Die Variable test ist von dem Typ der Struktur und enthält alle Variablen die in der Struktur stehen.
Ich könnte auch diese Variable an die Funktion übergeben, weil aber die Funktion groß ist, wird ein Zeiger übergeben, welche die Adresse von Strukturvariablen hat
3.Die beiden Variablen:
struct mstp_port_struct *mstp_port;
struct mstp_port_struct test;
wurden vor main definiert und sind damit global in main reserviere ich Speicher und
weiße die Adresse von Test dem Pointer zu.
Ist es ok wenn ich die Variablen global definiere?
Denn durch diese Zuweisung: mstp_port_struct wird Speicher in der Größe von strukt reserviert und diese ist ziemlich groß?
4. in main() rufe ich Funktionen aus und übergeben mstp_port (die Adresse des Pointers)
5. Diesen Aufruf habe ich abgequckt auf einem Beispiel, welches genau meine Aufgabe realisiert:
void mstp_create_frame ( volatile struct mstp_port_struct *mstp_port )
Was hat dieser volatile für ein Zweck hier?
6. Da aber der Pointer global ist, kann ich auch die Funktionen ohne Parameter aufrufen:
mstp_create_frame ( void );
MSTP_Receive_Frame_State_Machhine( void
und die Stuktur auf folgende weise manipulieren:
void MSTP_Receive_Frame_State_Machhine( void )
{
if (mstp_port->receive_frame_state == MSTP_RECEIVE_STATE_FRAME_HEADER )
{
printf("\n%d", mstp_port->destination);
printf("\n%d", mstp_port->receive_frame_state);
}
also mit Parametern und Argumenten oder mit void?
7. struct mstp_port_struct * mstp_port mstp_create_frame( void )
Das habe ich nicht ganz verstanden. Kann mir das jemand an einem einfachen Beispiel erklären?
VIELEN DANK IM VORAUS.
Code: Alles auswählen
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
typedef enum
{
MSTP_RECEIVE_FRAME_STATE_IDLE = 0,
MSTP_RECEIVE_STATE_FRAME_PREAMBLE = 1,
MSTP_RECEIVE_STATE_FRAME_HEADER = 2,
MSTP_RECEIVE_STATE_FRAME_HEADER_CRC = 3,
MSTP_RECEIVE_STATE_FRAME_DATA = 4,
MSTP_RECEIVE_STATE_FRAME_DATA_CRC = 5
} MSTP_RECEIVE_FRAME_STATE;
struct mstp_port_struct
{
MSTP_RECEIVE_FRAME_STATE receive_frame_state;
unsigned char preamble1;
unsigned char preamble2;
unsigned char frame_type1;
unsigned char destination;
unsigned char source;
};
struct mstp_port_struct *mstp_port;
struct mstp_port_struct test;
void MSTP_Receive_Frame_State_Machhine( volatile struct mstp_port_struct *mstp_port );
void mstp_create_frame ( volatile struct mstp_port_struct *mstp_port );
int main (void)
{
memset(mstp_port, 0, sizeof(struct mstp_port_struct));
mstp_port = &test;
mstp_create_frame ( mstp_port );
MSTP_Receive_Frame_State_Machhine( mstp_port );
return 0;
free(mstp_port);
}
void mstp_create_frame ( volatile struct mstp_port_struct *mstp_port )
{
mstp_port->receive_frame_state = MSTP_RECEIVE_STATE_FRAME_HEADER;
mstp_port->preamble1 = 55;
mstp_port->preamble2 = 255;
mstp_port->frame_type1 = 0;
mstp_port->destination = 80;
mstp_port->source = 81;
printf("\n%d", mstp_port->destination);
}
void MSTP_Receive_Frame_State_Machhine( volatile struct mstp_port_struct *mstp_port )
{
if (mstp_port->receive_frame_state == MSTP_RECEIVE_STATE_FRAME_HEADER ) //mstp->receive_frame_state steht was falsches. Da sollte eigentlich 2 stehen (MSTP_RECEIVE_STATE_FRAME_HEADER = 2)
{
printf("\n%d", mstp_port->destination);
printf("\n%d", mstp_port->receive_frame_state);
}
}