Forum: Mikrocontroller und Digitale Elektronik Zeichen ind String suchen und auslesen


von Index (Gast)


Lesenswert?

Hallo, ich hoffe ihr könnt mir helfen.
Ich will einen String an meinem Mikrocontroller übergeben.
Nun will ich in diesem String Buchstaben und Zahlen suchen.
Beispiel eines Strings: A1006

Nun scheitere ich aber schon bei der Suche nach dem "A".

Mein C-Code:
1
#include <stdio.h>
2
#include <string.h>
3
4
void main(void)
5
{
6
    unsigned char string[10];     //zB. A1006
7
    printf("Programm gestartet.\n");
8
9
    inputse(string,11);
10
11
    if(strchr(string, 'A'))
12
    {
13
        printf("String enthaelt ein A\n");
14
    }
15
16
17
    while(1);
18
}

Ich bekomme folgende Fehlermeldung ausgegeben:
Error: serikom.s51 120: unresolved reference to '_strchr'

Was mache ich falsch?

Programmiert wird mit dem Jens File Editor.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Aus C-Sicht ist an deinem Code nichts falsch (zumindest nicht an der 
Stelle)

* Das sieht nach einem Installations/Konfigurationsproblem
  deiner Entwicklungsumgebung aus

* möglich wäre auch noch, dass deine Entwicklungsumgebung keinen
  vollständigen Satz an Standardfunktionen mitbringt. Obwohl das
  eigentlich eher unwahrscheinlich ist, da die str Funktion und im
  speziellen strchr ziemlich trivial sind.
  Ist denn in string.h ein Protoyp für strchr enthalten?
  Wenn ja, dann deutet das ebenfalls auf ein Installationsproblem
  hin.

von Rene H. (Gast)


Lesenswert?

Versuchs mal mit
1
#include <strings.h>

statt
1
#include <string.h>

von Rene H. (Gast)


Lesenswert?

Obwohl vergiss es. strchr müsste in string.h drin sein.

Sorry.

von Index (Gast)


Lesenswert?

Das ist das was in der sting.h gefunden habe:
1
// ANSII standard
2
extern int strlen(far char* px);
3
extern int strcmp(far char* pa,far char* pb);
4
extern int memcmp(far char* pa,far char* pb, int n);
5
extern far char* strcpy(far char * pdst, far char * psrc);
6
7
// Non ANSI byte move (Note: src first argument!)
8
extern void bmove(far void * _psrc, far void * _pdest, unsigned int count);
9
10
/* END */

von Rene H. (Gast)


Lesenswert?

Ist das alles? Da steht aber nicht viel drin.

Was für ein Betriebssystem hast Du?

Weil sonst könntest Du mal in Deinem Include Verzeichnis nach strchr 
greppen, wo das drin ist.

von Karl H. (kbuchegg)


Lesenswert?

Index schrieb:
> Das ist das was in der sting.h gefunden habe:
>
>
1
> // ANSII standard
2
> extern int strlen(far char* px);
3
> extern int strcmp(far char* pa,far char* pb);
4
> extern int memcmp(far char* pa,far char* pb, int n);
5
> extern far char* strcpy(far char * pdst, far char * psrc);
6
> 
7
> // Non ANSI byte move (Note: src first argument!)
8
> extern void bmove(far void * _psrc, far void * _pdest, unsigned int
9
> count);
10
> 
11
> /* END */
12
>

kein strchr?

Ausserdem fehlt da noch jede Menge und das far da drinnen macht mich 
nervös.

Ein strchr kann man sich (im Prinzip) auch leicht selber schreiben
1
far char* strchr( far char* pa, char c )
2
{
3
  while( *pa && *pa != c )
4
    pa++;
5
6
  return (*pa == c ) ? pa : 0;
7
}

und da das so trivial ist, wundert es mich, dass der Compilerhersteller 
das nicht gemacht hat.
Wie gesagt: das far macht mich nervös. Da könnte mehr dahinter stecken. 
Probier mal die Selbstbau-Version aus.

von Index (Gast)


Lesenswert?

Wundert mich auch, das da so wenig drin steht.
Ich installier noch mal die etwas neue Version.
Softwarepaket ist von Wickenhäuser Elektrotechnik.

Wenn es dann noch immer nicht drin ist versuche ich die 
Selbstbau-Version.
Danke.

von Index (Gast)


Lesenswert?

Ich nutze Windows 7 HP.

von Index (Gast)


Lesenswert?

Leider funktioniert es nicht.
Nun kommt so ein Fehler:
serikom.c 44: Error: unexpected type 'far char'

Muss ich wohl alles per Hand programmieren :/.

von Karl H. (kbuchegg)


Lesenswert?

Index schrieb:
> Leider funktioniert es nicht.
> Nun kommt so ein Fehler:
> serikom.c 44: Error: unexpected type 'far char'

dann nimm das "far" an allen Stellen raus.
Ich habs nur mit aufgenommen, weil deine Vorlagen in string.h es auch 
haben.
1
char* strchr( char* pa, char c )
2
{
3
  while( *pa && *pa != c )
4
    pa++;
5
6
  return (*pa == c ) ? pa : 0;
7
}

von Index (Gast)


Lesenswert?

Ohne das far läuft es. Danke für die Hilfe Karl heinz.
Code sieht nun so aus:
1
#include <stdio.h>
2
#include <string.h>
3
#include <at89c51cc03.h>
4
5
6
void seri_init(void)
7
{
8
    SCON=0x52;
9
    TMOD|=0x20;
10
    TH1=0xfd;
11
    TR1=1;
12
    TI=1;
13
}
14
15
char* strchr( char* pa, char c )
16
{
17
  while( *pa && *pa != c )
18
    pa++;
19
20
  return (*pa == c ) ? pa : 0;
21
}
22
23
24
25
void main(void)
26
{
27
    unsigned char string[10];     //zB. A1006
28
29
30
    seri_init();
31
32
    printf("Programm gestartet.\n");
33
34
    
35
36
    inputse(string,11);
37
38
    if(strchr(string, 'A'))
39
    {
40
        printf("String enthaelt ein A\n");
41
    }
42
43
44
    while(1);
45
}

von Stefan H. (stefanhennig)


Lesenswert?

Index schrieb:
> Leider funktioniert es nicht.
>
> Nun kommt so ein Fehler:
>
> serikom.c 44: Error: unexpected type 'far char'
>
>
>
> Muss ich wohl alles per Hand programmieren :/.

Nicht unbedingt. Du musst aber unbedingt darüber nachdenken, was Du da 
compilierst und was Du uns da zeigst.
Wenn der Compiler mit far char nix anfangen kann, wieso konnte er dann 
die Header inkludieren, die Du uns gezeigt hast? Bist Du sicher, dass Du 
die Header aus dem richtigen Verzeichnis genommen hast? Bist Du sicher, 
dass der Compiler ins richtige Verzeichnis schaut? Hast Du Deinen 
Workflow korrekt eingerichtet?

Wenn Du das nicht sicher im Griff hast, wirst Du sehr bald noch viel 
mehr Probleme bekommen.

Grüße,
  Stefan

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.