Error C236 (Fehler beim Compilieren)

Gast #3640647
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..
Gast #3640700
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?
Gast #3641027
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...
Gast #3641314
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);
Gast #3641414
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

ఀ:ఀ
Gast #3641451
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.
Gast #3641564
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);
Gast #3641608
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
}
Gast #3641625
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!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren