Forum: Mikrocontroller und Digitale Elektronik Pointerabfrage lässt mich verzweifeln


von Joey T. (j0sef)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe da mal eine Frage zu meiner Funktion im Anhang. Wenn ich jetzt 
wie folgt weiter führe:
1
void main (void)
2
{
3
char *Text;
4
Text = Write_All(0x10,0x20,0x30);
5
6
if(Text == "Adressierung fehlgeschlagen")
7
{
8
    //... hier der Code,damit LED anfängt zu leuchten
9
}
10
}// main Ende

Alles unter der Annahme, dass mir in dem internen Funktionsaufruf von 
i2cWrite(Byte1) eine 0 herauskommt. Natürlich habe ich keine 
Errormeldungen und Head-Dateien sind auch alle richtig definiert.

Nach meinem Verständnis müsste mir die Write_All als Rückgabewert den 
Pointer auf die Feldposition 1, sprich "Adressierung fehlgeschlagen" 
geben, da ja auch die If-Bedingung in Write_All nicht erfüllt wird und 
somit Fehlerstelle auf seinem Initialisierungswert 1 bleibt.
Das ganze müsste dann dem Pointer Text übergeben werden und dann in der 
If-Bedingung dazu führen, dass die LED aktiviert wird.

Leider tut sie das nicht. Ihr könnt auch davon ausgehen, dass die 
Deklaration und Aufruf für die Aktivierung der LED richtig ist.

Noch zur Info, ich arbeite mit einem TriCore 1797, Tasking VX-toolset 
for TriCore Version 3.1, DAvE und als Debugger einen Lauterbach mit 
TRACE32.

Danke für Eure Bemühungen im Voraus.

Gruß,

Josef

von Mark B. (markbrandis)


Lesenswert?

Für den Vergleich von Zeichenketten gibt es die Funktion strcmp().

http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

von Peter (Gast)


Lesenswert?

Die Zeiger müssen bei gleichem Inhalt nicht gleich sein. Zum Vergleichen 
des Textes gibt es in C die Bibliotheksfunktion strcmp().

von Joey T. (j0sef)


Lesenswert?

Peter schrieb:
> Die Zeiger müssen bei gleichem Inhalt nicht gleich sein

Wie darf ich das verstehen? Die beiden Zeiger müssten aber doch 
eigentlich auf das gleiche Zeigen und wenn ich diese Abfrage, auch 
eigentlich das Anzeigen?

Trotz alle dem, werde ich morgen früh das mal ausprobieren. Was mich 
dabei aber nur ein bisschen stutzig macht ist, dass ich mir so ein 
ähnliches Programm schon mal geschrieben haben in MS Visual Studio 2010, 
wo dies jedoch geklappt hat egal wie oft ich es ausgeführt habe. Hatte 
das in MS geschrieben, um die Funktion mal einfach zu simulieren, ob 
dieses Prinzip der Übergabe und Weiterverarbeitung auch überhaupt 
funktioniert.

Ich werde dann mal morgen berichten.

Danke und Gruß,

Josef

von Stephu (Gast)


Lesenswert?

Pointer Zeigt nur auf eine Adresse.... Also auf den Start deines 
Strings. Wie soll bei dein Vergleich wissen wie lang der String dann 
wirklich ist.
--> strcmp verwenden

von Karl H. (kbuchegg)


Lesenswert?

Joey T. schrieb:
> Peter schrieb:
>> Die Zeiger müssen bei gleichem Inhalt nicht gleich sein
>
> Wie darf ich das verstehen? Die beiden Zeiger müssten aber doch
> eigentlich auf das gleiche Zeigen

Warum müssen sie?

Sie müssen nicht. Wenn der String im Speicher 2 mal existiert, dann hat 
er auch jedesmal eine andere Startadresse und damit haben dann auch die 
Pointer unterschiedliche Werte.

> dabei aber nur ein bisschen stutzig macht ist, dass ich mir so ein
> ähnliches Programm schon mal geschrieben haben in MS Visual Studio 2010,
> wo dies jedoch geklappt hat egal wie oft ich es ausgeführt habe.

IN dem Fall hat der Compiler dann erkannt, dass du in deinem 
Programmtext 2-mal denselben String benutzt hast und hat beide an 
dieselbe Stelle im Speicher gelegt. Das darf er. Aber er muss es nicht. 
Und vor allen Dingen kann er es nicht in allen Fällen.

von DirkB (Gast)


Lesenswert?

Der Compiler bzw. der Linker kann gleiche Stings zusammenfassen, er muss 
es aber nicht. Meist gibt es dafür Optionen um das zu steuern.

Das man aber ein Array (und dazu gehören Strings in C) nicht mit == 
vergleicht, sind absolute C Grundlagen.

von Karl H. (kbuchegg)


Lesenswert?

Aber jetzt mal ernsthaft:
Kein Mensch macht sowas. Eine Funktion meldet einen Fehler, in dem sie 
einen entsprechenden Code zurückgibt und nicht einen Fehlertext.
An dieser Stelle ist ein Fehlertext viel zu umständlich. Er bringt dir 
auch nichts, weil die Funktion ja gar nicht wissen kann, was du mit 
diesem Text machen willst. Wenn der Aufrufer den Fehlertext auf ein LCD 
ausgibt, dass nur 8 Spalten breit ist, dann hat der Aufrufer bei einem 
längeren Fehlertext ein Problem. Genauso, wenn das Programm plötzlich 
nicht mehr im Deutschen Sprachraum, sondern sagen wir mal in Italien zum 
Einsatz kommt.

Texte kommen immer in einer GUI nahe Schicht. Arbeitsfunktionen benutzen 
Codes um eine Fehlersituation zu vermelden und es liegt dann an der GUI 
Schicht aus diesem Code einen Text zu machen.

von ET-Tutorials (Gast)


Lesenswert?

Joey,
Text ist ein Pointer.
In der Variable Text steht also eine Speicheradresse und kein Text.

Wenn alles gut läuft und Du nachguckst, was in an Adresse, die Du in der 
Variablen Text findest, steht, dann ist das ein A (bzw. der ASCII-Code 
dafür.

Über Pointer habe ich einmal ein Video gedreht:
http://et-tutorials.de/3368/pointer-in-c/

von Joey T. (j0sef)


Lesenswert?

Danke noch mal für Eure konstruktiven Kritiken. Habe das mit dem strcmp 
ausprobiert und ich habe auch dass mit der Fehlerausgabe geändert. Ich 
stimme da Karl Heinz zu. Nun gibt es nur noch Fehlercodes und in einer 
entsprechenden Fehlerdokumentation habe ich den Fehlercodes jeweils eine 
passende Fehlermeldung beigeschrieben.

Gruß,

Joey

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.