Forum: Mikrocontroller und Digitale Elektronik Error C236 (Fehler beim Compilieren)


von Herrminator (Gast)


Lesenswert?

Hallo Leute,

habe beim schreiben mit Keil uvision 4 ein problem....

vvollte einen gespeicherten int vvert der in der Variable unsigned int 
sekunde gespeichert vvird an den PC senden..

dazu habe ich erstmal die Funktion geschrieben:

void send_z(unsigned int zahl)
{
SBUF = zahl;
while(TI == 0);
TI = 0;
}

und den Aufruf:

send_z(sekunde);


aber beim compilieren kommt folgender Fehler:

pro.c(57): error C236: 'send_z': different length of parameter lists


vvie behebe ich dieses Problem ? Oder vvas mache ich falsch??

danke..

von Easylife (Gast)


Lesenswert?

Ich weigere mich das zu kommentieren, bevor du deine "W"-Taste repariert 
hast.

von Error 237 (Gast)


Lesenswert?

Herrminator schrieb:
> vvie behebe ich dieses Problem ? Oder vvas mache ich falsch??

Ich würde statt 2x v einfach w drücken...

von H.Joachim S. (crazyhorse)


Lesenswert?

Kann SBUF einen int-Wert vertragen??

von Bastler (Gast)


Lesenswert?

Kennt die aufrufende Stelle die "Signatur" von send_z, z.B gleiche 
Source, vorher definiert, bzw. H-File inkludiert,
oder rätselt der Compiler mit "intsend_z()" herum, wie er es macht, wenn 
er eine Funktion bei Aufruf zum ersten mal sieht?

von Amateur (Gast)


Lesenswert?

Es interessiert natürlich keinem Menschen, was in Zeile 57 steht.
Gleiches gilt für die Definition (typ) von sekunde.

Also: Alle mit einer funktionierenden Glaskugel bitte vortreten!

von Peter (Gast)


Lesenswert?

Vielleicht steht der Aufruf send_z(sekunde) auch nicht in einer 
Funktion?

von Herrminator (Gast)


Lesenswert?

Ja in dieser Zeiler oder besser gesagt ab dieser Zeile steht das was ich 
vorher geschrieben hatte:

void send_z(unsigned int zahl)
{
SBUF = zahl;
while(TI == 0);
TI = 0;
}


aber bei mir geht es ja gerade um diesen Fehler "different length of 
parameter lists" ob ich da irgendwas vertauscht habe?

Also wenn ich ein char Zeichen sende mit folgender Funktion:

void send(unsigned char wert)
{
  SBUF = wert;
  while(TI == 0);
  TI = 0;
}

und dann als Aufruf

send('A');

dann wird dieses Zeichen auch gesendet..

nur muss ich in meinem Fall eine Variable, die als int definiert ist 
senden..

dabei dachte ich mir ich könnte das so ähnlich machen wie beim Char,

jedoch kam dann die folgende Fehlermeldung aus dem ersten Post.


Sorry wenn ich mich blöd ausdrücke und sorry an meinem Laptop fehlt die 
W taste...

von Easylife (Gast)


Lesenswert?

Du hast vermutlich noch irgendwo ein include file, in dem der Prototyp 
für

void send(unsigned char wert)

mit weiteren Parametern definiert wurde. Das passt dann nicht so gut 
zusammen...

von Easylife (Gast)


Lesenswert?

...muss auch nicht mal ein include von dir sein.
Evtl. gibt's halt die Funktion "send()" schon woanders.
Nenn deine Funktion doch einfach mal um.

von Easylife (Gast)


Lesenswert?

achso, in deinem letzten Post stand es ja auch.

"send_z()" gibt's wohl schon als Prototyp mit anderen Parametern.
Wenn du es in send() umbenennst gehts.

Dann wäre noch die Frage, ob man mit "SBUF = x" überhaupt mehr als 8-Bit 
senden kann...

Evtl. machst du es besser so:

int wert = 12345;
unsigned char c1 = (wert >> 8);
unsigned char c2 = (wert & 0xff);
send(c1);
send(c2);

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Herrminator schrieb:
> while(TI == 0);

Das muß bei deinem Compiler wohl "vvhile" heißen...

von Herrminator (Gast)


Lesenswert?

Easylife schrieb:
> int wert = 12345;
> unsigned char c1 = (wert >> 8);
> unsigned char c2 = (wert & 0xff);
> send(c1);
> send(c2);

habe es jetzt so gemacht:

unsigned int asdf;
unsigned char c1,c2;

asdf = sekunden;
c1= (asdf >> 8);
c2 = (asdf & 0xff);
send(c1);
send(c2);


nun sendet er mir aber folgendes

ఀ:ఀ

von Easylife (Gast)


Lesenswert?

???
welchen wert hast du denn in "sekunden".
ist der <= 32767 ?
was erwartest du als output, etwas lesbares?

von Herrminator (Gast)


Lesenswert?

in sekunden steht ein per lichtschranke ermittelter wert , der immer 
zwischen 1 und 10 liegt... auf dem display des microkontrollers zeigt es 
diesen auch korrekt an, aber im terminal programm nicht.

von Easylife (Gast)


Lesenswert?

weil es im terminal binär ankommt.

unsigned char c1, c2, c3;
c1 = '0' + (sekunden / 10);
c2 = '0' + (sekunden % 10);
c3 = 0x0a; // new line
send(c1);
send(c2);
send(c3);

von DirkB (Gast)


Lesenswert?

1 ist etwas anderes als '1' ist etwas anderes als "1"

von Herrminator (Gast)


Lesenswert?

Easylife schrieb:
> weil es im terminal binär ankommt.
>
> unsigned char c1, c2, c3;
> c1 = '0' + (sekunden / 10);
> c2 = '0' + (sekunden % 10);
> c3 = 0x0a; // new line
> send(c1);
> send(c2);
> send(c3);

danke easylife klappt so!!

nun klappt das aber nur bei sekunden oder wie?
Bei millisekunden gibt der dann aber z.B. j7 aus..

c1 = '0' + (msekunden / 10);
c2 = '0' + (msekunden % 10);
c3 = 0x0a; // new line
send(c1);
send(c2);
send(c3);

von Easylife (Gast)


Lesenswert?

Herrminator schrieb:
> Easylife schrieb:
>> weil es im terminal binär ankommt.
>>
>> unsigned char c1, c2, c3;
>> c1 = '0' + (sekunden / 10);
>> c2 = '0' + (sekunden % 10);
>> c3 = 0x0a; // new line
>> send(c1);
>> send(c2);
>> send(c3);
>
> danke easylife klappt so!!
>
> nun klappt das aber nur bei sekunden oder wie?
> Bei millisekunden gibt der dann aber z.B. j7 aus..

dicker, dann schreib doch nicht, dein wert ist sekunden zwischen 0 und 
10, sondern milisekunden zwischen 0 und 10000.

versuche mal zu verstehen, was mein code macht.

"sekunden / 10" ergibt die zehnerstelle
"sekunden % 10" ergibt die einerstelle (siehe modulo operator)

wenn du da irgend eine zahl >10 einsetzt, kommt natürlich bullshit raus.

'0' + x
ergibt einen Ascii Code. Günstigerweise liegen die Ziffern direkt 
hintereinander, so dass ('0'+5) das Zeichen '5' ergibt.

hast du sprintf() zur verfügung?
dann gehts so:
1
#include <stdio.h>
2
#include <string.h>
3
4
(...)
5
6
char buf[10];
7
int i;
8
sprintf(buf, "%d\n", msekunden);
9
for (i=0; i<strlen(buf); i++)
10
    send(buf[i]);


falls nicht, dann so:
1
int divider;
2
int digit;
3
4
divider = 10000;
5
for(i=0; i<5; i++) {
6
    digit = msekunden / divider;
7
    send('0'+digit);
8
    msekunden -= digit * divider;
9
    divider /= 10;
10
}

von Herrminator (Gast)


Lesenswert?

ja habe beides, also sekunden und ms


die ausgabe sollte dann so aussehen 6:30 also (sek:ms),

habe jetzt für die ms die version mit digit genommen. und siehe da die 
ausgabe ist jetz 06:00300 aber das reicht mir schon völlig.. richtig 
dickes danke an dieser stelle schonmal an dich!!

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.