Ich werd aus den Warnungen des Compilers nicht schlau ;-)

Gast #363256
Lesenswert?
• ▲
▼
Guten Abend!

Vor weg: Dies sind meine erste Geh-Versuche mit C - also seid bitte
nachsichtig ;-)

Irgentwie bekomme ich dauerthaft Probleme, die ich mir nicht erklären
kann. Beim Compilieren des angehängten Codes gitb mir der Compiler
folgendes aus:

----------
solarcontrol.c: In function `__vector_13':
solarcontrol.c:72: warning: passing arg 1 of `strcat' discards
qualifiers from p
ointer target type
solarcontrol.c:72: warning: passing arg 2 of `strcat' makes pointer
from integer
 without a cast
solarcontrol.c: In function `main':
solarcontrol.c:96: warning: passing arg 1 of `strchr' discards
qualifiers from p
ointer target type
solarcontrol.c:105: warning: passing arg 1 of `strchr' discards
qualifiers from
pointer target type
----------

Ich hab auch schon fleißig Google gefragt, finde aber keine
funktionierende Lösung. Ehrlich gesagt: ich weiß auch nicht genau, was
das Problem ist

Danke, dass ihr meinen Post gelesen habt und mir vllt. gleich antworten
werdet ;-)
Grüße
Jürgen Fitschen
Angehängte Dateien:
Persönliche Seite #363257
Lesenswert?
• ▲
▼
Erste Warnung:

strcat erwartet keinen "volatile"-Pointer. Macht nix.

Zweite Warnung:

strcat erwartet als zweites Argument einen Pointer auf einen
nullterminierten String; Du übergibst statt dessen einen einzelnen
char.
Das geht in die Hose.

Dritte Warnung:

Auch strchr erwartet keinen "volatile"-Pointer. Macht wohl auch hier
nix.

Vierte Warnung:

Wie dritte Warnung.


Die typecasts bei Deinen strchr-Aufrufen sind unnötig; 3 und 13 sind
bereits vom Typ int.
Gast #363258
Lesenswert?
• ▲
▼
Jo, vielen Dank! klappt ...


So - ich mag ja eigentlich nicht nochmal sonne blöde Frage stellen,
aber ich hab weiter gearbeitet und schon wieder steh ich vor einer
Mauer: nun Versuche ich das über den Usart Empfangende zu prasen:

void tPraser(char cmdLine[])
{
  char *cmd[10];
  char *tmp;
  char i;

  strcpy (tmp, cmdLine);
  while (strchr(tmp, " ")){
    strncpy (tmp, cmd[i], strchr(tmp, " "));
    tmp = strchr(tmp, " ");
    tPrint(cmd[i]); //Ausgabe zum Test
    i++;
  }
  cmd[i]=tmp;

  //tExec();
}

Der Code scheint nicht so zu funktionieren, wie er soll, jedenfalls
bekomm ich keine Rückgabe :-( Ich glaub mal ich hab da was mit den
Zeigern durcheinander gebracht. Eigentlich hab ich das Zeigersystem
soweit verstanden, aber die Beispiele bei Google warn mal so und mal so
... jedenfalls weiß ich nicht genau, ob die Funktionen wirklich die
Daten haben wollen, oder die Adressen, wo die Daten gespeichert sind.

Nochmals Danke,
Jürgen Fitschen
#363259
Lesenswert?
• ▲
▼
> void tPraser(char cmdLine[])
> {
>   char *cmd[10];
>   char *tmp;
>   char i;
>
>   strcpy (tmp, cmdLine);

Autsch.

Du hast ein weit verbreitetes Verstaendnisproblem.
Ein Pointer ist kein String.
Frag Dich doch mal im obigen, wo denn die cmdLine
hinkopiert wird?

Die Antwort lautet: Irgendwohin, zufaellig. Da tmp keinen
gültigen Pointerwert enthält, kann niemand sagen, wohin der
strcpy die Zeichen kopiert.

Was Du brauchst ist eine definierte Speicherfläche, auf der
die Arbeiten kannst. Du brauchst Speicher, um dort Zeichen
zu speichern. Und den musst Du reservieren. Ein Pointer
für sich reserviert aber nichts. Ein Pointer kann auf so
eine Speicherfläche zeigen, mehr aber nicht.

void tPraser(char cmdLine[])
{
  char *cmd[10];
  char tmp;
  char i;
  char Buffer[256];

  tmp = Buffer;
  strcpy (tmp, cmdLine);

So, jetzt zeigt tmp auf einen reservierten Speicherbereich
(naemlich auf den Anfang von Buffer) und erst jetzt kann
der strcpy gezielt irgendwohin (naemlich in Buffer) eine
Kopie von cmdLine erzeugen.

Selbiges mit all den cmd die da in weiterer Folge hast.
cmd ist ein Array von 10 Pointern. Aber wo zeigen die
hin? Wo ist der Speicher in dem tatsaechlich die Character
stehen?
Persönliche Seite #363260
Lesenswert?
• ▲
▼
.

  void tPraser(char cmdLine[])
  {
    char *cmd[10];
    char tmp;
    char i;
    char Buffer[256];

    tmp = Buffer;
    strcpy (tmp, cmdLine);

  So, jetzt zeigt tmp auf einen reservierten Speicherbereich
  (naemlich auf den Anfang von Buffer) und erst jetzt kann
  der strcpy gezielt irgendwohin (naemlich in Buffer) eine
  Kopie von cmdLine erzeugen.

Das stimmt nur dann, wenn aus der Zeile

    char tmp;


wieder die richtige Schreibweise

    char* tmp;

gemacht wird, sonst "zeigt" tmp garnirgendwohin, sondern ist ein
einzelner char.

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