www.mikrocontroller.net

Forum: PC-Programmierung Verzeigert :)


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich hab grade etwas Schwierigkeiten bei dem folgenden Problem:

Ich will in einer Funktion "strtol" aufrufen, damit der mir aus einem 
String einen Long parst:

CControlView::ParseError CControlView::CheckInput(CString input, char* 
endptr, LONG* value) {
  endptr = 0;
  if(input.GetLength() == 0)
    return PARSE_ERROR_EMPTY;

  *value = strtol(input, &endptr, 10);

  TRACE("PARSE Test: %d, *error:%d\n", *value, *endptr);
  if(*endptr != 0)
    return PARSE_ERROR_NAN;

  if(*value == LONG_MIN || *value == LONG_MAX)
    return PARSE_ERROR_OVERFLOW;

  if(*value < 0)
    return PARSE_ERROR_NEGATIVE;

  return PARSE_ERROR_OK;
}


Jetzt gibt mir strtol ja einen "Zeiger auf einen Zeiger auf einen char" 
zurück der auf das Zeichen zeigt, das nicht numerisch ist.
Warum? Warum erwartet strtol nicht einfach einen Zeiger auf einen char, 
in den es dann das Zeichen schreiben kann?

Und wie kann ich (durch Aufruf von CCOntrolView::CheckInput() dann auf 
dieses fehlerhafte Zeichen zugreifen?

Für meinen "value" ist mir das klar:

char err;
LONG value;
CControlView::ParseError x = CheckInput(m_SNHigh, &err, &value);

Value wird einfach als Referenzparameter übergeben. Aber err?

Und wieso muss es doppelt verzeigert sein? Wie stellt man sich das vor?

Mfg
Jens

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens wrote:

> Warum? Warum erwartet strtol nicht einfach einen Zeiger auf einen char,
> in den es dann das Zeichen schreiben kann?

Wenn du beispielsweise einen String hast, der aus einer Reihe von durch 
Komma getrennter Zahlen besteht, dann kannst du den iterativ mit strtol 
zerlegen.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moment... ich rede von strtoL nicht von strtoK.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens wrote:
> Moment... ich rede von strtoL nicht von strtoK.

Er doch auch! ;)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Warum erwartet strtol nicht einfach einen Zeiger auf einen char, in den > es 
dann das Zeichen schreiben kann?

Meistens will man wissen, wo das Zeichen ist, das zum Abbruch geführt 
hat. Und dazu müßtest du dann den String unnötigerweise nochmal nach 
diesem Zeichen durchsuchen. Strtol gibt dir einfach gleich die Position 
als Zeiger zurück.

> Und wie kann ich (durch Aufruf von CCOntrolView::CheckInput() dann auf
> dieses fehlerhafte Zeichen zugreifen?

Indem du den Zeiger dereferenzierst.

>Für meinen "value" ist mir das klar:
>
> char err;
> LONG value;
> CControlView::ParseError x = CheckInput(m_SNHigh, &err, &value);
>
> Value wird einfach als Referenzparameter übergeben. Aber err?

Ist schon ok so, wenn du nur am Zeichen selbst und nicht an dessen 
Position interessiert bist.

> Und wieso muss es doppelt verzeigert sein?

Weil eben auch der Zeiger als Referenzparameter übergeben wird. Wie soll 
die Funktion da sonst was reinschreiben?

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.