Forum: Compiler & IDEs Ich werd aus den Warnungen des Compilers nicht schlau ;-)


von Jürgen FItschen (Gast)


Angehängte Dateien:

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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Jürgen FItschen (Gast)


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

von Karl H. (kbuchegg)


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?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Karl H. (kbuchegg)


Lesenswert?

Danke fuer die Korrektur.

Urspruenglich wollte ich aus dem tmp direkt das
Array machen, hab dann allerdings gemerkt das tmp
im weiteren Code ebenfalls vorkommt. Also die
Array-Aenderung an tmp wieder rueckgängig und dabei
ist der '*' auf der Strecke geblieben :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> strchr(tmp, " ")

Auch flasch.  Auf der rechten Seite muss ein char stehen, kein
char *:

strchr(tmp, ' ')

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.