PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wo ist der Fehler??



damaltor
01.02.2007, 17:06
Hallo,

Ich möchte folgendes machen:
Einen String definieren

unsigned char text[10];
diesen initialisieren

text[0]="1234567890";
(wenn ich die null in den klammern weglasse, dann kommt ein fehler beim kompilieren.)

dann eines der zeichen in eine neue variable speichern

value=text[0];
und diese dann per serwrite ausgeben.

SerWrite(value,1);

das oben genannte beispiel funktioniert auch ganz gut. es wird über minicom (ist wie hyperterminal für linux) korrekt eine 1 ausgegeben.

Folgendes problem: sowie ich die Zeile

value=text[0];
ändere und z.B. text[1] oder text[2] ausprobiere, kommen bei minicom nur komische zeichen an.
und zwar immer die gleichen! bei test[1] sind es punkte (.), bei test[2] sind es akzente(´) usw.

Wie kann das sein? beim ersten zeichen gehts, beim nächsten nicht mehr...
die variable value ist übrigens ebenfalls ein unsigned char.

vielen dank leute...

coCo
01.02.2007, 18:00
Naja du weist die Zahlen von 1-9 eben nur dem ersten Element des Arrays (text[0]) zu. Damit die Zahlen jeweils nem anderen Element zugewiesen werden musst du es entweder so:


char text[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

oder mit einer Schleife initialisieren.
Die komischen Werte hast du übrigens erhalten, weil du dem jeweiligen Element keinen Wert zugewiesen hast.

MfG

damaltor
01.02.2007, 18:29
aber ich habe nicht 1234567890 sondern "1234567890" zugewiesen, also einzelne zeichen als string.
im ersten zeichen ist auch keine (zahl) 1, sondern das ASCII-zeichen "1", bzw der zahlenwert 49.

wenn ich das array so initialisieren würde, wie du es beschrieben hast, dann würde im ersten feld der zahlenwert 1 stehen, was dem ascii-zeichen SOH entsprechen würde, einem steuerzeichen welches nicht ausgegeben werden kann.

coCo
01.02.2007, 18:34
Achja stimmt, übersehn dass es ein Char array is. Versuch mal anstatt mit text[] = "12345" mit text = "12345", also ohne die KLammern. So müsste es gehn glaub.

MfG

damaltor
01.02.2007, 19:06
wird probiert...
geht leider nicht, ausgabe:

test.c: In function ‘main’:
test.c:51: error: incompatible types in assignment
test.c:54: warning: passing argument 1 of ‘SerWrite’ makes pointer from integer without a cast

damaltor
01.02.2007, 19:21
hab grad probiert, wenn ich jedes element einzeln initialisiere

text[0]=1;
text[1]=2;
...
und so weiter, dann gehts.

also: wie initialisiert man einen string???

izaseba
01.02.2007, 19:38
Vielleicht so :



char string[] = "Ich bin ein String";


Zugriff:



printf("%s,%c",string,string[0]);
char *pointer = string;

while (*pointer) {
printf("%c",*pointer++);
}


Gruß Sebastian

damaltor
01.02.2007, 19:56
geht leider nicht, der compiler meldet dass er einen ausdruck zwischen den klammern erwartet... egal, ich habe mich jetzt damit abgefunden dass ich die werte nur einzeln aufrufe. eigenartig, das ist das erste was ich sehe was unter windoof einwandfrei geht und unter linux nicht... sieht so aus als ob die kompiler zu unterschiedlich sind...

noch was neues:

wenn ich eine variable mit char definiere

unsigned char value=0;
und dieser dann einen Wert zuweise

value="A";
dann kommt eine WARNING im compiler:

test.c:9: warning: assignment makes integer from pointer without a cast
wenn ich die anführungszeichen " durch einzelne ' ersetze, wie es bei MSVC normal ist, dann geht es gar nicht. das programm wird kompiliert, allerdings kann der wert zB mit SerWrite nicht ausgegeben werden.also habe ich die " gelassen.
wenn ich jetzt versuche, das zeichen auszugeben, und zwar mit

SerWrite(value,1);
dann wird das zeichen korrekt ausgegeben, aber es kommt eine weitere warning:

test.c:12: warning: passing argument 1 of ‘SerWrite’ makes pointer from integer without a cast

Warum? Also das Programm funktioniert einwandfrei...

Ich vermute dass es an den Anführungszeichen liegt, die ja einen string definieren, welcher in C ja als pointer gehandhabt wird. wenn ich die anführungszeichen durch ' ersetze, dann verschwindet die erste warning. allerdings wird dann nichts mehr ausgegeben in minicom.

vielleicht poste ich das programm mal nachher, wäre gut wenn das mal jemand testen könnte.

izaseba
01.02.2007, 20:06
geht leider nicht, der compiler meldet dass er einen ausdruck zwischen den klammern erwartet

Was erwartet der ?
Quatsch, wie will ich sonst ein char Array initialisieren, als so wie vom mir genannt.



wenn ich eine variable mit char definiere
Code: [View More of this Code] [View Even More of this Code] [View Less of this Code] [Select All of this Code]
unsigned char value=0;

und dieser dann einen Wert zuweise
Code: [View More of this Code] [View Even More of this Code] [View Less of this Code] [Select All of this Code]
value="A";

dann kommt eine WARNING im compiler:


Mach dir den Unterschied zwischen "A" und 'A' klar...


Gruß Sebastian

EDIT:


wenn ich die anführungszeichen " durch einzelne ' ersetze, wie es bei MSVC normal ist, dann geht es gar nicht. das programm wird kompiliert, allerdings kann der wert zB mit SerWrite nicht ausgegeben werden.also habe ich die " gelassen.

Du weißt aber was SerWrite als Parameter erwartet ?

damaltor
01.02.2007, 20:21
SerWrite erwartet einen string, is klar. wenn ich hier die 0 in den klammern weglasse, und also test[] hinschreibe was ja ein string bzw ein pointer ist, dann meldet der compiler, genau wie oben bei der initialisierung, dass er einen ausdruck zwischen den klammern erwartet. so wie du es geschrieben hast, geht es NICHT.

hier siehst du code und compiler-ausgabe.
http://www.bildrian.de/n/b/d1620e5062db1eeb.png

izaseba
01.02.2007, 20:31
war soll ich dazu sagen ?
Das geht nicht so wie Du das machst.
Du mußt es so hinschreiben:


unsigned char[]="1234567890";


Gruß Sebastian

damaltor
01.02.2007, 20:33
naja das geht natürlcih. aber was ist, wenn ich im lauf eines programms einen neuen wert zuweisen will? muss ich das dann zeichenweise machen? oder gibt es da ne andere möglichkeit?

izaseba
01.02.2007, 20:36
muss ich das dann zeichenweise machen? oder gibt es da ne andere möglichkeit?

Klar es gibt da die string.h Bibliothek schau Dir z.B. strcpy an, das ist das was Du dann brauchst...

Gruß Sebastian

damaltor
01.02.2007, 20:39
hmmm... klingt gut, bin ich noch nich drauf gekommen... =)

aber one die lib gehts nur zeichenweise, oder?

izaseba
01.02.2007, 20:43
aber one die lib gehts nur zeichenweise, oder?


Würd ich mal sagen, oder Du bastelst Dir Deine eigene strcpy Funktion zusammen, wenn Du die lib nicht willst...

Gruß Sebastian

damaltor
01.02.2007, 20:44
na gut... danke dir erstmal.

izaseba
01.02.2007, 20:58
z.B. so


#include<stdio.h>

void mystrcpy(char *string,char *ziel) {
while (*string) {
*ziel++ = *string;
string++;
}
*ziel = '\0';
}

int main(void) {

char string[] = "Ich bin ein String";
printf("%s\n",string);
mystrcpy("Test",string);
printf("%s\n",string);
return 0;
}


Gruß Sebastian

EDIT:
Zu Deinem "Beweisfoto" , seit wann werden *.c included ?

damaltor
01.02.2007, 21:38
seit ich die eeprom.c kurz schnell geschreiben habe und zwischendurch brauchte... geht schnell und funktioniert, auch wenns nicht der feine stil ist =)