Hallo,
für Anzeige eines Textes in einem Display (funktioniert mit Atmega32 mit
der Funktion lcd_string bereits)
möchte ich Texte in einer Tabelle (array) definieren und über einen
Index eine Zeile im Display anzeigen.
Ziele war die Anzeige mit
lcd_string (obj[i]);
Probiert habe ich:
Fehler:
initobj.c:12:10: Fehler: »pobj« als andere Symbolart redeklariert
initobj.c:5:20: Anmerkung: Vorherige Definition von »pobj« war hier
Habe es auf dem PC probiert und kriege es nicht hin.
Bitte um einen Tipp von den C-Profis wie man das richtig macht.
Danke, Gruß
Hallo,
muss doch nochmals um Hilfe bitten.
Habe die Tabelle im main definiert, ist ok.
Der Zugriff darauf soll allerdings in einem Unterprogramm erfolgen und
das gelingt mir nicht.
Meine bereitsbestehende Anwendung ist schon umfangreich und
strukturiert, sodass ich die Verarbeitung der Tabelle nicht im main
machen sollte.
Versuch:
1
main
2
.
3
charobj[3][10]={"Zeile 1","Zeile 2","Zeile 3"};
4
.
5
objekte(&obj)
6
.
7
// Ende main
8
9
01// Test Objekte
10
02voidobjekte(char*pobj)
11
03{
12
04printf("%s \n",*pobj[2]);// Test anzeigen Zeile 2
13
05}
14
06// Ende Test
Fehler:
objekte.c: In Funktion »objekte«:
objekte.c:4:5: Warnung: Unverträgliche implizite Deklaration der
eingebauten Funktion »printf« [standardmäßig aktiviert]
objekte.c:4:22: Fehler: ungültiger Argumenttyp in unärem »*« (haben
»int«)
Kann ich die Tabelle zur Verarbeitung nicht wie sonst eine Variable mit
dem Pointer übergeben?
Wo liegt mein Fehler?
Mit NULL kam ich nicht klar.
Danke für Eure Hilfe!
Gruß
Na jam nach Dir einfach mal klar was Du definiert hast:
obj besteht aus 3 Arrays (die Schreibweise ob[3][10] halte ich
für unglücklich gewählt, ich würde es wie in meinem Beispiel
definieren - dann ist es klarer) mit je 10 Byte.
obj[0] ist die Adresse des ersten Arrays, diese sollstest Du an
objekte übergeben und direkt ausgeben. Also
Dietmar P. schrieb:> Also kann ich nicht ein mehrdimensionales array übergeben und dann im> Unterprogramm darauf "zeilenweise" zugreifen?
Kann man schon, aber schau mal WAS GENAU du übergibst:
void objekte(char *pobj)
Ist "char *pobj" denn ein mehrdimensionales Array?
Du hast die Funktion objekte so definiert daß du ihr einen String
(character Array) übergibst, aber nicht so daß du ihr ein 2 dim. char
Array übergibst.
2. Fehler:
Du rufst die Funktion so auf:
objekte(&obj)
Jetzt ist aber der Name eines Arrays in C per se schon eine
Adressvariable. Wenn du die nochmal mit dem Adressoperator referenzierst
dann übergibst du der Funktion einen Zeiger auf die Adresse eines
2dimensionalen Arrays. Das ist aber nicht das was du willst.
Die in der Funktion übergebene Variable und die in der
Funktionsdefinition definierte Variable müssen vom gleichen Typ sein.
Ich würde vorschlagen daß du einen char * (Einen Zeiger auf den String)
statt ein Array von Strings) übergibst und dann entsprechend mit einem
Element deines Stringarrays aufrufst.
Bei mir gehts leider nicht.
Habe genau dieses Beispiel mal übernommen und bekomme folgenden Fehler:
objekte.c:4:5: Warnung: Unverträgliche implizite Deklaration der
eingebauten Funktion »printf« [standardmäßig aktiviert]
Dietmar P. schrieb:> Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »printf«
Schon mal den Fehler genau angeschaut?
Sieht aus als hättest du printf noch mal deklariert und zwar anders als
im header.
Zeig mal dein Code
printf habe ich nicht (re-)definiert, ich habe es verwendet wie es in
den Bibliotheken steht. Compiler ist gcc für den PC und Avr-gcc für den
Atmega32.
Code nur für Testzwecke des array:
1
// Main
2
3
#include<stdio.h>
4
#include"stdint.h"
5
#include<string.h>
6
7
8
voidmain(void)
9
{
10
11
char*obj[]={"Zeile 1","Zeile 2","Zeile 3"};
12
13
objekte(obj);
14
//return 0;
15
16
}// Ende main
17
18
19
// Test
20
voidobjekte(char*pobj[])
21
{
22
printf("%s \n",pobj[1]);// Test anzeigen Zeile 2
23
}
24
// ende
Der ganze Code ist recht komplex und beinhaltet eine komplette Steuerung
einer Leitungsauswertung und Anzeige per SPI.
Wenn man einen Zeiger auf ein mehrdimensionales Array übergeben will,
sollte die aufgerufene Funktion schon "wissen", wie groß die inneren
Dimensionen sind.
1
#include<stdio.h>
2
#include<string.h>
3
4
voidEineFunktion(charParameter[][10])
5
{
6
inti;
7
for(i=0;i<3;i++)
8
{
9
printf("%s \n",Parameter[i]);
10
}
11
}
12
13
intmain(intargc,char**argv)
14
{
15
charTextzeilen[3][10];
16
memset(Textzeilen,0,sizeof(char[3][10]));
17
strcpy(Textzeilen[0],"1te Zeile");
18
strcpy(Textzeilen[1],"2te Zeile");
19
EineFunktion(Textzeilen);
20
return0;
21
}
Wenn man das etwas lesbarer und weniger geschwätzig machen will, kann
man mit Typendefinitionen arbeiten: