mikrocontroller.net

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


Autor: Jürgen FItschen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen FItschen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> strchr(tmp, " ")

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

strchr(tmp, ' ')

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.