Forum: PC-Programmierung Verzeigert :)


von Jens (Gast)


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

von Andreas K. (a-k)


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.

von Jens (Gast)


Lesenswert?

Moment... ich rede von strtoL nicht von strtoK.

von Simon K. (simon) Benutzerseite


Lesenswert?

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

Er doch auch! ;)

von Rolf Magnus (Gast)


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?

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.