Hi Leutz,
zur Zeit bin ich total in einem Projekt für ein Touch Panel gefangen. Für dieses Projekt erstelle ich die Software fürs Touch Panel.
Im Moment hab ich ein Problem mit meinem Modulaufbau und zwars möchte ich ein Struktur in 2 Dateien verwenden (verschiedene Module). Ich schaffe es einfach nicht in ein und demselben Adressbereich zu arbeiten. Ich wollte mal Fragen ob ihr Lust hättet mir da unter die Arme zu greifen. Wenn nicht ist es auch kein Problem, is ja schliesslich nen C# Forum hier. Wenns gegen die Boardregeln verstösst closed bitte den Thread.
Danke
dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Keine Angst, so verklemmt ist das Forum net 😉
Wo ist denn jetzt das Problem? Die Struktur in beiden Modulen bekannt zu machen? Oder allgemein die Struktur auf die Adresse mappen, oder wie?
Baka wa shinanakya naoranai.
Mein XING Profil.
*puh*
Danke sehr. Also die Struktur ist in der Headerdatei Variables.h folgendermassen definiert:
struct TImportStructData
{
float m_zeitfeld[4];
float m_zeitfeldtest[4];
float m_zeitfeldtest1[4];
float m_zeitfeldtest2[4];
float m_zeitfeldTemp;
float m_zeitfeldGas;
float m_zeitfeldHumidity;
float m_zeitfeldOxygen;
};
struct TImportStruct
{
BYTE m_TypeOfStructure;
union
{
struct TImportStructData _2;
} m_Type;
};
typedef struct TImportStruct TImportStruct;
TImportStruct ImportDaten;
Verwendet wird sie in der Treiberdatei für das Touch Panel und in dem Modul was die Daten der Schnittstelle verarbeitet. Diese Funktion ist in der Headerdatei PrepareProcessData.h folgendermassen deklariert:
extern void UseReceivedValues(char *PtrDaten, TImportStruct ImportDaten);
Die Headerdatei Variables.h wird in beiden .c eingebunden, dennoch sind zwei verschiedene Adressbereiche vorhanden. Debuggen is leider auch net möglich, ausser Terminal (printf) Debugging, da die Entwicklungsumgebung des Herstellers net mehr hergibt.
edit
die Funktion wird in der Treiberdatei aufgerufen um die Werte in die Struktur zu laden.
Danke
dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Ah, weiß immer noch nicht so ganz was ihr da versucht 😠
In deiner extern deklarierten Funktion übergibst du die mit den Daten gefüllte Struktur und die Daten werden dann an die Adresse die du übergibst geschrieben. Richtig verstanden? Und wenn du jetzt dein Strukt auf diese Adresse legst, hast du doch wieder deine Daten, oder sehe ich das Problem noch nicht richtig? Weiß grad auch noch net wo du auf zwei verschiedene Adressen kommst?! Du arbeitest doch nirgends direkt damit oder?
Baka wa shinanakya naoranai.
Mein XING Profil.
bau dir doch ne funktion die die nen Zeiger auf die Struktur zurückgibt.
die rufst du dann immer auf wenn du die struktur verwenden willst.
TImportStructData* getzeiger(void)
{
static init = FALSE;
static TImportStructData data;
if(!init)
{
/*strukutr initalisieren*/
}
return &data;
}
sowas in der art halt.
vielleicht hilfts dir ja weiter.
wichtig: das static nicht vergessen 🙂
Original von talla
Ah, weiß immer noch nicht so ganz was ihr da versucht 😠In deiner extern deklarierten Funktion übergibst du die mit den Daten gefüllte Struktur und die Daten werden dann an die Adresse die du übergibst geschrieben. Richtig verstanden? Und wenn du jetzt dein Strukt auf diese Adresse legst, hast du doch wieder deine Daten, oder sehe ich das Problem noch nicht richtig? Weiß grad auch noch net wo du auf zwei verschiedene Adressen kommst?! Du arbeitest doch nirgends direkt damit oder?
Ich hätte von Anfang an weiter ausholen sollen. Also die Treiberdatei, bekommt über RS232 Messdaten auf Anfrage. Die Funktion UsedReicevedValues soll diese Daten validieren und dann in die Struktur schreiben. Mit Hilfe dieser Struktur wird dann über eie dem Touchpanel eigene Funktion das Display gefüllt (genauer gesagt ein Diagramm mit Zeit logging). Die Funktion welche die Daten aus der Struktur aufs Display bringt muss in der Treiberdatei stehen.
Hoffe ein wenig Licht ins Dunkle gebracht zu haben.
Danke
dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
@Nils
Danke, so etwas in der Art hatte ich auch schon versucht und zwars nach C von A bis Z.
Allerdings meckert der Compiler bei der Zuweisung dann, dass dieses nicht erlaubt sei.
Eigentlich wollte ich das eher nach dem Prinzip der Call by Reference machen um eben im Speicherbereich der Struktur zu bleiben.
gruss
dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Dann übergib doch einfach immer die Adresse der Struktur!?!
Mit Hilfe dieser Struktur wird dann über eie dem Touchpanel eigene Funktion das Display gefüllt (genauer gesagt ein Diagramm mit Zeit logging). Die Funktion welche die Daten aus der Struktur aufs Display bringt muss in der Treiberdatei stehen.
Was denn nun? Ist es nun eine Funktion vom Panel das die Daten aus der Struktur liest, oder eine Funktion aus dem Treiber der die Daten auf des Panel schiebt?
Baka wa shinanakya naoranai.
Mein XING Profil.
Ein struct ist ja ein Value-Type...daher wird die struct kopiert
extern void UseReceivedValues(char *PtrDaten, TImportStruct ImportDaten);
müsste es nicht so gehen ?
extern void UseReceivedValues(char *PtrDaten, ref TImportStruct ImportDaten);
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Ähh, denke mal ref gibts in C net gg Da ist auch nichts mit Value und Reference Types 😉 Da wird noch mit oldschool Pointern rumhantiert 😉
Baka wa shinanakya naoranai.
Mein XING Profil.
Hier mal wat schnell gemaltes, vielleicht hilft das ein wenig.
Dachte wenn ich nen Pointer übergebe, dann übergebe ich die Adresse??????
edit
also ganz am anfang hatte ich per adressoperator versucht beim Aufruf von UsedReicevedValues die Adresse von ImportDaten zu übergen, diese waren dann auch im Header als Pointer deklariert. Hatte leider keinen Erfolg. Die Struktur wird weiterhin nur in der PrepareProcessData.c befüllt und bleibt in der Treiberdatei leer.
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Des Rätsels Lösung:
Also bei der Begründung muss ich ehrlich zugeben buin ich mir nicht ganz sicher, aber ich weiß wie es funktionieren sollte:
begründung: Bei deinem Aufruf der Funktion die was in deine Struktur schreiben soll wird eine Kopie erzeugt. Mit dem Aufruf:
extern void UseReceivedValues(char *PtrDaten, TImportStruct ImportDaten);
erstellst du eine Kopie von Importdaten die zufällig den gleichen Namen hat wie dein globale Variable Importdaten. Der Compiler nutzt aber immer die lokale Variable vorzugsweise.
Die Lösung: ich habe mal ein kleines Beispiel
Datei test.h:
#include <stdio.h>
typedef struct
{
int x;
int y;
} str, *pstr;
void tue_was();
Datei main.c:
#include <stdio.h>
#include "test.h"
str neu;
int main()
{
neu.x = 5;
neu.y = 3;
printf("x: %d\ny: %d",neu.x,neu.y);
tue_was(neu); printf("\nx: %d\ny: %d",neu.x,neu.y);
return 0;
}
Die datei tue_was.c
#include "test.h"
#include <stdio.h>
extern str neu;
void tue_was(str p)
{
neu.x=8;
neu.y=1;
}
Ich hoffe ich habe keinen Mist geschrieben und du kannst das Beispiel auf dein Problem übertragen
mfg fabian
Edit die globale Variable stört mich: 😁
also folgende Änderung: der Prototyp der tue_was Funktion lautet jetzt wie folgt:
void tue_was(pstr p);
Die Funktion selbst:
p->x=8;
p->y=1;
Der Aufruf der Funktion:
tue_was(&neu);
Und natürlich wird neu jetzt innerhalb der main deklariert.
Hi MasterOfDesaster,
danke für die Lösung, nun wird die Struct richtig gefüllt. Leider werden die Daten immernoch nicht ins System übertragen, aber das ist ne andere Baustelle. Ich danke euch allen vielmals für die Mühen die ihr euch gemacht habt und hoffe euch net mehr mit diesem Thema belästigen zu müssen sondern mich bald wieder in der schönen C# Welt tummeln zu können.
Gruss
dschmoegner
EDIT
Problem is nu endgültig gelöst. Danke, Danke, Danke, ihr habt mich gerettet.
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007